制作ubuntu根文件系统

来源:互联网 发布:ctrl alt 互换 linux 编辑:程序博客网 时间:2024/05/22 01:55

参考文档:

http://blog.csdn.net/mountzf/article/details/51707853

http://developer.t-firefly.com/thread-10963-1-1.html

http://rockchip.wikidot.com/porting-os

折腾了几天,看了不少参考资料,终于把ubuntu根文件系统制作出来了,基本是参考着上面几篇资料完成制作的。然后我结合自己过程写下来,希望不会涉及到侵权问题哈。

本次根文件系统使用的是ubuntu-base-14.04-core-armhf作为基础。在此之前我尝试了ubuntu16的版本,但是mount上去之后,串口上只有内核输出,没有登录信息,系统就卡着。查找了一下原因,网友说是由于登录串口没有配置好,需要在/etc/init目录下添加ttyS0.conf启动。我尝试添加了,然而还是启动不了,结果他们说换个内核版本或者打上相应的补丁就能解决了。如下(我卡住的地方和那位仁兄一样。)




总之ubuntu16版本我试了好多次都没有出现登录信息,只好先放一下,用ubuntu14版本。

以下是制作流程:

1、下载ubuntu14源码

wget http://cdimage.ubuntu.com/ubuntu-core/releases/14.04.1/release/ubuntu-base-14.04-core-armhf.tar.gz

上面的链接不知道还行不行,不行的话自行到ubuntu官网上通过页面下载再传过去吧。


2、解压源码

mkdir ubuntu14

sudo tar -xpf ubuntu-base-14.04-core-armhf.tar.gz -C ubuntu14

注意,一定要用sudo命令。


3、下载qemu-user-static

sudo apt-get install qemu-user-static


4、复制一些必要的文件

首先进入解压后的目录下 cd ubuntu14

sudo cp /usr/bin/qemu-arm-static usr/bin/

拷贝PC主机端的dns配置,因为待会安装程序时要用网络:
sudo cp -b /etc/resolv.conf  etc/resolv.conf

增加软件源:
sudo vi etc/apt/source.list
去掉除以deb-src开头的所有库的注释

5、切换到此根文件系统
为了简化操作,用一个切换根文件系统的脚本ch-mount.sh,点击下载,其内容如下:(此链接来自于牛头版主)
  1. #!/bin/bash  
  2. function mnt() {  
  3.     echo "MOUNTING"  
  4.     sudo mount -t proc /proc ${2}proc  
  5.     sudo mount -t sysfs /sys ${2}sys  
  6.     sudo mount -o bind /dev ${2}dev  
  7.     sudo mount -o bind /dev/pts ${2}dev/pts          
  8.     sudo chroot ${2}  
  9. }  
  10. function umnt(){  
  11.     echo "UNMOUNTING"  
  12.     sudo umount ${2}proc  
  13.     sudo umount ${2}sys  
  14.     sudo umount ${2}dev/pts  
  15.     sudo umount ${2}dev  
  16. }  
  17. if ["$1" == "-m" ] && [ -n "$2" ] ;  
  18. then  
  19.     mnt $1 $2  
  20. elif ["$1" == "-u" ] && [ -n "$2" ];  
  21. then  
  22.     umnt $1 $2  
  23. else  
  24.     echo ""  
  25.     echo "Either 1'st, 2'nd or bothparameters were missing"  
  26.     echo ""  
  27.     echo "1'st parameter can be one ofthese: -m(mount) OR -u(umount)"  
  28.     echo "2'nd parameter is the full pathof rootfs directory(with trailing '/')"  
  29.     echo ""  
  30.     echo "For example: ch-mount -m/media/sdcard/"  
  31.     echo ""  
  32.     echo 1st parameter : ${1}  
  33.     echo 2nd parameter : ${2}  
  34. fi  

将下载好的ch-mount.sh拷贝到ubuntu14所在的目录,注意,不是ubuntu14下。
然后增加其可执行权限。sudo chmod +x ch-mount.sh 
接着执行./ch-mount.sh -m ubuntu14/  
(其实它的用法在内容写的很清楚了。)
执行成功后就能看到此事的用户名发生了变化,切换到root,也就是我们进入到自己下载的ubuntu14这个文件系统下了。
这时候我们就可以装一些工具,例如
apt-get install vim sudo bash-conpletiong 
耐心等它装完吧

6、添加用户和root
由于新手上路,我还以为useradd和adduser是没有区别的,然后随便用的一个,导致我第一次登陆的时候,无法登陆普通用户,只能用root账户登陆。以下是二者的区别。useradd在创建用户时不会在/home下自动创建于用户名同名的用户目录,也不会自动选择shell版本,也没有设置密码,正因为这样,一开始无法登陆,需要用passwd命令修改密码。而adduser在创建目录时,能完成前者的几个功能,用户体验更加友好。
那么我们就使用adduser来创建root和ubuntu这两个账户。

7、退出
exit

8、退出mount
./ch-mount -u ubuntu14/
这样就基本完成了,至于怎么配置网络以及桌面系统之类的,后续完成。现在先用nfs挂载上去看看能不能成功mount上。实验效果如下。

开发板nfs挂接上去后,操作和我们虚拟机用的ubuntu一样,ubuntu根文件制作成功。
后续:制作根文件的镜像
1、dd if=/dev/zero  of=ubuntu.img   bs=1M   count=3000
大概可以这么理解,先给ubuntu.img这个镜像bs*count也就是3000M的空间,如果给小了,后面放不进东西。不要怕给大,后面可以修复减小。

2、格式化镜像文件,并加入linuxroot卷标:
sudo mkfs.ext4 -F -L linuxroot ubuntu.img

3、挂载镜像并往里面拷入修改后的文件系统:
mkdir ubuntu-mount
sudo mount  ubuntu.img ubuntu-mount
sudo cp -rfp ubuntu14/* ubuntu-mount

4、卸载镜像:
sudo umount ubuntu-mount

5、检查并修复ubuntu.img
e2fsck -p -f ubuntu.img

6、减小镜像到实际大小
resize2fs -M ubuntu.img
大功告成,看看此时的ubuntu.img是不是小了,可以烧录了。
(详细操作说明请参考开头的三篇文档)

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>分割线>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

2017.9.19更新——将ubuntu rootfs拷贝到SD卡遇到的问题s.

拷贝步骤:

1、用读卡器把sd卡插入电脑,并且在虚拟机下的/media目录下找到挂载上的sd卡,确认已经挂载上了。

2、执行命令fdisk -l   查看原先sd卡的分区情况。在我的这张sd卡上一共有3个分区。分别是sdb1、sdb2和sdb5.

3、按照我大哥的说法,根文件系统放在第5分区上  也就是sdb5  ,进去一看,果不其然,存放的确实是原先的根文件系统。

4、删除或新建一个分区。比如要对sdb5进行操作,执行指令:fdisk /dev/sdb5   然后进入命令行  ,输入d代表删除这个分区,或者输入n代表新建一个分区。

5、格式化新建的分区。为了省时间,我没有做第4步,而是直接把原来的sdb5格式化了。执行命令 mkfs -t ext4  /dev/sdb5   此处为ext4的格式,按需格式相应的格式。

6、文件系统拷贝到第5分区。我们需要先把sdb5 mount到某个文件夹下,如果发现提示说sdb5正在挂载的话,请先umount  /dev/sdb5 一下。然后  mount  /dev/sdb5  /mnt

7、第6步之后第5分区就挂载到/mnt目录下了,接着 sudo  cp -rp ubuntu/* /mnt   (注意,加上-p参数是为了在拷贝的时候保持rootfs文件的属性不会改变,不然可能启动不了)

8、修改文件 /etc/fstab   原先文件为:


因为我们rootfs 放在第5个分区   所以把/dev/mmcblk0p2改为/dev/mmcblk0p5即可。

9、sd卡插到开发板启动。果不其然,启动不了,真是尴尬。

10、无奈~~~向大哥寻求帮助。他说在uboot界面的命令行  bootm去掉根文件系统地址选项 也就是改为 bootm 80200000 - 81280000  然后save   再次启动。成功啦~~


二、网络配置问题

经过上面的折腾之后,开发板已经能从sd卡启动了,不用去nfs挂载上去了。然而接下来的问题是,没网啊。。。下面开始说明配置。

1、修改/etc/network/interface 这个文件夹。配置成这样:


根据自己的实际情况配置。。也可以配置成动态ip,不过开发板嘛,最好是配置成静态的。

2、在/etc/resov.conf 下 配置成:nameserver   192.168.x.1  (根据你自己情况替换掉x)

3、重启网络 : sudo /etc/init.d/networking restart 

4、然后pingy一下,发现说network is unreachble..(无语)

5、我想会不会是eth0没起来啊,于是乎,执行  sudo ifconfig eth0  up ,结果提示:eth0: ERROR while getting interface flags: No such device(我擦。相当无语)

6、都没有eth0  还起个鬼啊。于是乎,执行  ifconfig -a   一看显示的结果,还真没eth0,取而代之的是can0,怪不得。

7,不过不用怕,招儿有的是。执行:sudo rm /etc/udev/rules.d/70-persistent-net.rules  把原先的文件删了。

8、重启开发板   sudo   reboot   然后ifconfig  发现eth0又回来啦  哈哈哈 。。ping网关和ping百度都没问题。就这么愉快配置好了网络。

原创粉丝点击