在台式机上,安装了linux,然后把硬盘拿到PC104上就启动不了,原来是台式机上linux装在hdb1上,而PC104把这个区认成了hda1,所以需要在grub里面修改,但是对这个不熟,就让它自己安装吧。安装过程如下。
----------------------
[root@linux ~]# grub
1. 先設定一下含有 /boot 目錄的那個 partition 啊!
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
# 瞧!找到啦!有這個 partition 的存在,且 grub 認識他為 ext2 的 filesystem。
2. 搜尋一下,是否存在 stage1 這個資訊檔案?
grub> find /boot/grub/stage1
(hd0,0)
(hd1,0)
# 呵呵!竟然找到兩個?因為剛剛我們也安裝一個在 /dev/hdb1 嘛!
3. 搜尋一下是否可以找到核心? /boot/vmlinuz ?
grub> find /boot/vmlinuz
Error 15: File not found
grub> find /boot/vmlinuz-2.6.12-1.1456_FC4
(hd0,0)
# 沒辦法,FC4 沒有連結檔,所以需要填寫完整的 kernel 檔案名稱!
4. 給他安裝上去吧!安裝到 MBR 看看!
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/boot/grub/stage2
/boot/grub/grub.conf"... succeeded
Done.
# 很好!確實有裝起來~這樣 grub 就在 MBR 當中了!
5. 那麼重複安裝到我的 /dev/hda1 呢?亦即是 super block 當中?
grub> setup (hd0,0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
Running "install /boot/grub/stage1 (hd0,0) /boot/grub/stage2 p
/boot/grub/grub.conf "... succeeded
Done.
# 雖然無法將 stage1_5 安裝到 super block 去,不過,還不會有問題,
# 重點是最後面那個 stage1 要安裝後,顯示 succeeded 字樣就可以了!
grub> quit
============================还有其他一些关于grub的文章,一起拿来留作参考
動手學 grub
術語
一部 Linux 電腦開機時, 大概要經過下列程序:
- BIOS 根據 boot priority 的設定, 挑選某顆硬碟或隨身碟
- 這顆碟的 MBR (Master Boot Record)
- 開機管理程式 boot loader
- 使用者從選單挑一個作業系統
- 開機管理員載入 Linux 核心 (通常檔名類似 vmlinuz) 及初始的檔案系統 (通常檔名類似 initrd.gz)
- 將根目錄切換至某個分割, 進入正常系統
常用的 boot loader 有 lilo, syslinux, 及 grub。 不論採用那個 boot loader, 當然都要寫一個設定檔 (lilo.conf, syslinux.cfg, 或 menu.lst) 將來成為開機時的選單。 開機管理程式特別之處有兩點。 首先, 它必須佔據 MBR, 才有機會搶到主控權。 所以任何 boot loader 都有一個 「安裝」 的動作, 做完之後, 你原來的 MBR 就被蓋掉了。 如果因此而無法開機進入自己熟悉的作業系統, 不要緊張, 其實資料都還在, 只是 MBR 指錯地方而已。 把設定檔改好, 重裝一次 boot loader 即可。 萬不得已, 也可以將舊的 MBR 還原: 在 dos 底下用 fdisk /mbr
或在 Linux 底下用 lilo -u /dev/sdz
不過把 grub 裝好才是正途啦。 第二, boot loader 起來的時候, 連作業系統都還沒起來, 它如何認得檔案系統呢? (設定檔裡面所指定的路徑, 它如何翻譯成硬碟的 c/h/s 代碼呢?) 詳見 這篇文章 所以 lilo 的設定檔每次修改過後, 或是它所指定的檔案曾經被刪除又拷貝回來之後, 都必須重新安裝一次 lilo。 但是 grub 因為自己本身就認得多種檔案系統, 所以沒有這個煩惱。
總之, 結論就是: (1) 個人推薦 grub (2) boot loader 不屬於任何作業系統, 建議不要把它放在某個作業系統的分割, 而是放在純粹資料的分割。
切割
以下說明如何在一個 512MB 的隨身碟上面安裝 ttylinux (8.0 版解壓後約 16MB), Damn Small Linux (約 50MB), slax (約 192MB; 加上中文模組後約 260MB) 等數個版本的 Linux 藉此解說開機管理員 grub 的一些重要觀念。 以下的說明, 假設在 ubuntu 7.10 底下工作。 (本講義的最早版本, 在 mandriva 2006 底下測試, 所以在新的 mandriva 可能也不會差太多。)
首先瞭解一下 硬碟分割的觀念 及 usb 開機的基本觀念, 本文採用的是 "CD 式" 安裝法。
先用 fdisk 將隨身碟切割如下:
- 第一分割: 主分割區, 將它的 type 設為 win95 fat32 分割。 之後將之格式化為 vfat。 這樣 windows 也可使用此分割, 可作為正常的隨身碟儲存資料的空間。 如果空間夠的話, 建議在此分割放 pietty, winscp 與 windows 版的 vnc 以便可以從任何 Windows 機器遠端登入自己的主機並傳檔。 也建議挑一套 portable apps 放上去。 使用跨平臺的自由軟體, 不論在任何作業系統都可以無入而不自得。
- 第二分割: 延申分割區。 進一步切出: 第五分割, 60MB, 放 dsl; 第六分割, 300MB, 放 slax。
- 第四分割: 主分割區, 24MB, 將它的 type 設為 linux 分割。 之後將之格式化為 ext2。 這裡要放 grub 及 ttylinux。 如此安排, 是希望掌管開機的最重要部分不受打擾, 不論其他分割如何受到破壞, 至少最難製作的開機部分還是可正常進入一個精簡版的 linux。
最後在 fdisk 裡面, 下 "p" 查看, 應該得到類似下面的結果:
所用裝置 Boot Start End Blocks Id System
/dev/sdz1 1 11 88326 83 Linux
/dev/sdz2 12 118 401561+ 5 延伸的
/dev/sdz4 58 60 24097+ 83 Linux
/dev/sdz5 12 20 72261 83 Linux
/dev/sdz6 21 58 305203+ 83 Linux
安裝 grub
把 grub 裝到 usb 碟之前, 最重要的是弄清楚 grub 怎麼稱呼你的 usb 碟。 對於熟悉 Linux 的人來說, IDE 硬碟及光碟是 /dev/hda /dev/hdb 等等; 而 SCSI 硬碟或 usb 裝置則是 /dev/sda /dev/sdb 等等。 但 grub 服務的對象不只是 Linux, 還包含 *BSD。 它稱呼硬碟為 (hd0) (hd1) 等等。 以下假設您已將 /dev/sdz4 掛載在 /mnt/sdz4 底下。
首先要先在 /mnt/sdz4 的某個目錄上 (就根目錄吧) 建立一個怪怪的, 從來沒用過的檔名, 例如叫做 x9k3j8m 好了。 進 grub 之後下指令 find /x9k3j8m
(必須打 「相對於 usb 碟的完整路徑」) 於是 grub 到接上本電腦的所有儲存裝置的每個分割上, find 所指定的完整路徑, 逐一去找這個檔案, 然後印出它在何處找到, 例如 (hd26,0)
。 最後打 quit 回到 shell 底下。
另一個方法更簡單: rm -f device.map ; echo | grub --batch --device-map=device.map
這樣不必進入 grub, 它會直接在目前目錄下, 產生一個對照表, 檔名如我們在命令列上指定的, 叫做 device.map。 注意: 一定要先刪除舊的 device.map, 不然會變成要求 grub 不分清紅皂白就以 (可能是錯的) device.map 來做事。 (結果什麼事都沒做, device.map 也沒改變。) 這裡面應該有一列長得像這樣:
(hd26) /dev/sdz
知道兩種稱呼方式在您機器上的對照之後, 安裝 grub 就很簡單了, 只要一句話: grub-install --root-directory=/mnt/sdz4 '(hd26)'
注意要拿掉 (hd26,0) 後面的 ",0" 不然 grub 會裝到一個分割的開頭, 而不是整顆隨身碟的開頭。 順便提醒: 這樣你安裝的 grub 是工作版 (例如上述的 mandriva 2006) 裡面的 grub, 而不是標的版 (例如 DSL 或 slax) 的 grub。 請注意 /mnt/sdz4 底下應該會多出一個 /boot/grub 目錄。 這就是安裝的部分成果; 至於安裝在 MBR 的那一部分, 沒有辦法直接檢視是否成功, 必須重新開機才知道。
測試空的 grub
事實上, 如果您的系統裝有 qemu 模擬器, 可以不必重開機, 直接這樣測試: qemu -usb /dev/sdz
。
不然, 就只好插好 usb 碟, 乖乖重新開機, 進入 BIOS 指定要從 usb 碟開機。 有些 BIOS 把 usb 碟歸類在 usb 裝置; 但更常見的是: 在硬碟的選單下才會看到你的 usb 碟。 儲存 BIOS 設定, 重新開機, ... 緊張一刻來了。 如果出現類似 grub>
的命令提示符號, 那麼恭喜你! 最難除錯的步驟已經通過! 請回到工作環境底下, 繼續較容易除錯的部分。 如果沒有提示符號... 那就有點糟糕了, 很可能是上述 '(hd26)' 參數給錯, 而且可能已經把不該動到的硬碟的 MBR 給攻佔下來了... 沒關係, 一不做二不休, 就乾脆改用 grub 來管理那顆硬碟吧。 不過請先專心把 usb 開機做完, 然後你自然會知道如何處理那顆被意外動到的硬碟。 (查看 grub 手冊, 或 google "grub boot windows" 之類的關鍵字)
另一方面, 在設定檔裡面, grub 一律以 (hd0)
稱呼 usb 碟, 因為將來做好以後, 當你以 usb 碟開機時, grub 被 BIOS 叫起來, 最先看到的當然就是他自己所在的 usb 碟, 所以就給它最前面的代號。 請把 menu.lst 貼到隨身上剛安裝完的 grub 目錄 (應該在 /boot/grub 底下)。 現在可以再次重開機, 測試 「有選單的 grub」, 應該出現文字模式的開機選單, 不再是令人不知所措的命令列。 當然, 因為尚未複製 iso 檔上面的資料, 自然無法開機; 但至少開機選單出現, 剩下來的步驟就簡單了。
從光碟上複製檔案
從 ttylinux 網站 下載 bootcd-i486-7.0.iso.gz (注意: 是光碟版), 解壓縮, 掛載映象檔, 最後拷貝進去:
gunzip bootcd-i486-7.0.iso.gz
mount -o loop /mnt/ttylinux bootcd-i486-7.0.iso
cd /mnt/ttylinux
mkdir /mnt/sdz4/boot/ttylinux
cp -a . /mnt/sdz4/boot/ttylinux
cd -
umount /mnt/ttylinux
這裡假設 grub 的相關檔案已先裝入 /dev/sdz4 且 /dev/sdz4 已掛載在 /mnt/sdz4 底下, 所以已有一個 boot 子目錄。 為了避免真的燒一張光碟, 所以用 -o loop 掛載; 詳見 loop file system。 注意: 不要用 cp -a /mnt/ttylinux/* /mnt/sdz4
之類的指令, 因為這樣會漏掉隱藏檔。 最後, 必須離開 /mnt/ttylinux 子目錄, 才能將它卸載下來。
如果重開機或用 qemu 測試, 可以正常進入 ttylinux 的話, 就恭喜成功了! 登入的帳號密碼都是 root; 可用 halt
關機, 或直接暴力關機, 反正它沒去動您的硬碟。
到這裡, 這已是一顆可開機的隨身碟。 以後要安裝其他版本 (例如 dsl 或 slax), 或其他分割被破壞, 也都不會影響到 grub 及 ttylinux。 以後安裝其他版本, 只需要 (1) 拷貝檔案 (2) 修改 boot/grub/menu.lst 就可以了, 不再需要動到開機管理員。
更多設定
如何把其他光碟片放進隨身碟呢? 詳見 這篇。 這裡面也提到如何把 dsl 與 slax 放在同一分割的不同子目錄裡面; 還有如何修改背景圖片。
參考資料
- Making a USB Stick bootable with Grub
- Getting started with GRUB
http://people.ofset.org/~ckhung/b/sa/grub.php
===================================================
如何使隨身碟能開機的方法
之前發了文 "請問有那些廠牌的隨身碟不支援開機?"
http://www.ubuntu.org.tw/modules/newbb/viewtopic.php?topic_id=5680&forum=11 ,很遺憾沒有得到明確的協助,更感慨竟有人貼圖諷刺,卻不提供解決辦法.
不過經過幾天的研究和測試,我整理了以下內容和大家分享:
隨身碟的晶片並不全部支援開機,但使用適當的開機程式(Boot Loader),則晶片不支援開機的隨身碟也能開機了,目前在Linux下主要使用兩種開機程式(Boot Loader),Syslinux和GRUB,分別說明如下:
(隨身碟的代號假設為 /dev/sdb,這可在terminal中鍵入指令fdisk -l查得;而在/media中隨身碟的代號假設為 disk,這可在terminal中鍵入指令ls /media查得)
1. Syslinux
適用於晶片支援開機的隨身碟,開機選項存放在檔案syslinux.cfg中,電腦系統中必須先已安裝套件syslinux(版本3.30以上)和mtools,然後執行下列指令以使隨身碟能開機:
$ syslinux -sf /dev/sdb
2. GRUB
適用於所有的隨身碟,開機選項存放在檔案menu.lst中,執行下列指令以使隨身碟能開機:
$ mkdir -p /media/disk/boot/grub
$ cp /usr/lib/grub/i386-pc/* /media/disk/boot/grub/
$ gedit /media/disk/boot/grub/menu.lst
確認磁碟代號為 hd0,如下例
## ## End Default Options ##
title Ubuntu, kernel 2.6.20-16-generic
root (hd0,1)
再輸入以下指令:
$ echo '(hd0) /dev/sdb' > /media/disk/boot/grub/device.map
$ grub-install --root-directory=/media/disk /dev/sdb
如出現以下訊息即表示隨身碟能開機了
Installation finished. No error reported.
This is the contents of the device map /media/liveusb/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(hd0) /dev/sdb
PS: 我成功地在一晶片支援開機的威剛隨身碟上安裝了Clonezilla,而在另一晶片不支援開機的金士頓隨身碟上安裝了gparted-livecd-0.3.4-8
-----------------
用隨身碟開機還是用 grub 比較好, 因為 FAT16 也可以用.
首先假設你的 USB flash disk 是 mount 在 /media/sda1
請試試以下步驟可來裝 grub, 就可以做出 Live USB.
0. mkdir -p /media/sda1/boot/grub/
1. cp /boot/vmlinuz-xxxx /media/sda1/boot/
cp /boot/initrd.img-xxxx /media/sda1/boot/
2. cp /usr/lib/grub/i386-pc/ 下的
stage1, stage2, fat_stage1_5 三個到 /media/sda1/boot/grub/
3. 篇寫 /media/sda1/boot/grub/menu.lst 例如:
開頭以
color cyan/blue yellow/blue
default 0
timeout 10
之後以每四行為一組
title Ubuntu 7.04 [ GNOME ]
root (hd0,0)
kernel /boot/vmlinuz-xxxx boot=casper lang=zh_TW
initrd /boot/initrd.img-xxxx
其中的 root(hd0,0) 固定不變, 因為既然 BIOS 的 boot priority
是 USB disk, 就一定是 (hd0,0), 而 vmlinuz-xxxx 及
initrd.img-xxxx 要依你實際 cp 的檔名來寫, 其它 kernel 參數
請依你的須要加上.
4. echo yes > /media/sda1/my-usb (這只是用來標定用的)
5. 在 ubuntu 下執行 grub --no-floppy
6. 在 grub 提示符號下執行 find /my-usb 看它出現什麼 ?
例如出現 (hd1,0)
7. 根據上列所得, 在 grub 提示符號下執行 root (hd1,0)
8. 在 grub 提示符號下執行 setup (hd1)
(這是將 grub 裝在 USB disk 的 MBR)
9. 在 grub 提示符號下執行 quit 離開 grub.
這樣你的 USB disk 就能用 grub 開機了
根據另外那篇的說明, 某些 BIOS 雖然有支援 USB boot, 但可能
跟某些 USB disk 的晶片有某些問題, 以致就算在 linux 下用
grub 做好開機, 然後用 qemu 可以 boot, 但在實體電腦上卻不
能 boot.
這時請按照那一篇提到的, 用 HP 的 USB storage format tool
把 USB 做成可以 boot 進 DOS, 然後刪除那些 DOS 檔, 再按上
列方法安裝 grub, 這樣就沒有不能開機的 USB disk 了.
當然, 如果你的 BIOS 根本不支援 USB boot, 那就不必說了.
如果還有什麼問題, 也可以到 ubuntu-tw 的 IRC 找找看有沒有
人可以問.
---路燈甲
===================================================
sudo fdisk -l 查詢隨身碟代號(假設在/dev/sdb)
ls /media 查詢隨身碟掛載後的代號(ubuntu都掛載於/media/...下,其他版不一定)
假設掛在/media/disk/
1. mkdir -p /media/disk/boot/grub
2. cp /usr/lib/grub/i386-pc/* /media/disk/boot/grub/
3. gedit(or其他文字編輯器) /media/disk/boot/grub/menu.lst
查詢隨身碟在grub的代號
4. echo yes > /media/disk/my-usb
5. sudo grub --no-floppy
在grub命令列下(grub>)
6. find /my-usb 應該會顯示出/media/disk這個(掛載的)磁區在grub下對應的代號
假設代號為(hd1,0)
~ps:若隨身碟有多個磁區,可以重複4.產生一個檔案到/media/*(其他位置),通常(hd1,0)的"0"會變
法一在grub命令列下安裝)
7. root (hd1,0) 取得root權限
8. setup(hd1) 將grub安裝在隨身碟的MBR
9. quit 退出grub
法二跳出grub再安裝)
7. sudo grub-install --root-directory=/media/disk '(hd0)'
qemu -usb /deb/sdb測試是否安裝成
(沒有qemu就只能重開機或其他支援usb開機的虛擬機)
參考網頁:
如何使隨身碟能開機的方法
動手學 grub
http://vincilife.blogspot.com/2008/11/grub.html
=========================================================
近来没有消停过。TCH的电脑要换个硬盘,是因为我要将电脑的内存升级,最后发现DDR 333MHz几乎绝货,所以附的定金用来升级他的硬盘了,问题是,他的电脑刚买不到3个月而已。既然升级硬盘,那么就要装上系统,在电脑没有光驱的情况下安装XP被证明是一项折磨人的活动。从以前熟悉的老毛桃winpe不停试错,到最后没有办法拉下一个U盘维护工具解决了用U盘安装系统的问题。然后就处于跟无线网络的艰苦斗争之中。每次搞定该无线网络就忘记了是如何设置才能够导通,或许试了太多次的情况下感动了上苍,然后下一次仍旧走回老路。
在这些事情的间隙中,不知为何在将移动硬盘连接的情况下,将电脑地带的硬盘盘符改了一个,这样的结果导致了不能够启动移动硬盘中的Ubuntu,出现这样的错误信息:
GRUB loading, please wait…
Error 15
老样子,去股沟,上百度,过长江,渡黄河,在离要狠下心来用live cd重新过一遍安装时发现了这篇文章,犹如东方出了个毛主席,稍微根据自己的情况改了下“参数”,实现了所谓的“重新安装Grub”,顺利启动到移动硬盘上的Ubuntu记录下这次过程:
Ubuntu how to re-install grub using chroot
First make your life easier by getting into a full root session
ubuntu@ubuntu:~$ sudo su
now mount your ubuntu install
root@ubuntu:/home/ubuntu# mount /dev/hda5 /mnt
## 在重新安装Grub之前,用fdisk -l命令看看现有的分区情况,移动硬盘上的boot是在/dev/sdb6上面,因此将上面的/dev/hda5改成实际情况下的
Next bind your real devices so that the grub command can work
root@ubuntu:/home/ubuntu# mount -o bind /dev /mnt/dev
root@ubuntu:/home/ubuntu# mount -o bind /proc /mnt/proc
## 不知为何告知没有 ‘ -o ’ 这个命令,只是照画葫芦打下这两行命令,如果到第二行不能输入/字符,好像可以免去
Enter the chroot session
root@ubuntu:/home/ubuntu# chroot /mnt
root@ubuntu:/# grub
grub> find /boot/grub/stage1
find /boot/grub/stage1
(hd0,1)
(hd0,4)
## 虽然上面fdisk -l显示了/dev/sdb6,不过find出来的地点却是(hd1,5)一个选项而已
My root disk was installed on partition 5 so now set that as root
grub> root (hd0,4) root (hd0,4)
## 根据上一步,将(hde0,4)改成(hd1,5)即可
install grub
grub> setup (hd0)
setup (hd0)
Checking if “/boot/grub/stage1″ exists… yes
Checking if “/boot/grub/stage2″ exists… yes
Checking if “/boot/grub/e2fs_stage1_5″ exists… yes
Running “embed /boot/grub/e2fs_stage1_5 (hd0)”… 16 sectors are embedded.
succeeded
Running “install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,4)/boot/grub/stage2 /boot/grub/menu.lst”… succeeded
Done.
## 同样,这里的(hd0)改成(hd1)
Now quit and restart your machine
grub> quit
exit
reboot
## 我reboot了两次还没有反应,只好用鼠标点点重启菜单
就这样,搞定了。
关于无线网络的问题,在路由器控制面板重新设置了WPA登录方式,就TMD的可以连接上了。跟上面的过程一样,我不知道为什么会这样。我只知道是寂寞造成的。
http://www.shuiziliu.com/blog/aspiration/re-instal-grub-20090913.html
文章评论(0条评论)
登录后参与讨论