2014年11月25日 星期二

建立 Rootfs


一、先準備 arm.img 檔

0. 位置目錄(一般 User 權限)

cd ~/qemu_img

1. 參考 建立一個 arm.img 來建立 arm.img。


2. 做一個最原始檔案的備份

cp arm.img arm_OK.img

3. 將 QEMU 開機

參考 用 QEMU 來開機 arm.img 第 6 步驟
sh runarm.sh

二、第一階段 Rootfs 瘦身

0. 位置

用 QEMU 開啟 arm.img ,登入 Root ,在 QEMU 內瘦身。

1. ATP 更新、清除

apt-get update
apt-get clean
rm -rf /var/lib/apt/lists/*
rm -rf /var/cache/apt/pkgcache.bin
rm -rf /var/cache/apt/srcpkgcache.bin

2. 已安裝套件 (依需求選擇)

視窗環境、瀏灠器等,看有沒有需求,
也可以選擇移除還是留著:
apt-get remove xorg iceweasel

3. 關機 QEMU


三、第二階段 Rootfs 瘦身

0. 位置 (一般 user)

cd ~/qemu_img

1. 做備份紀錄

這邊備份的檔名,以今天日期 arm_1125.img 來做備份。
qemu-img -O raw arm.img arm_1125.img

2. 掛載 arm.img

可以參考 建立虛擬 SD Card 的 loset、mount 步驟,
下面是用較快速的方法來掛載,概念一樣 (要做 offset )。
mount -o loop, offset=`expr 512 \* 2048` arm.img /mnt

3. 建立裝 Rootfs 的資料夾

mkdir ~/qemu_img/rootfs

4. 複製 (ROOT)

將 arm.img 內的檔案複製到 rootfs
rsync -av /mnt/* ~/qemu_img/rootfs/

5. 開始檔案瘦身,刪除不必要的檔案(ROOT)

切記,此步驟在 root 權限下,要非常小心,
注意目錄位置,不要刪錯檔案了!

下面幾個,可以直接刪除:
rm -rf ~/qemu_img/rootfs/root/.cache
rm -rf ~/qemu_img/rootfs/root/.mozilla
rm -rf ~/qemu_img/rootfs/usr/share/man/*
rm -rf ~/qemu_img/rootfs/usr/share/doc/*
rm -rf ~/qemu_img/rootfs/boot/*
rm -rf ~/qemu_img/rootfs/dev/.udev
rm -rf ~/qemu_img/rootfs/var/log/*

這邊有兩個資料夾,要刪除語系資料,
只留我們需要的:

~/qemu_img/rootfs/usr/share/locale/
我們留 en_US、zh_TW,其它殺掉,
可以使用 rm 或 mc 指令來留、刪。

~/qemu_img/rootfs/usr/share/i18n/locale/
這邊留 C、POSIX、en_US、zh_TW,其它殺掉,
一樣可以使用 rm 或 mc 指令來留、刪。

接下來是核心 modules ,一樣刪除,接著
參考文章 編譯 ARM Linux 核心,第七步驟,
把我們做好的模組複製進來該目錄:
rm -rf ~/qemu_img/rootfs/lib/modules/3.2.0-4-versatib
rsync -av ~/qemu_img/kernel/modules/lib/3.4.100 ~/qemu_img/rootfs/lib/modules/

全部瘦身完後,可以在目錄下,
用指令來查看各個目錄中容量較大的東西有哪幾項:
du -sh * | grep M

~/qemu_img/rootfs 目錄,輸出如下:
5.9M  bin
4.7M  boot
4.4M etc
42M lib
5.1M sbin
354M  usr
37M  var

~/qemu_img/rootfs/usr 目錄,輸出如下:
36M bin
192M lib
4.3M sbin
122M share

6. 卸載 arm.img

先看一下 /mnt 有沒有在使用中,卸載需要離開該目錄。
lsof /mnt

卸載
umount /mnt

解除連接(注意順序 大 -> 小)
losetup -a
losetup -d /dev/loop1
losetup -d /dev/loop0
losetup -a

四、設定 Rootfs

1. ~/qemu_img/rootfs/etc/fstab

改成我們需要的設定:
proc            /proc        proc    defaults           0   0
/dev/mmcblk0p2   /           auto   errors=remount-ro   0   1
/dev/mmcblk0p1   /boot       auto   defaults            0   0

2. ~/qemu_img/rootfs/etc/inittab

最後一行加上:
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102

3. ~/qemu_img/rootfs/etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp

4. ~/qemu_img/rootfs/etc/resolv.conf

nameserver 8.8.8.8

5. ~/qemu_img/rootfs/etc/hostname

隨便自訂 (例如 leenix)

五、放到 sdcard.img 中

參考 建立虛擬 SD Card 的掛載方式,
將 Rootfs 放至到 sdcard.img 第二分割區。

sdcard1 -> 第 1 個分割區,FAT 16/32 格式,有打開開機旗標,
內含檔案:
-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

sdcard2 -> 第 2 個分割區,ext4 格式,內含 rootfs 的檔案。





Reference:
http://pominglee.blogspot.tw/2012/10/rootfs.html

http://pominglee.blogspot.tw/2012/11/rootfs.html

沒有留言:

張貼留言