Linux 做於一片軟碟上 來源:石頭閒語

建立 root filesystem image

root filesystem 就是我們在登入 linux 後,所看到的檔案系統, 我們平時使用的工具,就放在其中。

如果我們光只是啟動了 Linux ,卻沒有 root filesystem , 那什麼事都無法做。 就好像電腦中安裝了 Win95/98 ,卻不小心把 C:\Windows 給刪除了一樣。

1.選擇一個設備空間

選擇一個設備的空間,並將此空間格式化,以做為 root filesystem 。

(1) ramdisk

建立 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

(2) loopback device: loopback image 檔

有些人是用舊機器跑 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

(3) 硬碟

這個方法不太建議使用... 在硬碟上分一個 partition ,格式化後 mount 上去,做為 root filesystem 的空間。

除非硬碟上剛好有一個 partition 沒在用,否則不需要這麼做。

總結來說,有三個步驟:

2.選擇要放入 root filesystem 的檔案

這個部份就看你自已的了,總之,在 root filesystem 中, 通常需要有下列的目錄:

bin/
dev/
proc/
tmp/
var/
lib/
etc/
mnt/
sbin/ -> bin/

目錄下要有哪些檔案,很多,我不列舉,有些是必要的, 有些是選擇性的,自已憑經驗看著辦...

在複製的檔案時,最好用 cp -dpR 來複製,這樣才可以完 整地將檔案屬性複製過去(特別是那些設備檔及符號連結檔)。

這些檔案複製好後,我們就完成 root filesystem 的內容了。

3.建立 root filesystem 的 image

接下來,我們要將這整個 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 時,就可以壓得比較小。

建立啟動磁片

前面的都是準備工作,接下來才是建立啟動磁片。

1.準備一塊空白磁片

格式化後, mount 上去(我 mount 在 /mnt/bootdisk 上)。

$ mkfs.minix -c /dev/fd0
$ mount /dev/fd0 /mnt/bootdisk

2.建立 boot filesystem

啟動時期的會用的檔案,這跟 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 中。

3.寫入開機資訊到磁片中

將開機資訊,寫入磁片的啟動磁區中,這樣 BIOS 才能載入 kernel 。

$ lilo -v -r /mnt/bootdisk -C /lilo.conf

注意,是 /lilo.conf ,而不是 /mnt/bootdisk/lilo.conf ,因為已經 指定將 /mnt/bootdisk 視為 root 了。

到此為止,就完成了一塊可以開機並使用工具的 Linux 磁片了。

後記

這篇內容,只是我一時興起,當初我在取得 Embedix Linux 後, 因為它的大小很小,覺得很有趣, 就想試著將它給塞入一塊磁片中,看能不能用, 這個試驗的結果,就是本文了。

小恐龍工作坊 提供