製作Linux USB live開機隨身碟

天殺的OS作業: 製作Linux USB

live開機隨身碟這個作業,是要將Linux的Kernel塞到USB裡面Live開機,因為實在太麻煩了,我不得不記錄步驟,否則連我自己都會忘記

使用VirtualBox模擬Debian來編譯Linux kernel

我一直不知道Linux要怎樣編譯,想說在Windows下編出來的是.exe,不是很奇怪嗎? 應該不可能,看了一些文件後才知道是用Linux來編Linux

老樣子,特地灌一個Linux OS然後用它來編譯Linux kernel,那我的其它事情就不用做了,當然還是使用Virtual Box最方便,我使用VirtualBox之前灌好的Debian,來進行編譯Linux kernel的工作

話說編譯核心的教學還真不少,可是很多都已經過時,不然就是好像不盡相同的感覺,最後我按照

http://www.cyberciti.biz/tips/compiling-linux-kernel-26.html

步驟進行

下載Kernel 花了我不少時間,接著解壓縮,真不愧是一個OS,光解壓縮就解了好久,還真不少檔案,光是解壓縮也是很麻煩的事,我老是記不是tar後面要接什麼鬼參數,每次都要上網查

缺了重要的角色 : gcc

接著,要compile發現沒有gcc,我以為那麼常用,一開始就有安裝好,但是不幸的是Debian並沒有一開始就安裝gcc,因此開始安裝gcc的艱難旅途

首先使用apt-get install gcc指令想安裝gcc可是卻失敗,它顯示我沒有權限,改用sudo apt-get install gcc 它又說 “victor is not in the sudoers file”,原來我還得用visudo去把我的帳號加進sudoer file才給我用sudo指,但是看起來很麻煩就放棄了,還好後來後來發現可以用su進入root

使用這些東西時永遠都有驚喜

當我用su root成功執行apt-get install gcc之後… 它居然要我插入Debian的CD,歐! shit! 從我開始想compile Linux的kernel以來每一個步驟都有驚喜,我不明白為什麼apt-get不是從網路下載gcc而是要我插入光碟

後來想想,算了,它要插就給它插個爽吧,反正是模擬出來的 ISO送進去就好,終於,耶~ gcc裝好了 終於到了開始compile的時候

事情永遠沒有你想的這麼簡單

make指令一下… 出現一堆錯誤 它居然說stderr未定義,這就表示c的函式庫根本沒有被安裝 囧

http://www.wretch.cc/blog/griffey/8316907

此時發現了救星 原來c的函式庫還要另外安裝,要安裝build-essential才有c的函式庫~ 老天阿 鬼知道要裝這個,囧,make能跑天已經黑一半了!

開始make

我試了各種xxxconfig,都失敗,它們似乎都要另外裝一堆東西才能執行,最後我發現make menuconfig需要裝ncurses就可以執行,於是就裝了ncurses,我完全沒有興趣知道那是什麼鬼東西

終於,make menuconfig完成了,妖獸! 好多選項 我也不知道我要怎樣的linux 就隨便吧,預設值先跑跑看,後來感謝doomleika說要勾ext2後來才能boot,我就勾了ext2重編了一次

以下是我make的指令:

make menuconfig
make bzImage
make modules
make modules_install

接著還需要initrd.img,好像是載入驅動用的影像檔,使用mkinitrd來產生那個影像檔,mkinitrd也要另外安裝,原本我沒有執行make modules_install就去跑mkintrd,mkinitrd某個特定版本時就說找不到那些版本的東西,因此該版本的modules要install完成才能正確地執行mkinitrd

apt-get install initrd-tools
mkinitrd -o initrd.img 2.6.22.2

格式化USB

還好VirtualBox提供了將USB裝置虛擬到OS的功能,所以我在虛擬OS裡就可以格式化USB,還有執行grub等等的動作

首先用fdisk指令將USB清掉,接著用mkfm.ext2格式話成ext2的檔案格式,然後,用指令

grub-install –no-floppy –root-directory=/mnt /dev/sda

將grub裝到usb中,接著建立一個檔案放在/boost/grub/menu.lst,內容為

default 0
timeout 10

title Victor’s USB Live Linux
root (hd0,0)
kernel /boot/linux.img-2.6.22.2
initrd /boot/initrd.img-2.6.22.2

接著用

grub>

device (hd0) /dev/sda
root (hd0,0)
setup (hd0)
quit

將grub燒入到USB的MBR中

在這之中我一直弄錯,問題出在全部用/dev/sda來下指令,包括mkfs.ext2之類的,沒注意到/dev/sda1後面要加一才是磁區1,因為一直破壞到檔案系統,接下來的步驟當然也全部都失敗

找不到/dev/console

找不到/dev/console

終於! 成功地開機,載入了linux,但在開機的過程中說找不到/dev/console,搞了半天,原來還要建一些設備

http://tw.msnusers.com/Linuxstepbystep/floppy.msnw

參考這裡,接著開機的錯誤只剩找不到/sbin/init,似乎是開機完會執行那個玩意兒

好像busybox就有那樣的東西,因此我就來編譯busybox,可是編譯失敗,它說沒有inotify_init,我也不知道為什麼,最後用make menuconfig把它diable掉就編譯成功了

把busybox接著把_install下的所有東西copy到USB上

cp -r * /mnt

接著再開機試試

qemu /dev/sda

很神奇對吧,qemu也是一款模擬器,所以這就是模擬器中的模擬器!

終於! 可以開機了…但是它不停跟我抱怨找不到tty2, tty3…

看來好像是tty之前建的不夠,tty到底是什麼鬼我也不知道= = 他想要就給他吧

參照

http://www.faqs.org/docs/pocket_linux/x1252.html

http://www.xs4all.nl/~lennartb/rescuedisk/node7.html

一口氣建好其它tty給他,最後! 吃飽喝足的Linux終於成功地開機起來了

終於!成功的開機到Busybox的Shell

終於!成功的開機到Busybox的Shell

執行ls的畫面

執行ls的畫面

Windows的VirtualBox模擬出來的Debian中的Linux,模擬器中的模擬器,有趣吧!

Windows模擬的Linux模擬的Linux

Windows模擬的Linux模擬的Linux

結論

從頭到尾,我不知道查了多少文件,半夜弄到了幾點,其中每個步驟都有驚喜,每個步驟都不是你想像中的那樣簡單,查文件次數/步驟 應該到了一個驚人的數字,WTF Per Minutes更是不用說已經破表了,我只能說

陽壽不足,請勿在家嘗試,Victor關心您

網路上能找到的文章,大多不是已經過時,不然就缺掉很多重要的步驟,不然就是用的工具或手法不大相同,大多數都是將ISO或是現成的Live CD或USB工具塞到USB中的教學,要從頭到尾由Kernel編譯起來到塞到USB中,會嘔出幾兩血是正常的,總結以上的心得,有幾大步驟

  1. 準備編譯環境
  2. 編譯核心以及模組,並且放置到boot中
  3. 格式化
  4. 設置boot loader,寫入MBR
  5. 建置資料夾、以及設備,以及放置核心影像檔
  6. 安裝BusyBox等工具

事實上每個大步驟都可以拆成一篇文章來講,還有很多東西事實上我還是搞不懂它在幹麻的,像tty到底是什麼鬼設備我現在還是搞不清楚,不過,至少開機成功了,有閒的話,我重新製作一次,然後把每個大步驟獨立成一篇文章來講好了:P

This entry was posted in Linux, 中文文章, 分享 and tagged , , . Bookmark the permalink.

4 Responses to 製作Linux USB live開機隨身碟

  1. 日落 says:

    還是 BSD 比較簡單
    make buildworld
    make buildkernel
    make installkernel
    make installworld
    reboot
    Done !

  2. jacky says:

    你應該是沒設定 source.list,所以才沒去網路上下載 packages
    Debian 算是很好上手的 distribution 了,不過還是要稍微設定一下就是了

  3. Simon Su says:

    好東西跟您分享:http://www.pendrivelinux.com/
    上面有好多live CD/USB的實作文章 😀

  4. JonesLai says:

    其實有個很懶的方法可以做出來….
    tty就是console terminal….
    路過