close

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 不需要跟我的一樣.

當然看到下圖時你就成功的開進去囉.

busybox-shell.jpeg

在這個 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.

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 kezeodsnx 的頭像
    kezeodsnx

    心的距離

    kezeodsnx 發表在 痞客邦 留言(2) 人氣()