Rootfs 的改造
1. 瘦身
Q. 那些檔案可以宰 ?
在 $ROOTFS 目錄下執行
du -sh *
以觀看每個目錄所佔空間。
$ROOTFS/usr/share/man -> 清除 man manual
$ROOTFS/usr/share/doc -> 沒人看的文件
$ROOTFS/usr/share/locale -> 語系設定檔 (翻譯檔),僅留 en_US (+ zh_TW) 即可。
請移除舊版核心模組,並複製新版核心模組至此目錄
$ROOTFS/lib/modules -> 舊核心之驅動程式模組目錄
$ROOTFS/lib/modules/2.6.32-5-versatile -> 移除
$ROOTFS/lib/modules/3.2.30 -> 新增
$ROOTFS/boot -> 舊版核心檔案,請全部清掉
$ROOTFS/var ->
$ROOTFS/var/log -> 日誌檔目錄,可完全清除
$ROOTFS/var/cache/apt 目錄有套件的快取資料,可清除
2. 複製新檔案回去
a. 複製新 Linux 核心模組
(不需要放 Linux 核心,因為其核心檔案放置至 sdcard 之第 1 個分割區)
3. 加入我們想要的設定
a. $ROOTFS/etc/fstab
proc /proc proc defaults 0 0
/dev/mmcblk0p2 / auto errors=remount-ro 0 1
/dev/mmcblk0p1 /boot auto defaults 0 0
b. $ROOTFS/etc/inittab
最後一行加上:
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102
3. 複製至真正的 sdcard 中
請使用 fdisk 分割 sdcard (2 GB 以上),其中第 1 個分割區為 80 MB,剩下為第 2 個分割區。並依以下方式掛載:
/mnt/sdcard1 -> 第 1 個分割區,FAT 16/32 格式,有打開開機旗標。
/mnt/sdcard2 -> 第 2 個分割區,ext3 格式。
a. 複製核心、bootloader 及 uEnv.txt 至 /mnt/sdcard1,裡面內容如下:
-rwxr-xr-x 1 root root 45128 2012-10-30 22:19 MLO
-rwxr-xr-x 1 root root 1215711 2012-10-30 22:19 u-boot
-rwxr-xr-x 1 root root 294672 2012-10-30 22:19 u-boot.bin
-rwxr-xr-x 1 root root 294736 2012-10-30 22:19 u-boot.img
-rwxr-xr-x 1 root root 1 2012-10-30 23:29 uEnv.txt
-rwxr-xr-x 1 root root 2475616 2012-10-30 22:15 uImage
b. 複製 rootfs 至 /mnt/sdcard2,請使用 rsync 來複製
rsync -av $ROOTFS/* /mnt/sdcard2
4. 作完收工,可以至 devkit 8000 開機
2012年11月2日 星期五
minicom 使用說明
先前設定
minicom 是一個序列數據連線程式,可以拿來跟數據機連線,也可以拿來跟我們要使用的 ARM 板連線,要使用 minicom 請安裝 minicom 套件。
apt-get install minicom
當我們將 ARM 板連接線接至 USB 埠時,會出現一個新的裝置叫 /dev/ttyUSBN 的裝置,N 是數字,通常為 0,若連接第 2 次的話會變成 1。我們要將 /dev/ttyUSB0 連結至 /dev/modem:
ln -s /dev/ttyUSB0 /dev/modem
我們可以執行底下指令來確認:
ls -l /dev/ttyUSB0 /dev/modem
lrwxrwxrwx 1 root root 12 2012-11-01 10:44 /dev/modem -> /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 2012-11-01 10:39 /dev/ttyUSB0
請注意 /dev/ttyUSB0 的 owner 為 root,群組為 dialout,因此我們所使用的帳號必須要是 dialout 群組才可以對 ttyUSB0 進行操作。
Q1: 請問我如何查看我是否為 dialout 群組中的成員
A: id
uid=1000(herman) gid=1000(herman) groups=1000(herman),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(bluetooth),111(netdev)
Q2: 若我不是 dialout 群組中之成員,該如何加入 ?
A: 最簡單方式,直接編輯 /etc/group 檔案,將帳號輸入至 dialout 群組之後即可,修改完還必須重新登錄才行。加完後 /etc/group 檔案有關 dialout 群組之資訊如下所示:
dialout:x:20:herman
啟動 minicom
請以「一般使用者」權限執行:
minicom
此時會出現 minicom 畫面,我們要進行一下設定,請按
Ctrl+A o 叫出設定畫面,如以下所示:
===============================================================================
歡迎使用 minicom 2.4
選項: I18n
編譯於 Sep 5 2010, 09:23:03.
Port /dev/modem
按 CTRL-A Z 說明特殊鍵
機 |
+----[設定]----+
| 檔名和路徑 |
| 檔案傳輸協定 |
| 序列埠設定 |
| 數據機和撥接 |
| 螢幕和鍵盤 |
| 儲存設定為 dfl |
| 另存設定為.. |
| 離開本畫面 |
+------------+
CTRL-A Z 說 明 | 115200 8N1 NOR Minicom 2.4 | VT102 離線
===============================================================================
請選擇「序列埠設定」將底下設定改為我們所要的參數:
A - 序 列 設 備 : /dev/modem
F - 硬 體 Flow 控 制 : 否 | | G - 軟 體 Flow 控 制 : 否
修改完設定後,請按 \Enter 回到前一畫面,接著再選
「儲存設定為 dfl」
最後選「離開本畫面」即可準備連線。
minicom 是一個序列數據連線程式,可以拿來跟數據機連線,也可以拿來跟我們要使用的 ARM 板連線,要使用 minicom 請安裝 minicom 套件。
apt-get install minicom
當我們將 ARM 板連接線接至 USB 埠時,會出現一個新的裝置叫 /dev/ttyUSBN 的裝置,N 是數字,通常為 0,若連接第 2 次的話會變成 1。我們要將 /dev/ttyUSB0 連結至 /dev/modem:
ln -s /dev/ttyUSB0 /dev/modem
我們可以執行底下指令來確認:
ls -l /dev/ttyUSB0 /dev/modem
lrwxrwxrwx 1 root root 12 2012-11-01 10:44 /dev/modem -> /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 2012-11-01 10:39 /dev/ttyUSB0
請注意 /dev/ttyUSB0 的 owner 為 root,群組為 dialout,因此我們所使用的帳號必須要是 dialout 群組才可以對 ttyUSB0 進行操作。
Q1: 請問我如何查看我是否為 dialout 群組中的成員
A: id
uid=1000(herman) gid=1000(herman) groups=1000(herman),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(bluetooth),111(netdev)
Q2: 若我不是 dialout 群組中之成員,該如何加入 ?
A: 最簡單方式,直接編輯 /etc/group 檔案,將帳號輸入至 dialout 群組之後即可,修改完還必須重新登錄才行。加完後 /etc/group 檔案有關 dialout 群組之資訊如下所示:
dialout:x:20:herman
啟動 minicom
請以「一般使用者」權限執行:
minicom
此時會出現 minicom 畫面,我們要進行一下設定,請按
Ctrl+A o 叫出設定畫面,如以下所示:
===============================================================================
歡迎使用 minicom 2.4
選項: I18n
編譯於 Sep 5 2010, 09:23:03.
Port /dev/modem
按 CTRL-A Z 說明特殊鍵
機 |
+----[設定]----+
| 檔名和路徑 |
| 檔案傳輸協定 |
| 序列埠設定 |
| 數據機和撥接 |
| 螢幕和鍵盤 |
| 儲存設定為 dfl |
| 另存設定為.. |
| 離開本畫面 |
+------------+
CTRL-A Z 說 明 | 115200 8N1 NOR Minicom 2.4 | VT102 離線
===============================================================================
請選擇「序列埠設定」將底下設定改為我們所要的參數:
A - 序 列 設 備 : /dev/modem
F - 硬 體 Flow 控 制 : 否 | | G - 軟 體 Flow 控 制 : 否
修改完設定後,請按 \Enter 回到前一畫面,接著再選
「儲存設定為 dfl」
最後選「離開本畫面」即可準備連線。
2012年11月1日 星期四
目錄結構說明
視窗作業系統底下的目錄結構:
C:\
D:\
E:\
..
依此類推,其中 \ (backslash 又稱之為反斜線) 是指 C/D/E 最上層目錄。
但是所有的 Unix 最上層目錄為 / (slash 又稱之為斜線) 是指我們的根目錄。
目錄/檔案指令操作說明:
pwd -> 目前目錄
cd <目錄名稱> -> 切換至某個目錄,例如:
cd \Enter -> 切換至家目錄
~ -> 此目錄即為家目錄
cd / -> 切換至 / 目錄
ls -> 觀看目前目錄內容
ls -l -> 觀看目前目錄內容以及屬性,其輸出如下所示:
drwxr-xr-x 2 root root 4096 2012-09-18 10:32 bin
drwxr-xr-x 3 root root 4096 2012-10-08 09:43 boot
drwxr-xr-x 16 root root 3420 2012-10-28 06:47 dev
drwxr-xr-x 149 root root 12288 2012-10-29 04:42 etc
drwxr-xr-x 2 root root 4096 2012-03-28 16:33 hd2
drwxr-xr-x 65 root root 4096 2012-09-11 15:25 home
lrwxrwxrwx 1 root root 35 2011-04-25 10:18 initrd.img -> boot/initrd.img-2.6.32-5-686-bigmem
lrwxrwxrwx 1 root root 28 2011-04-21 19:25 initrd.img.old -> boot/initrd.img-2.6.32-5-686
drwxr-xr-x 14 root root 16384 2012-10-08 09:42 lib
drwx------ 2 root root 16384 2011-04-21 19:21 lost+found
drwxr-xr-x 4 root root 4096 2011-04-21 19:21 media
drwxr-xr-x 2 root root 4096 2010-12-15 05:54 mnt
drwxr-xr-x 11 root root 4096 2011-12-01 14:47 opt
dr-xr-xr-x 138 root root 0 2012-09-10 08:40 proc
drwx------ 33 root root 4096 2012-10-25 17:44 root
drwxr-xr-x 2 root root 4096 2012-10-08 09:42 sbin
drwxr-xr-x 2 root root 4096 2010-07-21 14:55 selinux
drwxr-xr-x 2 root root 4096 2011-04-21 19:22 srv
drwxr-xr-x 12 root root 0 2012-09-10 08:40 sys
drwxrwxrwt 14 root root 4096 2012-10-29 09:21 tmp
drwxr-xr-x 13 root root 4096 2012-04-25 15:56 usr
drwxr-xr-x 14 root root 4096 2011-06-23 19:40 var
lrwxrwxrwx 1 root root 32 2011-04-25 10:18 vmlinuz -> boot/vmlinuz-2.6.32-5-686-bigmem
lrwxrwxrwx 1 root root 25 2011-04-21 19:25 vmlinuz.old -> boot/vmlinuz-2.6.32-5-686
以 /bin 目錄來說,其輸出如下:
drwxr-xr-x 2 root root 4096 2012-09-18 10:32 bin
^^^^^^^^^^
上述標示處即為其屬性,以此例來說,第一個字元為 d 表示為目錄,之後
rwxr-xr-x 表示三種不同的存取權限,
rwxr-xr-x 第一個是 owner (檔案所有人),有可讀、可寫、可執行之權限
^^^
rwxr-xr-x 第二個是 groups (同一群組所有人),有可讀、不可寫、可執行之權限
^^^
rwxr-xr-x 第三個是 others (其它人),有可讀、不可寫、可執行之權限
^^^
另一個例子為 initrd.img 連結檔,其中出如下:
lrwxrwxrwx 1 root root 28 2011-04-21 19:25 initrd.img.old -> boot/initrd.img-2.6.32-5-686
其中第一個字元為 l 表示連結檔 (link file),其意義等同於 Windows 底下的捷徑,
這個檔案連結至 boot/initrd.img-2.6.32-5-686 這個檔案,
其餘屬性請自行參考上述說明。
C:\Programming Files\
C:\Windows
盡信書,不如無書
若資料可以在 cache 中找到,稱之為 hit,若找不到則稱為 miss。
2012年10月29日 星期一
如何使用 Xcircuit
1. 放大/縮小:Z/z
2. 增加格點間隔:Shift + =
減少格點間隔:-
3. 畫線工具:
滑鼠左鍵:增加轉折點
滑鼠右鍵:刪除轉折點
滑鼠中鍵:結束目前所畫線段(確定目前所畫線段)
4. 點選元件:
方法一、在沒有畫圖的情況下將滑鼠遊標移至要點選的圖案上,再按滑鼠中鍵
方法二、在沒有畫圖的情況下將按滑鼠中鍵拖曳出一個方框,方框中的元件皆
會被選取
5. 複製元件:
先點選元件,再按 c 複製元件,接著按滑鼠左鍵貼上元件(蓋印章),
若按滑鼠中鍵則只貼上一次,滑鼠右鍵取消目前行動。
6. 刪除元件:
先點選元件,再按 Del 鍵即可將被點選之元件刪除。
7. 移動元件:
先點選元件,再按滑鼠左鍵拖曳即可移動元件。
8. 再次編輯元件:
先點選元件,再按 e 即可再次編輯元件
9. 移動畫面:
上/下/左/右鍵可以移動畫面
10. 置中畫面:
將滑鼠移到要置中的地方,然後按 p
11. 畫連接點(鼻屎)
方法一、從元件庫裡點選
方法二、按英文句點
2012年10月19日 星期五
uEnv.txt
請參考 Das U-boot 之 manual
http://www.denx.de/wiki/DULG/UBootCmdGroupEnvironment
baudrate=115200
beaglerev=C4
optargs="consoleblank=0"
bootargs=console=ttyO2,115200n8 mpurate=auto buddy=none camera=none vram=12M omapfb.mode=dvi:640x480MR-16@60 omapdss.def_disp=dvi root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs
bootcmd=if mmc rescan ${mmcdev}; then if run userbutton; then setenv bootenv uEnv.txt;else setenv bootenv user.txt;fi;echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;if run loaduimage; then run mmcboot;fi;fi;run nandboot;
bootdelay=3
bootenv=uEnv.txt
bootfile=uImage.beagle
buddy=none
camera=none
console=ttyO2,115200n8
defaultdisplay=dvi
dieid#=51454d5551454d555400000051454d55
dvimode=640x480MR-16@60
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
loadaddr=0x80200000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
loadramdisk=fatload mmc ${mmcdev} ${rdaddr} ramdisk.gz
loaduimage=fatload mmc ${mmcdev}:1 ${loadaddr} /uImage
loaduimagefat=fatload mmc ${mmcdev} ${loadaddr} uImage
mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}
mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${loadaddr}
mmcdev=0
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext3 rootwait
mpurate=auto
nandargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${nandroot} rootfstype=${nandrootfstype}
nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} 280000 400000; bootm ${loadaddr}
nandroot=ubi0:rootfs ubi.mtd=4
nandrootfstype=ubifs
ramargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${ramroot} rootfstype=${ramrootfstype}
ramboot=echo Booting from ramdisk ...; run ramargs; bootm ${loadaddr}
ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=0x81000000,64M
ramrootfstype=ext2
rdaddr=0x81000000
usbtty=cdc_acm
userbutton=if gpio input 173; then run userbutton_xm; else run userbutton_nonxm; fi;
userbutton_nonxm=gpio input 7;
userbutton_xm=gpio input 4;
vram=12M
http://www.denx.de/wiki/DULG/UBootCmdGroupEnvironment
baudrate=115200
beaglerev=C4
optargs="consoleblank=0"
bootargs=console=ttyO2,115200n8 mpurate=auto buddy=none camera=none vram=12M omapfb.mode=dvi:640x480MR-16@60 omapdss.def_disp=dvi root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs
bootcmd=if mmc rescan ${mmcdev}; then if run userbutton; then setenv bootenv uEnv.txt;else setenv bootenv user.txt;fi;echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;if run loaduimage; then run mmcboot;fi;fi;run nandboot;
bootdelay=3
bootenv=uEnv.txt
bootfile=uImage.beagle
buddy=none
camera=none
console=ttyO2,115200n8
defaultdisplay=dvi
dieid#=51454d5551454d555400000051454d55
dvimode=640x480MR-16@60
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
loadaddr=0x80200000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
loadramdisk=fatload mmc ${mmcdev} ${rdaddr} ramdisk.gz
loaduimage=fatload mmc ${mmcdev}:1 ${loadaddr} /uImage
loaduimagefat=fatload mmc ${mmcdev} ${loadaddr} uImage
mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}
mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${loadaddr}
mmcdev=0
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext3 rootwait
mpurate=auto
nandargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${nandroot} rootfstype=${nandrootfstype}
nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} 280000 400000; bootm ${loadaddr}
nandroot=ubi0:rootfs ubi.mtd=4
nandrootfstype=ubifs
ramargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${ramroot} rootfstype=${ramrootfstype}
ramboot=echo Booting from ramdisk ...; run ramargs; bootm ${loadaddr}
ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=0x81000000,64M
ramrootfstype=ext2
rdaddr=0x81000000
usbtty=cdc_acm
userbutton=if gpio input 173; then run userbutton_xm; else run userbutton_nonxm; fi;
userbutton_nonxm=gpio input 7;
userbutton_xm=gpio input 4;
vram=12M
如何自行建立 rootfs (舊版, 2014)
如何自行建立 rootfs
0. 請確定你已經有使用 qemu arm 版建立起來的 arm.img
1. 備份 arm.img -> arm2.img
cp arm.img arm2.img
2. 將 arm.img 掛載至 /mnt 目錄,請先確定兩個魔術數字:2048 512
mount -o loop,offset=`expr 2048 \* 512` arm.img /mnt -t ext3
ext4
此時 /mnt 目錄下的檔案即為我們要截取的 rootfs,但是我們要先修改一下。
3. 清除檔案:
a. /mnt/lib/modules/* -> 此目錄中為舊版 Linux 核心模組,我們已自行編譯
linux-3.4.X 核心,因此我們應該清掉舊版核心模組,改放新版核心模組。
b. /mnt/boot -> 舊版 Linux 核心,我們可以清掉。
c. /mnt/dev/.udev -> 清除不必要的 udev 檔案
4. 設定檔案:
a. /mnt/lib/modules/ -> 放回 linux-3.4.X 之模組檔案。
cp -a DIR/modules/lib/modules/* /mnt/lib/modules
^^^^^^^^^^^^^^^^^^^^^^^^^
b. /mnt/etc/fstab 請改成以下內容:
/dev/mmcblk0p2 / ext3 errors=remount-ro 0 1
/dev/mmcblk0p1 /boot vfat defaults 0 0
c. 接著請編輯 /mnt/etc/inittab 檔案,修改最後一行成為底下內容:
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102
d. 檢查 /mnt/etc/network/interfaces 檔案,看其內容是否如下:
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
5. 將 rootfs 截取成為 rootfs.tar.xz 以便 deploy (部屬至虛擬 sdcard.img)
/mnt# tar cfva /root/rootfs.tar.xz .
6. 解除掛載 arm.img
當我們將 rootfs 截取出來後,/mnt 目錄即不再需要使用,此時可以解除掛載,請執行
底下指令:
umount /mnt
7. 將 sdcard.img 掛載至 /mnt/sdcard1 /mnt/sdcard2 目錄
8. 複製 bootloader、Linux 核心及 uEnv.txt 至 /mnt/sdcard1,其檔案如下:
-rwxr-xr-x 1 root root 45444 2012-10-08 00:28 MLO
-rwxr-xr-x 1 root root 1370958 2012-10-08 00:29 u-boot
-rwxr-xr-x 1 root root 344872 2012-10-08 00:29 u-boot.bin
-rwxr-xr-x 1 root root 344936 2012-10-08 00:29 u-boot.img
-rwxr-xr-x 1 root root 2400 2012-10-08 00:29 uEnv.txt
-rwxr-xr-x 1 root root 2475288 2012-10-08 00:29 uImage
9. 將 rootfs.tar.xz deploy 至 /mnt/sdcard2 目錄
tar xfva rootfs.tar.xz -C /mnt/sdcard2
10. 將 sdcard.img 解除掛載
11. 執行 qemu
qemu-system-arm -M beagle -m 512 -sd ./sdcard.img -clock unix -serial stdio \
-device usb-mouse -device usb-kbd
如何確保開機正常!!
1. 核心編譯時要加入正確參數,特別是:
ext2 ext3 ext4 vfat 均要加入編譯選項,而且要為 <*>
<M> -> 模組,核心載入後才有作用
<*> -> 內建至核心中,無需載入即有作用
2. uEnv.txt 中的 uenvcmd 要設定正確,特別是要加上
run mmcargs;fatload mmc 0:1 0x8000000 uImage; bootm 0x8000000
3. 將新編之核心、uEnv.txt、MLO、u-boot.* 等檔案放入 sdcard 的第一個分割區
將修改過之 rootfs 放入 sdcard 的第二個分割區
4. 第一個分割區一定要設定 boot 旗標
0. 請確定你已經有使用 qemu arm 版建立起來的 arm.img
1. 備份 arm.img -> arm2.img
cp arm.img arm2.img
2. 將 arm.img 掛載至 /mnt 目錄,請先確定兩個魔術數字:2048 512
mount -o loop,offset=`expr 2048 \* 512` arm.img /mnt -t ext3
ext4
此時 /mnt 目錄下的檔案即為我們要截取的 rootfs,但是我們要先修改一下。
3. 清除檔案:
a. /mnt/lib/modules/* -> 此目錄中為舊版 Linux 核心模組,我們已自行編譯
linux-3.4.X 核心,因此我們應該清掉舊版核心模組,改放新版核心模組。
b. /mnt/boot -> 舊版 Linux 核心,我們可以清掉。
c. /mnt/dev/.udev -> 清除不必要的 udev 檔案
4. 設定檔案:
a. /mnt/lib/modules/ -> 放回 linux-3.4.X 之模組檔案。
cp -a DIR/modules/lib/modules/* /mnt/lib/modules
^^^^^^^^^^^^^^^^^^^^^^^^^
b. /mnt/etc/fstab 請改成以下內容:
/dev/mmcblk0p2 / ext3 errors=remount-ro 0 1
/dev/mmcblk0p1 /boot vfat defaults 0 0
c. 接著請編輯 /mnt/etc/inittab 檔案,修改最後一行成為底下內容:
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102
d. 檢查 /mnt/etc/network/interfaces 檔案,看其內容是否如下:
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
5. 將 rootfs 截取成為 rootfs.tar.xz 以便 deploy (部屬至虛擬 sdcard.img)
/mnt# tar cfva /root/rootfs.tar.xz .
6. 解除掛載 arm.img
當我們將 rootfs 截取出來後,/mnt 目錄即不再需要使用,此時可以解除掛載,請執行
底下指令:
umount /mnt
7. 將 sdcard.img 掛載至 /mnt/sdcard1 /mnt/sdcard2 目錄
8. 複製 bootloader、Linux 核心及 uEnv.txt 至 /mnt/sdcard1,其檔案如下:
-rwxr-xr-x 1 root root 45444 2012-10-08 00:28 MLO
-rwxr-xr-x 1 root root 1370958 2012-10-08 00:29 u-boot
-rwxr-xr-x 1 root root 344872 2012-10-08 00:29 u-boot.bin
-rwxr-xr-x 1 root root 344936 2012-10-08 00:29 u-boot.img
-rwxr-xr-x 1 root root 2400 2012-10-08 00:29 uEnv.txt
-rwxr-xr-x 1 root root 2475288 2012-10-08 00:29 uImage
9. 將 rootfs.tar.xz deploy 至 /mnt/sdcard2 目錄
tar xfva rootfs.tar.xz -C /mnt/sdcard2
10. 將 sdcard.img 解除掛載
11. 執行 qemu
qemu-system-arm -M beagle -m 512 -sd ./sdcard.img -clock unix -serial stdio \
-device usb-mouse -device usb-kbd
如何確保開機正常!!
1. 核心編譯時要加入正確參數,特別是:
ext2 ext3 ext4 vfat 均要加入編譯選項,而且要為 <*>
<M> -> 模組,核心載入後才有作用
<*> -> 內建至核心中,無需載入即有作用
2. uEnv.txt 中的 uenvcmd 要設定正確,特別是要加上
run mmcargs;fatload mmc 0:1 0x8000000 uImage; bootm 0x8000000
3. 將新編之核心、uEnv.txt、MLO、u-boot.* 等檔案放入 sdcard 的第一個分割區
將修改過之 rootfs 放入 sdcard 的第二個分割區
4. 第一個分割區一定要設定 boot 旗標
2012年10月17日 星期三
如何建立虛擬 SD card
#2020/04/20 改版
如何建立虛擬 SD card
0. 目標:建立一個 sdcard.img,將其分割為二個分割區
part1: 80 M
part2: 920 M
並將第一個分割區以 vfat 方式格式化,第二個分割區以 ext4 方式格式化,而且兩個分割區都要能掛載。
1. 使用 dd 指令建立 1G 之 sdcard.img
dd if=/dev/zero of=sdcard.img bs=1M count=1024
作完後之輸出如下所示:
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 17.8515 s, 60.1 MB/s
我們可以使用 file 及 hexdump 這兩個指令來檢視 sdcard.img,其操作如下:
file sdcard.img
其輸出為:
# fdisk -lu /dev/loop0
Disk /dev/loop0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa5e072a5
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 2048 165887 163840 80M b W95 FAT32
/dev/loop0p2 165888 2097151 1931264 943M 83 Linux
4.1 格式化與掛載
我們統一將第 1 個分割區格式化為 fat 格式,第 2 個分割區格式化為 ext4 格式以便 u-boot 載入系統核心並掛載 rootfs。在格式化前我們需注意每一個分割區的 sector 數目,例如第 1 個分割區的 Sectors 為 163840,而第 2 個分割區則為 1931264。這兩個數字將分別應用在格式化上,但是在格式化前,我們要將第 1 個分割區連接至 /dev/loop1,第 2 個分割區連接至 /dev/loop2,請執行底下指令連接 /dev/loop1:
losetup -o `expr 2048 \* 512` /dev/loop1 /dev/loop0
接著再執行底下指令連接 /dev/loop2:
losetup -o `expr 165888 \* 512` /dev/loop2 /dev/loop0
上述指令都有使用到 expr 這個命令,expr 可以拿來作簡單的四則運算,例如:
expr 1 + 1 其輸出為 2
expr 2 - 1 其輸出為 1
但若要進行乘法的話必須使用 \* 而非 *,因為 * 是特殊字元。
expr 2 * 3 -> expr: 格式錯誤
expr 2 \* 3 -> 6
至於除法範例如下:
expr 6 / 2 -> 2
expr 6 / 4 -> 1 (沒有餘數)
`expr a \* b` 表示「傳回」 a * b 之值。
當我們要連接 /dev/loop1 (第 1 個分割區) 及 /dev/loop2 (第 2 個分割區)時,必須跳過相對應的 offset,這個 offset 就由 expr 來替我們作運算。當 /dev/loop1 及 /dev/loop2 都連接上時,我們可以執行:
losetup -a
此時會出現底下輸出,告訴我們 /dev/loop1 及 /dev/loop2 都完成連接。
/dev/loop0: [0805]:2540233 (/home/herman/qemu_image/arm/sdcard.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 32256
/dev/loop2: [0005]:1312 (/dev/loop0), offset 90478080
接著我們即可真正對 /dev/loop1 及 /dev/loop2 進行格式化:
mkfs.msdos -s 2 /dev/loop1 81920
mkfs.ext4 /dev/loop2 965632 -> 此指令不用,以免 u-boot 無法掛載
mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop2 -> 改用這個指令來分割虛擬 sdcard
格式化完畢後我們可以進行掛載以便待會複製檔案,我們統一掛載至
/mnt/sdcard1 及 /mnt/sdcard2 目錄。
Q: 若以上兩個目錄不存在,該如何建立 ?
mkdir -p /mnt/sdcard1 /mnt/sdcard2
建好目錄後可以進行掛載,指令如下:
mount /dev/loop1 /mnt/sdcard1
mount /dev/loop2 /mnt/sdcard2
我們可以執行 df -h 來檢查是否有正確掛載,其輸出如下:
檔案系統 Size Used Avail Use% 掛載點
/dev/loop1 87M 0 87M 0% /mnt/sdcard1
/dev/loop2 919M 18M 855M 2% /mnt/sdcard2
接下來,我們可以針對虛擬 SDCARD 開始複製檔案以便使用 Qemu 開機模擬。
4.2 解掛
4.2.1 解掛目錄
# umount /mnt/sdcard1 /mnt/sdcard2
4.2.2 解掛 loop,注意:順序要跟掛 loop 反過來作。
# losetup -d /dev/loop2
# losetup -d /dev/loop1
# losetup -d /dev/loop0
檢查是否完全解開:
# losetup -a
5. 植入 bootloader、kernel 以及 rootfs
5.1 bootloader 所需檔案
MLO
u-boot
u-boot.bin
u-boot.img
uEnv.txt -> 開機設定檔
5.2 kernel 所需檔案
uImage
請將上述檔案複製至 /mnt/sdcard1 目錄
5.3 如何建立 rootfs
Q: 請問什麼是 rootfs ?
a. 最簡單的作法:將 qemu 中的 rootfs 拿來改,但是要記得瘦身。
b. 另一個簡單的作法:拿現成的來用,網路上有一位高手叫 Robert Nelson,
他所提供的下載網址在:
http://rcn-ee.net/deb/minfs/
目前最新的下載檔案是:
http://rcn-ee.net/deb/minfs/wheezy/debian-7.7-minimal-armel-2014-11-10.tar.xz
c. 修改 rootfs
要將 rootfs 植入 /mnt/sdcard2 中請完成底下工作:
c.1 將 rootfs 存入 /mnt/sdcard2
c.2 將核心模組存入 /mnt/sdcard2/lib/modules 目錄
c.3 修改設定檔,修改內容如下:
c.3.a 將 /etc/inittab 存入 /mnt/sdcard2/etc 中,並將最後一行改為
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102
c.3.b 將 /mnt/sdcard2/etc/fstab 修改如下:
proc /proc proc defaults 0 0
/dev/mmcblk0p2 / auto errors=remount-ro 0 1
/dev/mmcblk0p1 /boot auto defaults 0 0
c.3.c 將 /mnt/sdcard2/etc/network/interfaces 修改如下:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
c.3.d 將 /etc/sdcard2/etc/hostname 修改如下:
leenix
c.3.e 將 /etc/resolv.conf 修改如下:
nameserver 8.8.8.8
6. 當所有檔案完成複製後,我們必須將 sdcard.img 解除掛載及解除連接,請執行以下指令:
umount /mnt/sdcard1 /mnt/sdcard2 -> 先解除目錄掛載
losetup -d /dev/loop2 -> 再依順序解除 loop 連接,請依後進先出的原則來解除
losetup -d /dev/loop1
losetup -d /dev/loop0 -> 至此全部解除連接,我們可以執行
losetup -a 來確認。
7. 測試虛擬 sdcard.img
當我們都完成檔案複製後,我們可以使用 qemu 來測試所完成之虛擬 sdcard.img,測試指令如下:
qemu-system-arm -M beagle -m 512 -nographic -sd ./test.img -clock unix \
-device usb-mouse -device usb-kbd \
-usb -device usb-net,netdev=mynet -netdev user,id=mynet
如何建立虛擬 SD card
0. 目標:建立一個 sdcard.img,將其分割為二個分割區
part1: 80 M
part2: 920 M
並將第一個分割區以 vfat 方式格式化,第二個分割區以 ext4 方式格式化,而且兩個分割區都要能掛載。
1. 使用 dd 指令建立 1G 之 sdcard.img
dd if=/dev/zero of=sdcard.img bs=1M count=1024
作完後之輸出如下所示:
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 17.8515 s, 60.1 MB/s
我們可以使用 file 及 hexdump 這兩個指令來檢視 sdcard.img,其操作如下:
file sdcard.img
其輸出為:
sdcard.img: data
hexdump sdcard.img
其輸出為:
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
40000000
以上輸出表示此檔案之內容為 00 (也就是 ASCII 表中之 Null 字元),其位址從 0x0000000 一直至 0x40000000 也就是 1G。
到此為止,我們已完成一個空的 sdcard.img。接著我們要使用 losetup 來連接此檔案至 /dev/loop0 裝置以便進行分割及格式化。
2. 使用 losetup 指令
要使用 losetup 指令,請先切換至 root 權限,我們先看目前是否有 /dev/loop 裝置,其指令如下所示:
# losetup -a
理論上目前沒有任何輸出。接著請執行底下指令將 /dev/loop0 與 sdcard.img 「連接」在一起。
# losetup /dev/loop0 sdcard.img
此時我們即將 sdcard.img 「連接」至 /dev/loop0 這個裝置。
3. 使用 fdisk 分割 /dev/loop0
將第一個分割區切成 80 MB
將第二個分割區切成剩下空間 (920 MB)
作完後將分割區狀況存入並退出 fdisk,我們可以執行底下指令來觀看 /dev/loop0 狀態。
fdisk -lu /dev/loop0
其輸出如下所示:
# fdisk -lu /dev/loop0
Disk /dev/loop0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa5e072a5
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 2048 165887 163840 80M b W95 FAT32
/dev/loop0p2 165888 2097151 1931264 943M 83 Linux
在存分割表 (w 指令)時如果出現底下訊息要將 /dev/loop0 與 sdcard.img 分離,再重新連接才可以繼續往下作。
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 22: 不適用的引數.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 22: 不適用的引數.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
** 使用 losetup 將 /dev/loop0 與 sdcard.img 分離 **
# losetup -d /dev/loop0
我們可以執行 losetup -a 來看是否已解除連接。若要重新連接請執行以下指令:
# losetup /dev/loop0 sdcard.img
連接完可以執行
fdisk -lu /dev/loop0
來觀察其輸出是否如上所示。
# losetup /dev/loop0 sdcard.img
連接完可以執行
fdisk -lu /dev/loop0
來觀察其輸出是否如上所示。
4. 格式化/掛載/解掛/解除連結
4.1 格式化與掛載
我們統一將第 1 個分割區格式化為 fat 格式,第 2 個分割區格式化為 ext4 格式以便 u-boot 載入系統核心並掛載 rootfs。在格式化前我們需注意每一個分割區的 sector 數目,例如第 1 個分割區的 Sectors 為 163840,而第 2 個分割區則為 1931264。這兩個數字將分別應用在格式化上,但是在格式化前,我們要將第 1 個分割區連接至 /dev/loop1,第 2 個分割區連接至 /dev/loop2,請執行底下指令連接 /dev/loop1:
losetup -o `expr 2048 \* 512` /dev/loop1 /dev/loop0
接著再執行底下指令連接 /dev/loop2:
losetup -o `expr 165888 \* 512` /dev/loop2 /dev/loop0
上述指令都有使用到 expr 這個命令,expr 可以拿來作簡單的四則運算,例如:
expr 1 + 1 其輸出為 2
expr 2 - 1 其輸出為 1
但若要進行乘法的話必須使用 \* 而非 *,因為 * 是特殊字元。
expr 2 * 3 -> expr: 格式錯誤
expr 2 \* 3 -> 6
至於除法範例如下:
expr 6 / 2 -> 2
expr 6 / 4 -> 1 (沒有餘數)
`expr a \* b` 表示「傳回」 a * b 之值。
當我們要連接 /dev/loop1 (第 1 個分割區) 及 /dev/loop2 (第 2 個分割區)時,必須跳過相對應的 offset,這個 offset 就由 expr 來替我們作運算。當 /dev/loop1 及 /dev/loop2 都連接上時,我們可以執行:
losetup -a
此時會出現底下輸出,告訴我們 /dev/loop1 及 /dev/loop2 都完成連接。
/dev/loop0: [0805]:2540233 (/home/herman/qemu_image/arm/sdcard.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 32256
/dev/loop2: [0005]:1312 (/dev/loop0), offset 90478080
接著我們即可真正對 /dev/loop1 及 /dev/loop2 進行格式化:
mkfs.msdos -s 2 /dev/loop1 81920
mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop2 -> 改用這個指令來分割虛擬 sdcard
格式化完畢後我們可以進行掛載以便待會複製檔案,我們統一掛載至
/mnt/sdcard1 及 /mnt/sdcard2 目錄。
Q: 若以上兩個目錄不存在,該如何建立 ?
mkdir -p /mnt/sdcard1 /mnt/sdcard2
建好目錄後可以進行掛載,指令如下:
mount /dev/loop1 /mnt/sdcard1
mount /dev/loop2 /mnt/sdcard2
我們可以執行 df -h 來檢查是否有正確掛載,其輸出如下:
檔案系統 Size Used Avail Use% 掛載點
/dev/loop1 87M 0 87M 0% /mnt/sdcard1
/dev/loop2 919M 18M 855M 2% /mnt/sdcard2
接下來,我們可以針對虛擬 SDCARD 開始複製檔案以便使用 Qemu 開機模擬。
4.2 解掛
4.2.1 解掛目錄
# umount /mnt/sdcard1 /mnt/sdcard2
4.2.2 解掛 loop,注意:順序要跟掛 loop 反過來作。
# losetup -d /dev/loop2
# losetup -d /dev/loop1
# losetup -d /dev/loop0
檢查是否完全解開:
# losetup -a
5. 植入 bootloader、kernel 以及 rootfs
5.1 bootloader 所需檔案
MLO
u-boot
u-boot.bin
u-boot.img
uEnv.txt -> 開機設定檔
5.2 kernel 所需檔案
uImage
請將上述檔案複製至 /mnt/sdcard1 目錄
5.3 如何建立 rootfs
Q: 請問什麼是 rootfs ?
a. 最簡單的作法:將 qemu 中的 rootfs 拿來改,但是要記得瘦身。
b. 另一個簡單的作法:拿現成的來用,網路上有一位高手叫 Robert Nelson,
他所提供的下載網址在:
http://rcn-ee.net/deb/minfs/
目前最新的下載檔案是:
http://rcn-ee.net/deb/minfs/wheezy/debian-7.7-minimal-armel-2014-11-10.tar.xz
c. 修改 rootfs
要將 rootfs 植入 /mnt/sdcard2 中請完成底下工作:
c.1 將 rootfs 存入 /mnt/sdcard2
c.2 將核心模組存入 /mnt/sdcard2/lib/modules 目錄
c.3 修改設定檔,修改內容如下:
c.3.a 將 /etc/inittab 存入 /mnt/sdcard2/etc 中,並將最後一行改為
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102
c.3.b 將 /mnt/sdcard2/etc/fstab 修改如下:
proc /proc proc defaults 0 0
/dev/mmcblk0p2 / auto errors=remount-ro 0 1
/dev/mmcblk0p1 /boot auto defaults 0 0
c.3.c 將 /mnt/sdcard2/etc/network/interfaces 修改如下:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
c.3.d 將 /etc/sdcard2/etc/hostname 修改如下:
leenix
c.3.e 將 /etc/resolv.conf 修改如下:
nameserver 8.8.8.8
6. 當所有檔案完成複製後,我們必須將 sdcard.img 解除掛載及解除連接,請執行以下指令:
umount /mnt/sdcard1 /mnt/sdcard2 -> 先解除目錄掛載
losetup -d /dev/loop2 -> 再依順序解除 loop 連接,請依後進先出的原則來解除
losetup -d /dev/loop1
losetup -d /dev/loop0 -> 至此全部解除連接,我們可以執行
losetup -a 來確認。
7. 測試虛擬 sdcard.img
當我們都完成檔案複製後,我們可以使用 qemu 來測試所完成之虛擬 sdcard.img,測試指令如下:
qemu-system-arm -M beagle -m 512 -nographic -sd ./test.img -clock unix \
-device usb-mouse -device usb-kbd \
-usb -device usb-net,netdev=mynet -netdev user,id=mynet
訂閱:
文章 (Atom)