作者 主題: USB Flash disk Linux 心得  (閱讀 44762 次)

0 會員 與 1 訪客 正在閱讀本文。

id4fox

  • 憂鬱的高中生
  • ***
  • 文章數: 103
  • 40 oz 挑戰成功!
    • 檢視個人資料
USB Flash disk Linux 心得
« 於: 2010-08-13 11:18 »
我試著做了個 USB Flash disk Linux,把一些心得寫下來,
因為是第一次做,所以可能有觀念錯誤的地方,希望各位學長姐不另賜教  Thx  :D
(好文感謝!謝謝thyme先輩!     http://phorum.study-area.org/index.php/topic,42847.0.html)
(文中用了很多"你",不好意思,這是種自言字與的表達方式  哈)

---------------------------------------------------------------------------------------------------------
Element: syslinux + kernel(2.6.15) + initrd.img + busybox(1.17.1) + gcc(3.4.6)
環境:gcc(3.4.6)、Ubuntu(9.04)
硬體:USB 讀卡機  mini SD 4GB

[ syslinux ]
這是一個給FAT(16/32)的 Bootloader(因此隨身碟必須格式化為FAT),
Syslinux Wiki:http://syslinux.zytor.com/wiki/index.php/The_Syslinux_Project
可以下載,裡面提供一些軟體幫助你做bootloader安裝的動作,我用的就是"syslinux"指令,
Ubuntu 9.04 似乎有預設安裝他,所以我就直接用了。
指令:syslinux /dev/sdb1
sdb1 是我的讀卡機。注意,在執行該指令時必須先umount!
當指令完成時再掛載,你會發現硬碟內多了個 "ldlinux.sys" 這就完成了。
syslinux 需要一個設定檔來作bootloader控制以及建立選單,檔名叫 "syslinux.cfg"
這要手寫,我的內容如下
-------------------------------------------------------

TIMEOUT  20
DEFAULT  linux

LABEL  linux
  KERNEL bzImage
  APPEND root=/dev/ram0 initrd=initrd.img

-------------------------------------------------------

TIMEOUT:選單等候時間
DEFAULT:預設哪一個啟動選項
LABEL:建立一個啟動選項名稱為 "linux"(例),其後的縮排就是該選項的設定
   KERNEL:核心檔案路徑
   APPEND:bootloader 控制指令,這裡指的是
                       將根目錄掛載至 /dev/ram0 上,也就是以ram disk的方式呈現
                       如此一來每次啟動所做的更動都會在關機時消失。
                       initrd=initrd.img 指的是 initrd的檔案名稱。

[ busybox 1.17.1 ]
2010.08.12,這是當時載到最新的穩定版,相合的核心是 2.6.15,
這引發了很多相容問題。編時 gcc 使用 3.4.6 版本。
指令:
$make
$make CONFIG_PREFIX=(安裝路徑) install
                        --> 用這個動作把 busybox 丟入要做成 initrd.img 的資料夾。

[ gcc 3.4.6 ]
原本 Ubuntu 9.04 提供的 gcc 是 4.4.1,但是跟 busybox 1.17.1 較合的來的是
核心 2.6.15,而這個版本需要還沒越過 4.x 的 gcc,所以我載了 3.4.6 來編。
指令:
$make “CFLAGS=-U_FORTIFY_SOURCE”
                             -> 因為我是用 4.4.1 來編 3.4.6,3.4.6 原始碼少了 4.4.1 需要的元素,
                                 用這個FLAGS來略過。
$make install      --> 安裝。這也會使你的 "gcc" 指令預設指到 版本 3.4.6

[ kernel 2.6.15 ]
原本打算用最新版本 2.6.35 的,但是為了 busybox 相容些,而改用 2.6.15。
編時 gcc 使用 3.4.6 版本。
指令:
$make clean                              -> 好習慣要從小養成
$make defconfig                       -> 以預設執建立 .config
$make menuconfig                   -> 將 Device Driver 下的 USB 全部囊括起來!
                                                         (好吧,我承認這很粗魯~)
$make all                                    -> 編核心、映像檔、模組。(Time to bed)
                                                         這時你應該要在 (kernel source path)/arch/(cpu type)/boot
                                                         下看到 bzImage。
$make modules_install             -> 將模組安裝至 /lib/modules/(kernel version)
                                                         這樣在建立 initrd.img 時才可以正確的打包module。

[ initrd.img ]
我直接使用 Ubuntu 9.04 提供的 mkinitramfs 建立我所要的 initrd.img,
指令:
$mkinitramfs -o (完成檔案路徑) (核心版本)
ex: $mkinitramfs  -o  ./initrd.img  2.6.15

完成的 initrd.img 是一個 gz 檔,裡面還包一層 cpio 包裝,而syslinux似乎只買這種帳?

拆解指令:
$mv  ./initrd.img  ./initrd.img.gz        -> 附檔名不改成 .gz ,gunzip 是不會買帳的
$gunzip  ./initrd.img.gz
$cpio  -idv  <  ./initrd.img               -> cpio 的指令方式跟一般不一樣,有點不習慣

會發現 該資料夾已經把 initrd.img 內的東西都掏出來了。
這時就可以開始修改裡面的內容,包含丟入 busybox 元件。因為我這次掛載的是 /dev/ram0,
所以大小似乎是受限的 (測試時 < 80 MB 是OK的),所以也別太貪心。

打包指令:
$find  .  |  cpio  -o  -H newc  |  gzip  >  ./initrd.img
如果一切順利,這個新生成的 initrd.img 就是我們要的東西了。

最後的最後,把bzImage、initrd.img 丟進 SD 卡內,完成!

SD卡內應該有:
    bzImage
    initrd.img
    ldlinux.sys
    syslinux.cfg
---------------------------------------------------------------------------------------------------------
« 上次編輯: 2010-10-18 21:57 由 id4fox »

殺手先生

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #1 於: 2010-10-18 20:57 »
請問一下BusyBox 1.17.7去哪抓的啊?
官網好像也才放到1.17.3

id4fox

  • 憂鬱的高中生
  • ***
  • 文章數: 103
  • 40 oz 挑戰成功!
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #2 於: 2010-10-18 21:58 »
請問一下BusyBox 1.17.7去哪抓的啊?
官網好像也才放到1.17.3
Orz 很抱歉,這是我寫錯了
應該是 1.17.1 才對,謝謝 殺手先生 的指正

殺手先生

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #3 於: 2010-10-19 11:16 »

會發現 該資料夾已經把 initrd.img 內的東西都掏出來了。
這時就可以開始修改裡面的內容,包含丟入 busybox 元件。因為我這次掛載的是 /dev/ram0,
所以大小似乎是受限的 (測試時 < 80 MB 是OK的),所以也別太貪心。

不好意思~關於這一段我想要請教一下
請問您丟了什麼東西進去?怎麼丟進去的?(下什麼指令?)
因為我在懷疑是不是我這裡做錯了一直沒成功過
我之前是照著這篇文章做initrd的
http://www.study-area.org/tips/floppy-linux.htm
謝謝~
« 上次編輯: 2010-10-19 11:22 由 殺手先生 »

id4fox

  • 憂鬱的高中生
  • ***
  • 文章數: 103
  • 40 oz 挑戰成功!
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #4 於: 2010-10-19 13:59 »
不好意思~關於這一段我想要請教一下
請問您丟了什麼東西進去?怎麼丟進去的?(下什麼指令?)
因為我在懷疑是不是我這裡做錯了一直沒成功過
我之前是照著這篇文章做initrd的
http://www.study-area.org/tips/floppy-linux.htm
謝謝~

我還沒試過敬群大大的做法,這裡先說明一下我的作法
其實只是單純的解壓縮、打包 的動作

用 mkinitramfs  建立的會是一個 gzip 檔,裡面包一個 cpio 檔
解開來的資料夾就是你啟動 usb linux 的根目錄
可以放進去你想放的執行檔或設定檔

我加了的就只有 busybox,用 $make CONFIG_PREFIX=(安裝路徑) install
就可以安裝到指定的位址
根目錄編好了就要重新用 cpio 打包成 initrd.img

要不要先用 mkinitramfs 建立的 initrd.img 試試看可不可以正常啟動?

殺手先生

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #5 於: 2010-10-19 15:05 »
請問你有裝ncurses嗎?
因為在make menuconfig似乎需要這個套件
我現在是用5.7版的

現在已經照的你的步驟做了
但是會卡在它會搜尋floppy裝置(電腦沒有任何的floppy)
而且一卡就好像當了(找很久都沒動作) :'(

id4fox

  • 憂鬱的高中生
  • ***
  • 文章數: 103
  • 40 oz 挑戰成功!
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #6 於: 2010-10-19 15:59 »
請問你有裝ncurses嗎?
因為在make menuconfig似乎需要這個套件
我現在是用5.7版的

現在已經照的你的步驟做了
但是會卡在它會搜尋floppy裝置(電腦沒有任何的floppy)
而且一卡就好像當了(找很久都沒動作) :'(

恩! 我有裝 ncurses 喔! 版本是 5.7.20090803
的確在 Ubuntu 預設下,是需要安裝一些套件來運作 menuconfig 的

至於在 floppy 裝置卡住...
恩...可以再詳細點嗎? 比如顯示的資訊 或 bios 開機的設定 等等

殺手先生

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #7 於: 2010-10-19 20:04 »
會卡在
Floppy drive(s): fd0 is 1.44M

如果我在initrd.img裡面包了fd0
也就是做了一個dev的資料夾
然後在dev下
#mknod fd0 b 2 0
#chmod 600 fd0
會顯示floppy0: no floppy controllers found

但是就變成卡到
ide: Assuming 33MHz system bus speed for PIO modes;  override with idebus=xx

另外想要請教一下您是用32還是64位元的Ubuntu?

id4fox

  • 憂鬱的高中生
  • ***
  • 文章數: 103
  • 40 oz 挑戰成功!
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #8 於: 2010-10-19 21:54 »
會卡在
Floppy drive(s): fd0 is 1.44M

如果我在initrd.img裡面包了fd0
也就是做了一個dev的資料夾
然後在dev下
#mknod fd0 b 2 0
#chmod 600 fd0
會顯示floppy0: no floppy controllers found

但是就變成卡到
ide: Assuming 33MHz system bus speed for PIO modes;  override with idebus=xx

另外想要請教一下您是用32還是64位元的Ubuntu?

先回答我有把握的部分,這是個 32 bit Ubuntu (哈!)

首先,我看到你建立了 /dev/fd0 不過這個操作可能會無效
因為在我的狀況下,由 mkinitramfs  建立的 initrd.img 你解開,會看到一個 script 檔 init
如果我沒搞錯,這應該是 initrd.img 被掛載後,第一個被啟動的 script,用來初始化環境
其中動作包含了建立一個 /dev 資料夾,並將 udev 掛載上去
這樣你所建立的 /dev/fd0 可能就會看不到,因為這個路徑被掛載了

而我也實際重新打包一個包含自製的 /dev/fd0 的 initrd.img
不過運作上並沒有發生像你一樣的問題 (我的電腦也沒有 floppy 了)

可不可以說一下你建立的步驟呢?

殺手先生

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #9 於: 2010-10-22 11:25 »
後來我有照著你的步驟走一次
結果還是一樣的問題
所以我在猜想是不是板子的問題...

id4fox

  • 憂鬱的高中生
  • ***
  • 文章數: 103
  • 40 oz 挑戰成功!
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #10 於: 2010-10-22 11:41 »
後來我有照著你的步驟走一次
結果還是一樣的問題
所以我在猜想是不是板子的問題...

可以講一下主板型號嗎?
& 編譯核心的 .config 檔也可以寄給我比對一下

殺手先生

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #11 於: 2010-10-29 11:40 »
不好意思這麼晚才回你...
被抓去做別的事情

我的板子是GA-6FASV
不過.config被我砍掉了...囧

id4fox

  • 憂鬱的高中生
  • ***
  • 文章數: 103
  • 40 oz 挑戰成功!
    • 檢視個人資料
回覆: USB Flash disk Linux 心得
« 回覆 #12 於: 2010-10-29 12:24 »
不好意思這麼晚才回你...
被抓去做別的事情

我的板子是GA-6FASV
不過.config被我砍掉了...囧

回文對我也是個學習,
而且雙方都是有空閒才能回的吧?別太在意

回正題
我看了下 GA-6FASV 的說明手冊,是有支援 USB 開機的,
不好意思,關於板子目前我能想到的就只有這些了
.config 是很重要的 kernel 環境判斷依據,
他記載了所有 configure (menuconfig 只是其中一種方法) 的設定資訊,有問題的話留下來會方便許多
算是個經驗啦,下次編記得留下來就是了