AD

Creating a bootable usb device(ramdisk)

.introduction

        如果各位有在學習作業系統的, 應該會對live cd或者live usb這個詞不陌生, 在使用電腦上, 很多時候我們只是想試用一下系統, 而不想安裝老半天才能開機來用, 又或者想把系統帶著, 不管到哪台機器上都能執行系統, 這種時候就可以使用live cd/usb, 在機器上放入live cd/usb, 透過cd/usb來啟動系統.

        Linux有些版本的官方安裝光碟就內含live cd功能, 可以讓使用者不安裝就直接開機試用, 相當的便利, live cd/usb的製作, 市面上有很多現成的工具, 不過如果想自己從無到有建立要怎麼做呢, 本文對linux下建立live usb的流程做說明.


.requirements

        要完成一個linux的live usb, 需要的硬體與工具如下.

Hardware
  1. Persional Cmputer(for development and can boot from USB)
  2. USB Flash Disk

Software
  1. Linux (root permission)
  2. Boot loader (LILO, syslinux, etc..)
  3. Filesystem and disk tools (fdisk, mkfs.ext2, etc..)
  4. Compile tools(gcc make, etc...)
.step by step  

1.Make a Bootable USB Flash Disk

        首先,要先讓usb flash disk可以當開機裝置, 步驟如下.

  •  製作磁碟分割
        製作磁碟分割使用工具程式fdisk, 在fdisk前要記得先卸載此usb flash disk.
卸載usb flash disk, sdx名稱以及要卸載幾個依個人情形而定
#umount /dev/sdb1 
#fdisk /dev/sdb

        使用fdisk處理分割表
fdisk
a   切換可開機的旗標
b   編輯 bsd 磁碟標籤
c   切換 DOS 相容性旗標
d   刪除分割區
l   列出已知分割區類型
m   印出這個選單
n   加入新的分割區
o   建立新的空白 DOS 分割表
p   印出分割表
q   離開而不需儲存變更
s   建立新的空白 Sun 磁碟標籤
t   變更分割區系統識別號
u   變更顯示/輸入單位
v   驗證分割表
w   分割表寫入磁碟然後離開
x   額外功能 (專家限用)

Partition Information

Delete all partition


Make a primary partition

Change the system to W95 Win32

Make partition bootable

Write Result

        最後, 讓linux更新分割表
#partprobe

  • 製作檔案系統

        usb flash disk檔案系統建立為fat32
#mkfs.vfat -F 32 /dev/sdb1

        到這一步為止, usb flash disk已經具備開機的功能, 接下來開始處理檔案系統的內容部分.


2.Creating a Linux Filesystem

  • Filesystem Content
        建立linux檔案系統內容的方式很多, 可以從現成的檔案系統內容去做瘦身, 也可以抓一個最簡單的檔案系統內容, 這邊以後者為例.

        要製作一個最簡單的檔案系統內容, 可以使用工具debootstarp透過網路下載來自動建立一個最基本的debian檔案系統內容,以下是相關步驟與資訊.

debootstarp教學網址:
        http://wiki.debian.org/Debootstrap

        建立基本檔案系統資料在dabian-squeeze資料夾內
#mkdir dabian-squeeze
#debootstrap squeeze ./debian-squeeze 

        當建立完基本檔案系統後, 如果沒有特殊考量的話(註1), 此時可以利用chroot進入修改或者安裝需要的軟體, 以下舉例.
把檔案系統切換到./debian-squeeze
#chroot ./debian-squeeze

設定root密碼
#passwd

新增使用者
#useradd ......

安裝需要的工具
#apt-get ....

跳出
#exit

        註1.如果是需要編譯的軟體或函式庫,由於產品本身大多不需要具有編譯程式的能力, 不管是瘦身面或系統穩定面來看, 這些都應該在外部編譯,輸出路徑設定在此檔案系統中會比較佳(在嵌入式系統開發上常見).

       
  • Filesystem file
        到這一步為止, 檔案系統的內容已經準備好了, 在下一步是建立一個檔案系統檔案, 把這些內容複製過去, 流程並不複雜, 以下列出做法, 下面以fs簡稱檔案系統.

  1. 建立fs檔案
  2. 放入fs內容資料
  3. 壓縮fs檔案
        建立fs檔案
#touch ramfs

注意, 512000要記住, 後面會用到
#mkfs.ext2 ramfs 512000

        放入fs內容資料
建立掛載用的node, 名字隨便
#mkdir /media/mmm

注意要以loop device來掛載
#mount -o loop /media/mmm

#cp -a debian-squeeze/* /media/mmm
#umount /media/mmm

        壓縮fs檔案
看個人考量, -9壓很大, 開機在loading的時候會比較慢
#gzip -9 rmfs


        接下來把完成的檔案系統檔案放入usb flash device中.
Image.gz可以名字隨便定, 之後會建立設定檔指定fs檔案
#cp ramfs.gz /media/xxxx/Image.gz


3.Kernel

  • Build linux kernel
        檔案系統完成後, 接下來要處理kernel的部分, 此部分依照個人需求, 有可能工程浩大, 本篇只取最基本的來做,流程步驟如下.

  1. linux source code
  2. build linux kernel

linux source code

        在kernel的建置上, 通常會先依造個人需求去對linux原始碼作修改, 在這邊此部分就略掉, 單就linux source的取得做說明, 以下利用apt-get取得, 也可以自己上網路直接抓.
#apt-get install linux-source-2.6.32


build linux kernel

        在建置linux kernel時, 有幾個要注意的設定要勾選, 以下做說明
#tar xjf /usr/src/linux-source-2.6.32.tar.bz2
#cd /usr/src/linux-source-2.6.32

注意.menuconfig裡有幾個選項要勾, 以下做說明
#make menuconfig

        以下列出menuconfig需要設定的項目
General setup  ---> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
                    [*]   Support initial ramdisks compressed using gzip 

Device Drivers  ---> <*>   RAM block device support

註.ext2 fs格式支援
File systems  ---> <*> Second extended fs support

        設定完menuconfig後, 即可下make指令建置linux kernel, 當然, 需要的函式庫以及工具要預先裝好才能成功建置, 建置完成的kernel檔案會在arch的目標平台資料夾下, 把他放到usb flash disk中即可.
#make

xxxx依個人的usb裝置而定, 名稱不一
#cp ./arch/x86/boot/bzImage /media/xxxx/linux-kernel


4.booting

  • bootloader(syslinux)
        剛剛幾部已經把fs檔案以及kernel都準備好了, 接下來要來處理開機的bootloader, 安裝bootloader linux, 並在usb flash disk裡建立設定檔syslinux.cfg作設定即可.

        安裝syslinux(bootloader)
#syslinux --stupid --force /dev/sdb1

        複製mbr檔案到usb flash disk
#dd if=/usr/lib/syslinux/mbr.bin of=/dev/sdb


        syslinux.cfg內容, 指定用kernel檔案, 使用ram0開機, 以及ramdisk(size為之前建立的fs檔案壓縮前的大小), 指定fs檔案
TIMEOUT  20
DEFAULT  linux

LABEL  linux
KERNEL  linux-kernel
APPEND  root=/dev/ram0  ramdisk_size=512000 initrd=Image.gz

        註. 可以設定的不只這些, 詳細可查詢網路

  • Boot linux
     
        最後, 把usb flash disk插上pc, 設定開機裝置為usb, 就可以開機進入linux中了.


Load Image.gz(filesystem), 依照fs大小會load一段時間
 


成功開機進入linux, 另外, 切記帳號密碼要記住, 還真的差點忘記






沒有留言:

張貼留言