Linux軟砲楊小斯再度發表新作,整篇拿起來抄,感覺良好。不過連段落title都跟本人的一模一樣,也算是一報還一報。
<前言>
有時呢 系統掛了 要使用 live-cd 又會覺的要開很久 可是有時僅僅只是希望做一些簡單的事 這時我們就可以使用 busybox 來幫我們做一些簡單的事情.
以下所示範是在 ubuntu based 的 distribution.
<實作>
首先在console 下先搜尋 busybox-static 的套件. ( sudo apt-cache search busybox-static )
busybox-static - Standalone rescue shell with tons of builtin utilities
二話不說馬上把它裝起來 ( sudo apt-get install busybox-static )
如此就完成了第一步
接下來我們必需要建立幾個需要的目錄
mkdir busybox-prepare
並在這個目錄下在建出 proc, sys, dev, bin, sbin, etc, lib
為什麼會知道是這幾個目錄呢? 其實跟據 FHS 的文件 其實是有定義的 可以參考 FHS 不過我在此也簡易的描述一下 因為在開機過程中首先被掛載的一定是 / (root), 所以與開機相關的檔案一定不可以跟 / 分開.
舉個例好了,比如我們經常使用的 /home 和 一般安裝的 app 通都是裝到 usr (unix software resource) 這個 folder 裡面. 這兩個對系統而言是可以存在不同的分割區的, 因為開機即始沒有它也不會有啥影響的.
或許有人會困惑為什麼 /boot 沒有在此出現 不是存放著 kernel 和 ramdisk 嗎?
其實 /boot這一層的東西是由grub/grub2幫我們處理掉的 因為 grub有能力去處理 filesystem 的檔案 所以 是不一定要跟 / 處在同一個分割區的.
哈好像扯遠了....
接下來 我們把剛剛裝下來的 busybox-static 的 binary 檔案 從 /bin/busybox 貼到 busybox-prepare/bin/busybox
並建出兩個連結
ln -s bin/busybox busybox-prepare/init
ln -s bin/busybox busybox-prepare/bin/sh
除此之外還要新增一個 etc/inittab 因為我們是用 busybox init 所以 default 會讀取這個檔案
cat > busybox-prepare/etc/inittab <<EOF
console::sysinit:-/etc/init.d/rcS
EOF
chmod 755 busybox-prepare/etc/inittab
把所有你想要做的動作都寫在 rcS 這個檔案 就可以囉
cat > busybox-prepare/etc/init.d/rcS <<EOF
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
/bin/sh
EOF
sudo mknod busybox-prepare/dev/concolse c 5 1
到此一個簡易的 busybox 的環境就完成囉!
我們將這個 directory 打包成 gzip 壓縮的 cpio format
到 busybox-prepare這一層目錄 find . | cpio -H newc -o | gzip -9 >../initrd.gz
然後我們可以藉由 qemu 來實驗這個 initrd.gz
sudo qemu -kernel /boot/vmlinuz-2.6.27-11-generic -initrd ../initrd.gz -hda /dev/null
當然 這個 kernel 你可以替換成你桌機的 kernel 不需要跟我的一樣.
當然看到下圖時你就成功的開進去囉.
在這個 shell 中,可以觀察到 sysfs 和 proc 都有被成功的 mount 起來 based on the /etc/inittab 所指定的 rcS
不過看到此時不禁會有一個困惑 為什麼console 會抱怨 啥 job control turned off 這是啥??
其實 這是因為 /dev/console 並不 support 為 control terminal 做法就是要把它改成 tty1 這一類的 terminal 才不會有這樣的問題. 你可以在剛剛的 console 做一個簡單的實驗 while true; do dmesg -c; done
這時不管你怎麼壓 Ctrl+C 就是無法跳出,這樣的確是有一點麻煩的啦...
所以我們可以這樣修改
mknod busybox-prepare/dev/tty1 c 4 1
mknod busybox-prepare/dev/tty5 c 4 5 ( 因為 default 的 busybox shell 會將 log 寫在 tty5, 在剛剛的圖片可以很明確的看出有吐出這樣的訊息 )
再將
console::sysinit:-/etc/init.d/rcS -> tty1::sysinit:-/etc/init.d/rcS
這樣就沒問題了.
不過你也可以參考官網的說明 busybox-job control.
留言列表