| Linux 做於一片軟碟上 來源:石頭閒語 |
|---|
root filesystem 就是我們在登入 linux 後,所看到的檔案系統, 我們平時使用的工具,就放在其中。
如果我們光只是啟動了 Linux ,卻沒有 root filesystem , 那什麼事都無法做。 就好像電腦中安裝了 Win95/98 ,卻不小心把 C:\Windows 給刪除了一樣。
選擇一個設備的空間,並將此空間格式化,以做為 root filesystem 。
建立 ramdisk 空間的方式,是用 dd 指令,填入指定大小的內容後, 就會在 ram 中保留該大小的空間;而這個 ram 空間,就連接到 dd 指 令中,所指定的設備名稱,如 /dev/ram0 。
$ dd if=/dev/zero of=/dev/ram0 bs=1k count=4096
上面這指令的意義是,從輸入設備 /dev/zero 中,以 bs 指定的大小(1k), 讀取資料,輸出到設備 /dev/ram0 中,重覆輸出入 count 指定的次 數(4096次)。這表示 /dev/ram0 所連接的 ram 空間,會有 4096K 的空間可用。
/dev/zero 是一個特殊的設備,從這個設備中,讀取的內容,全都是 0 。
ramdisk 可以建立的很大,但我們只是要找一個空間,供我們製作 root disk ,因為一塊軟碟片的空間不會很大,所以我們也不需要 挖一塊很大的 ram 空間,大概 4096k 就夠了。
雖然一塊 MF-2HD 的磁片,只有 1440K ,但因為我們是要將 root filesystem 的內容,變成 image 檔,再壓縮過一次後,才放入磁片裡, 所以這塊要做為 root filesystem 的空間,可以大於 1440K 。
格式化這塊 ram 空間,因為 minix 檔案系統格式比較省空間,所以 用這格式:
$ mkfs.minix /dev/ram0 4096
最後 mount 此空間 (我 mount 在 /mnt/rootfs 目錄上),準備複製檔案:
$ mount -t minix /dev/ram0 /mnt/rootfs
有些人是用舊機器跑 linux , ram 可能只有 16~32mb ,用 ramdisk 就不太方便,這時仍可以利用 loopback 設備。 作法是將一個檔案,當作 loopback 設備 mount 起來。
$ dd if=/dev/zero of=/tmp/rootfs-file bs=1k count=4096
上面的指令,會在 /tmp 建立一個叫 rootfs-file 的檔案,大小 是 4096KB 。 意義跟上面 ramdisk 一樣,只是一個把空間建立在 ram 中,另一個 建立在 disk 中。
格式化:
$ mkfs.minix /tmp/rootfs-file 4096
把這個檔案 mount 上去:
$ mount -o loop -t minix /tmp/rootfs-file /mnt/rootfs
這個方法不太建議使用... 在硬碟上分一個 partition ,格式化後 mount 上去,做為 root filesystem 的空間。
除非硬碟上剛好有一個 partition 沒在用,否則不需要這麼做。
總結來說,有三個步驟:
這個部份就看你自已的了,總之,在 root filesystem 中, 通常需要有下列的目錄:
bin/ dev/ proc/ tmp/ var/ lib/ etc/ mnt/ sbin/ -> bin/
目錄下要有哪些檔案,很多,我不列舉,有些是必要的, 有些是選擇性的,自已憑經驗看著辦...
在複製的檔案時,最好用 cp -dpR 來複製,這樣才可以完 整地將檔案屬性複製過去(特別是那些設備檔及符號連結檔)。
這些檔案複製好後,我們就完成 root filesystem 的內容了。
接下來,我們要將這整個 root filesystem 的內容,變成一 個 image (檔案),並且加以壓縮。
最好先 umount :
$ umount /mnt/rootfs
接著將該空間的內容給 dump 出來,變成一個 image 檔, 並壓縮,我用一個動作完成:
$ dd if=DEVICE bs=1k count=??? | gzip -9 > /tmp/rootfs.gz
DEVICE 是你選擇的設備,在本文中,如 /dev/ram0, /tmp/rootfs-file ; ??? 的大小,是你建立這空間時所指定的,本文中,都是用 4096 。
此時,請先檢視這個壓縮過的 image ,如果大小 (還要加上 kernel 所 佔的空間) 超過一張磁片的容量,那不能用。 請重新檢視你的 root filesystem 的檔案清單,剔除不要的內容, 再重複本章的三個動作: 建立空間、複製檔案、產生 image。
之所以要再重新建立空間,是為了清除空間中的舊有資料, 全部設為 0 ,這樣在製作 image 時,就可以壓得比較小。
前面的都是準備工作,接下來才是建立啟動磁片。
格式化後, mount 上去(我 mount 在 /mnt/bootdisk 上)。
$ mkfs.minix -c /dev/fd0
$ mount /dev/fd0 /mnt/bootdisk
啟動時期的會用的檔案,這跟 root filesystem 不一樣... 啟動時期需要的檔案不多,清單如下:
================================ drwxr-xr-x boot/ -rw-r--r-- bootmessage drwxr-xr-x dev/ -rw-r--r-- lilo.conf -rw-r--r-- rootfs.gz drwxr-xr-x tmp/ boot/ -rw-r--r-- boot.b -rw-r--r-- chain.b -rw------- map -rw-r--r-- vmlinuz dev/ brw-r----- fd0 brw-r----- hda brw-r----- hda1 crw-r--r-- null brw-r----- ram0 ================================
請留意這份清單的檔案,其所需的空間不能超過一張磁片 的大小,特別是 vmlinuz 及 rootfs.gz 。
rootfs.gz 就是本文之前所建立的 root filesystem 的 image 。
vmlinuz 則是要啟動的 kernel ,可以用安裝時預設的 kernel , 也可以自已編譯一個。 有些 distrubition 的光碟中,會附上數種事先編譯好的 kernel , 也可以拿來用。
至於 lilo.conf 的內容,則如下述:
============================ boot=/dev/fd0 install=/boot/boot.b map=/boot/map backup=/dev/null compact vga=normal timeout=60 message=bootmessage prompt #ramdisk=4096 image=/boot/vmlinuz label=LINUX root=/dev/ram0 read-write initrd=rootdsk.gz image=/boot/vmlinuz label=mount root=/dev/fd0 read-only other=/dev/hda1 label=DOS table=/dev/hda ============================
第一個 label 是以磁片上的 roofs.gz 的內容,作為 root filesystem ; 第二個 label 則是用來 mount 硬碟上的指定的 partition 做為 root filesystem ; 第三個 label ,則是啟動 DOS/Win9x 。
準備好 boot filesystem 的檔案清單後,就可以動手將 檔案複製到軟碟上去了,一樣用 cp -dpR 複製。 本文中,就是複製到 /mnt/bootdisk 中。
將開機資訊,寫入磁片的啟動磁區中,這樣 BIOS 才能載入 kernel 。
$ lilo -v -r /mnt/bootdisk -C /lilo.conf
注意,是 /lilo.conf ,而不是 /mnt/bootdisk/lilo.conf ,因為已經 指定將 /mnt/bootdisk 視為 root 了。
到此為止,就完成了一塊可以開機並使用工具的 Linux 磁片了。
這篇內容,只是我一時興起,當初我在取得 Embedix Linux 後, 因為它的大小很小,覺得很有趣, 就想試著將它給塞入一塊磁片中,看能不能用, 這個試驗的結果,就是本文了。
| 小恐龍工作坊 提供 |
|---|