1. 程式人生 > >製作ubuntu根檔案系統

製作ubuntu根檔案系統

參考文件:

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原始碼

上面的連結不知道還行不行,不行的話自行到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百度都沒問題。就這麼愉快配置好了網路。