Sharing

2012年5月4日 星期五

Create a FreeDOS bootable USB stick


因為需要更新 bios 及 BMC, 所以需要做出一個 FreeDos 開機的 USB

先介紹一個工具

uNetBootin

這是一個可以幫你把 .iso 或 .img 燒到 USB 內, 讓你做出可開機的 USB
而且它看起來更新的很快, 連 Ubuntu 12.04 LTS 出來沒多久, 它也支援了
並且同時支援 Window / Linux / Mac 三種平台, 真的是很方便
網路上還有其它類似的工具, 不過目前覺得這個最齊全, 彈性也最大, 
未來如果要做出來不同 OS 的 Bootable USB stick 也可以利用這個

所以最簡單的方式, 就是在 Distribution 的地方選擇 FreeDos, 就可以做出來了




pjack@ubuntu:/media/3AB3-4AAD$ ll
total 1569
drwx------ 2 pjack pjack    4096 Jan  1  1970 ./
drwxr-xr-x 3 root  root     1024 May  5 09:00 ../
-r--r--r-- 1 pjack pjack   32768 May  5 00:48 ldlinux.sys
-rw-r--r-- 1 pjack pjack   60928 May  5 00:48 menu.c32
-rw-r--r-- 1 pjack pjack     145 May  5 00:48 syslinux.cfg
-rw-r--r-- 1 pjack pjack 1474560 May  5 00:48 ubninit
-rw-r--r-- 1 pjack pjack   25244 May  5 00:48 ubnkern

可以看的到裡面放了 uNetBootin 自己做的 ubninit/ubnkern, 接下來你可以再放進去你要更新的 Bios, 開機之後選擇進入 C:\ 就可以看到了

補: uNetBootin 在 Linux 目前只支援32-bit, 所以安裝前會需要安裝 ia32-libs 以及 p7zip


Bootable Image

不過故事還沒結束, 有時透過 BMC 內的 ikvm 遠端操作, 會受限只能使用 .img/.iso 來做出虛擬 USB, 那該怎麼做出 .img 呢?

第一個方式, 把剛剛做好的 bootable USB, 直接 dd 出來!

pjack@ubuntu:~$ dd if=/dev/sdc of=freedos32M.img
pjack@ubuntu:~$ file freedos32M.img 
freedos32M.img: x86 boot sector; partition 1: ID=0xb, active, starthead 1, startsector 63, 3947016 sectors, code offset 0x31

這個方式有個小缺點, 如果你的 USB 很大, 做出來的 image 就會很大, 聽說有方法可以縮小,
但因為手邊有一個很舊的 32M USB, 這對我來說就不是個問題
我也試過拿個 2G 的 USB, 但暴力只取前面 32M, 竟然也可以成功 ( dd if=/dev/sdc of=freedos256M.img bs=1M count=32 )
所以暫時就不想去了解要怎麼縮小了

你也可以把做的 image mount 起來, 但必須要了解一件事, 這個 image 的前面一小段是 boot sector
是無法用任何 file format 來解讀, 所以必須要跳過它


pjack@ubuntu:~/kvm$ fdisk -l -u 'sectors' freedos32M.img

Disk freedos32M.img: 33 MB, 33554432 bytes
255 heads, 63 sectors/track, 4 cylinders, total 65536 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x16419fdb

         Device Boot      Start         End      Blocks   Id  System
freedos32M.img1   *          63     3947078     1973508    b  W95 FAT32

# 從這邊可以知道是從 63 開始, 所以要跳過 63 * 512 bytes = 32256

pjack@ubuntu:~$ mount -o loop,offset=32256 freedos32M.img /mnt

pjack@ubuntu:~$ ll /mnt
total 1569
drwxr-xr-x  2 root root    4096 May  5 09:25 ./
drwxr-xr-x 26 root root    1024 May  4 22:28 ../
-r-xr-xr-x  1 root root   32768 May  5 00:48 ldlinux.sys*
-rwxr-xr-x  1 root root   60928 May  5 00:48 menu.c32*
-rwxr-xr-x  1 root root     145 May  5 00:48 syslinux.cfg*
-rwxr-xr-x  1 root root 1474560 May  5 00:48 ubninit*
-rwxr-xr-x  1 root root   25244 May  5 00:48 ubnkern*

# 接下來你就可以丟東西到 /mnt, 更新你的 image 檔案內容, 最後記得要 umount



但是這樣做出來的 image 雖然可以開機, 但我發現有很多指令都不被包含在裡面, 這個單純只是為了開機使用
可以透過 kvm 來看一下他開機的畫面及狀況
virt-install --name freedos32M --ram 128 --disk path=freedos32M.img --import






Install FreeDOS on KVM

如果有更進一步的需求, 就必須要做的很完整, 直接把 FreeDOS 安裝起來, 你可以透過實體機器直接把它裝在 USB 上面, 也可以像我這樣裝在 KVM 上, 然後做出來 image。做出來的 image 就又可以透過 uNetbootin 燒進 USB, 又或者直接 dd 進去

首先到官網下載安裝的 .iso 檔
http://www.freedos.org/freedos/files/


# 先生成一個大小適中的 image, 其實這件事透過 virt-install 自動生成也可以
# 但因為它的單位是用 g, 這也太大了, 所以還是透過最老的方法來做事

pjack@ubuntu:~/kvm$ kvm-img create test.img 32M
Formatting 'test.img', fmt=raw size=33554432

pjack@ubuntu:~/kvm$ virt-install --name test --ram 128 --disk path=test.img --cdrom fd11src.iso --boot cdrom




剩下的部份就只剩安裝了, 過程就不貼圖了, 網路上很多相關的文章, 有留一些連結在下方, 有需要看的可以看看


Reference:

fdos:

freedos:

沒有留言: