作者:Al Dev (Alavoor Vasudevan) alavoor[AT]@yahoo.com
譯者:黃國偉
v10.7, 02 Nov 2002 翻譯日期:03 Dec 2002
轉為 Wiki: Ping (ping 'at' pingyeh 'dot' net), 2003 年 11 月 27 日
這份文件探討從 Linux 系統當機中回復的方法。造成 Linux 系統當機的各種原因可能是 - LILO 毀損、 linux 無法開機、 硬碟主開機記錄(Master Boot Record, MBR)損壞、或是安裝其他作業系統例如 Windows NT 而將 LILO 或 MBR 蓋寫掉所造成 linux 無法開機。
1. 簡介
您無法避免意外的發生;如果意外發生在 linux 系統,這可能會損害到硬碟主開機記錄 (MBR) 或是 LILO (Linux boot Loader)。當 linux 由於硬碟故障而導致無法開機時,意外就會發生。假如您不小心重新劃分磁碟,或是在 linux 系統的電腦上安裝其他作業系統,例如:Windows 98/NT,LILO 也可能會失效。
這份文件給您一些建議、秘訣、和快速的指引來快速回復系統,而不必費心地研讀上百頁有關 LILO 或 Linux 的文件。
1.1. 小型軟碟 Linux 系統
為了回復任何作業系統如 Windows 95/NT/2000、OS/2、BeOS、或 Linux,您可能需要裝在一片軟碟片的小型 linux 系統。請參考以下所列出的小型軟碟 linux 系統 -
1.2. 小型 CDROM Linux 系統
Tom's Root and Boot " the most GNU/Linux on one floppy disk "
" Innominate-Linux-Rescue-System " - a CD-based rescue system
Irish Linux Users Group (ILUG) BBC : A bootable CD ISO
Lubbock : Meant to be the "Tom's Root Boot" of CDs
Repairlix : a networked Linux distribution/bootable system intended to fit in 12MB of media.
SuperRescue : a Red Hat-based bootable CD
Timo's Rescue CD Set : an easy way of generating el Torito Boot Cd's
2. 當機回復
2.1. 準備工作建議
在您使用下個章節的 Tomsrtbt 軟碟登入之後, 您最好先備分重要的系統檔案,像 /etc/fstab、/etc/lilo.conf。 如此在當機時或系統檔案發生問題時是相當有用的。
-
bash# cp /etc/fstab /etc/fstab.orig bash# cp /etc/lilo.conf /etc/lilo.conf.orig bash# cp /etc/hosts /etc/hosts.orig bash# cp /etc/hosts.allow /etc/hosts.allow.orig bash# cp /etc/hosts.deny /etc/hosts.deny.orig bash# cp /etc/inetd.conf /etc/inetd.conf.orig bash# cp /etc/inittab /etc/inittab.orig bash# cp /etc/networks /etc/networks.orig
2.2. 回復系統的快速步驟
循著這些步驟執行,以便從 LILO 或系統當機中回復。
狀況 1: 假如系統無法開機 -
取得並建立 tomsrtbt 開機磁片 , 或 MuLinux 開機磁片 (請參考 Tiny Linux )。 並使用 tomsrtbt 開機磁片開機。 使用 fdisk 指令找出分割區(partitions)。 試著找出 root 和 boot 分割區。注意! root 分割區自己需擁有 /boot 檔案。
Linux 的 root 分割區包含下列資料夾
bin , boot , etc , usr .
Linux 的 boot 分割區則包含以下的資料夾:
vmlinuz , boot.b , chain.b , map .
使用以下步驟找出 root 分割區:
-
bash# fdisk /dev/hda Command (m for help): m (顯示指令的輔助選單) Command (m for help): p (列出硬碟分割區) Command (m for help): q bash# mkdir /test bash# mount /dev/hda1 /test bash# ls /test 您應該會看到 root 分割區顯示如下 - bin fd lib mnt proc sbin usr boot dev etc home lost+found opt root tmp var
如果此分割區並非 root 分割區,試試下個分割區 /dev/hda2 。 持續嚐試 hda3, hda4, hda5 等,直到找出 root 分割區為止。 如果您在 hda 上沒有找到 root 分割區, 則重覆以上步驟尋找其他硬碟,像是 hdb 、 hdc 、 hdd 等。
接下來您應找出 /boot、/usr、和 /var 分割區。 在建立新的 lilo 配置時,這些分割區的位置是必需的。
以我的系統為例,root 分割區是在 /dev/hda4:
-
bash# mkdir /rootpart bash# mount /dev/hda4 /rootpart bash# cat /rootpart/etc/fstab 閱讀 fstab 的內容,並且按照 fstab 檔案掛上 (mount) 分割區。像下面這樣 - bash# mount /dev/hda5 /rootpart/boot bash# mount /dev/hda6 /rootpart/usr bash# mount /dev/hda7 /rootpart/var bash# mount /dev/hda8 /rootpart/opt bash# mount /dev/hda9 /rootpart/root bash# mount /dev/hda10 /rootpart/home
以我的系統為例,按照 fstab 所顯示,hda5 是 boot 、hda6 是 usr , hda7 是 var 、hda8 是 opt 、 hda9 是 root 、hda10 是 home 、而 hda11 是 windows95 (FAT16 分割區)。
編輯 /etc/fstab (不是 /rootpart/etc/fstab) 並且加入(以下程式碼範例)
-
/dev/hda4 /rootpart ext2 defaults 1 1 /dev/hda5 /rootpart/boot ext2 defaults 1 1 /dev/hda6 /rootpart/usr ext2 defaults 1 1 /dev/hda7 /rootpart/var ext2 defaults 1 1 /dev/hda8 /rootpart/opt ext2 defaults 1 1 /dev/hda9 /rootpart/root ext2 defaults 1 1 /dev/hda10 /rootpart/home ext2 defaults 1 1 /dev/hda11 /rootpart/win95part vfat defaults 1 1 在我的電腦中,hda4 為 linux 的 root 分割區、hda5 為 boot 分割區、 hda11 則為 windows 95 的 vfat 系統。 bash# mkdir /rootpart/win95part bash# mount /rootpart/win95part 使用 fsck 或 e2fsck 指令修復有問題的分割區。 bash# man fsck bash# man e2fsck
狀況 2: 如果 LILO 是無效的..
依照狀況 1 的步驟來排除問題。如果無法解決,則參照以下步驟。 在執行狀況 1 的步驟之後,您應該已經掛載上 /rootpart 並且已經建立好 /etc/fstab 檔案。
注意:在進行以下步驟時,觀察 chroot 如何運作是很重要的。 chroot 所使用的 /sbin/lilo 檔案的正確位置是在 /rootpart/sbin/lilo , 而 不是 在 /sbin!!因此請不要混淆。
-
bash# mount -a bash# chroot /rootpart /sbin/lilo -q bash# man chroot bash# chroot /rootpart /sbin/lilo
注意:使用 chroot 的新手可能會被混淆。如果 chroot 抱怨它找不到 /boot/map 檔案, 這種情形實際上代表著它無法找到 /rootpart/boot/map。因為您使用 /rootpart 當作 chroot 的第一引數 (first argument),所有的化身 (references) 都指向 /rootpart。
您也可以選擇直接使用 /sbin/lilo 以代替 chroot。 lilo 加選項 -r 實際上就和 chroot 指令是一樣的。
強烈建議 您使用 chroot,而不要使用 lilo -r,
因為使用 chroot 比較方便,且較容易找出錯誤。
-
bash# man lilo bash# /sbin/lilo -r /rootpart
-
狀況 3: 如果 LILO 是無效的..
如果使用狀況 1 和狀況 2 的步驟均無法解決, 假如您有使用 'mkbootdisk' 製作過開機片(於安裝時或參考 'man mkbootdisk'自行建立),則使用您的開機磁片來開機並修復分割區。 mkbootdisk 存在於 mkbootdisk*.rpm 的套件,您必須安裝它。 (譯注:隨不同發行套件而有所差異;請洽詢您的發行套件廠商或組織) 或者從 http://www.bootdisk.com/ 取得 Linux/NT/Windows/DOS/Mac 的開機磁片。 其他選擇 - 找 Linux 安裝光碟來使用。 每個 Linux 套件會在光碟裡提供救援磁片的 image file,在 Linux 環境下,鍵入 "dd if=/cdrom/disks/rescue of=/dev/fd0" 來建立救援磁片。在 DOS 環境下, 使用 rawrite.exe (包含在 Linux 光碟裡),鍵入 "rawrite image-name a:" 來建立救援磁片。
狀況 4: 如果以上狀況 1、2、3 的步驟皆無法解決問題,且您也沒有開機磁片
假如您有其他 linux 系統的電腦,以 root 身份登入並且執行 -
注意:如果您編譯您自己的核心(kernel)為 bzImage (例如 bzImage-2.4.4), 您應當使用以下方法對 vmlinuz-2.4.4 建立硬連結(hard link)。(注意 vmlinuz 的 z,而非 vmlinux) 如果您並未做此步驟, 則 mkbootdisk 指令可能會失敗。
-
bash# cd /boot bash# ls -l vmlinuz* bash# ln /boot/bzImage-2.4.4 /boot/vmlinuz-2.4.4
現在您已有 bzImage 和 vmlinuz,執行下列指令 -
-
bash$ man mkbootdisk bash# cp /etc/lilo.conf /etc/lilo-original.conf
編輯 /etc/lilo.conf 並將您在 '狀況 1' 所獲得的 root 分割區格式填入;之後插入空白磁碟片並執行 -
-
bash# mkbootdisk --device /dev/fd0 2.2.12-20 (譯注:2.2.12-20 為核心版本編號,請自行依照您的 linux 核心版本作改變。)
mkbootdisk 存在於 mkbootdisk*.rpm 的套件,您必須安裝它。 (譯注:隨不同發行套件而有所差異;請洽詢您的發行套件廠商或組織) 您必須確保將 /etc/lilo-original.conf 更改回原來的檔名 /etc/lilo.conf!! 再以此開機磁片進行狀況 3 的步驟。
-
狀況 5: 這是最壞的情況,希望您不會走到這個地步。
狀況 1 到 4 已包含了絕大多數的案例,但是如果連狀況 1、2、3、和 4 的步驟都無法解決 -
第一步: 使用 tomsrtbt 開機磁片開機, (請參考 Tiny Linux ) 掛上分割區, 並且使用以下指令備份 root 分割區至其他還有磁碟空間的分割區 -
-
編輯 /etc/fstab 並且寫入(以下的程式碼範例, 您可能必須按照您的磁碟機實際狀況作改變) - /dev/hda4 /rootpart ext2 defaults 1 1 /dev/hda11 /b1 vfat defaults 1 1 bash$ mkdir /rootpart; mount /rootpart bash$ mkdir /b1; mount /b1 bash$ cd / bash$ df 查看 /b1 是否有足夠的磁碟空間,以便使用 tar 來備份 root 分割區。 bash$ tar cvf /b1/root-hda4.tar /rootpart
第二步: 放入 Linux 光碟片,重開機並安裝 redhat linux (譯注:或安裝其他 linux 發行套件) 在 /dev/hda4 (但 千萬不要 安裝任何多餘的套件, 您只需要安裝 root、boot 系統,和 LILO 管理者。 也就是說,選擇最小安裝即可)。 安裝程式也將會安裝 LILO 在您的硬碟裡。 現在重新啟動 linux,以 root 身份登入,並且執行 -
-
bash$ man mkbootdisk bash# cp /etc/lilo.conf /etc/lilo-original.conf
注意:您 必須 記得將 lilo-original.conf 複製回 lilo.conf!! 編輯 /etc/lilo.conf 並將您在 '狀況 1' 所獲得的 root 分割區格式填入;之後插入空白磁碟片並執行 -
-
bash# mkbootdisk --device /dev/fd0 2.2.12-20 (譯注:2.2.12-20 為核心版本編號,請自行依照您的 linux 核心版本作改變。) bash# cp /etc/lilo-original.conf /etc/lilo.conf
測試此開機磁片,檢視其是否能運作, 並將第一步中利用 tar 作備分的檔案 /b1/root-hda4.tar 回復。 (譯注:您可使用 tar xvf 來回復。詳見 tar manpage)
-
2.3. 預防性措施
您應當採取下列的預防性措施來處理未來可能發生的問題。
您 一定要 偶爾製作救援開機磁片,且在您改變分割區時一定要製作。 插入空白磁碟片並執行 -
-
bash$ man mkbootdisk mkbootdisk 存在於 mkbootdisk*.rpm 的套件,您必須安裝它。 (譯注:隨不同發行套件而有所差異;請洽詢您的發行套件廠商或組織) bash$ mkbootdisk --help bash$ mkbootdisk --device /dev/fd0 2.2.12-20 (譯注:2.2.12-20 為核心版本編號,請自行依照您的 linux 核心版本作改變。)
-
您 必須 將分割表設定 (partition tables setup) 備份至磁片和硬碟裡。 您也應將此設定列印並貼至電腦機殼上。
-
bash$ su - root bash# man fdisk bash# fdisk -l /dev/sda > partition_table_backup.txt
如果您需要重新分割硬碟,這樣做是非常有幫助的。 從列印出來的分割表資料,您將會了解分割區磁柱的起始。 回復系統時,在重新分割與格式化硬碟後,您可以利用備份資料回復原先的分割設定。
-
您手邊必須擁有 tomsrtbt 開機磁片。
您手邊必須擁有 Yard 救援和開機磁片。
備分 /root 與 /boot 目錄。使用 tomsrtbt 開機磁片。並且執行
-
bash# vi /etc/fstab 加入以下數行 - /dev/hda1 /a1 vfat defaults 1 1 /dev/hdb1 /b1 vfat defaults 1 1 以我的系統為例, hda1 為 linux 之 root 分割區 '/' bash# cd / bash# tar cvf /b1/linux-root-partition-hda1.tar a1 bash# tar cvf /b1/linux-boot-partition-hda1.tar a1/boot
-
2.4. 移除 LILO
您可以使用 DOS 啟動載入程式(boot loader)載入啟動磁區,並以之取代 LILO。 在 MS DOS 提示符號下輸入以下指令:
-
FDISK /MBR
此處的 MBR 代表 "硬碟主開機記錄(Master Boot Record)"。
請參考 LILO 文件,取得其他移除 LILO 的方法;這些文件通常放在 linux 系統上的 /usr/doc/lilo* (譯注:或者是 /usr/share/doc/lilo*)。也請參考 'man lilo'。
2.5. 常犯錯誤
在您更改 /etc/lilo.conf 之後,您必須執行 lilo ,使您的改變生效。 忘了執行是 linux 初學者很常犯的錯誤。執行 -
-
bash# lilo -v -v -v
3. 相關網站
請參閱以下位址,可取得 LILO、Linux 救援、當機回復的相關資訊 -
Linux goodies main site
4. 此份文件的其他格式
此份文件是以 14 種不同的格式所發行的 - DVI, Postscript, Latex, Adobe Acrobat PDF, LyX, GNU-info, HTML, RTF(Rich Text Format), Plain-text, Unix man pages, single HTML file, SGML (Linuxdoc format), SGML (Docbook format), MS WinHelp format.
此份 howto 文件是在 -
http://www.linuxdoc.org 按下 HOWTOs 連結, 並且在網頁瀏覽器上使用 CTRL+F 或 ALT+f 來搜尋 howto 文件名稱。
您也可從以下的映射站找到此份文件 -
其他較靠近您的映射站 (網址智慧辨識,network-address-wise) 可以在此找到 http://www.linuxdoc.org/mirrors.html 選擇一個映射站,並且進入目錄 /LDP/HOWTO/xxxxx-HOWTO.html
您可以從下列連結得到 HTML、DVI、Postscript、或 SGML 格式的 HOWTO 文件單一 tar ball 檔案 - ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO/other-formats/ 與 http://www.linuxdoc.org/docs.html#howto
純文字格式是在: ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO 與 http://www.linuxdoc.org/docs.html#howto
Single HTML 檔案格式是在: http://www.linuxdoc.org/docs.html#howto
Single HTML 檔案可以使用下列指令來建立 (參見 man sgml2html) -
sgml2html -split 0 xxxxhowto.sgml
其他語言之文件翻譯,像是法文、德文、西班牙文、 中文、日文等是在 ftp://www.linuxdoc.org/pub/Linux/docs/HOWTO 與 http://www.linuxdoc.org/docs.html#howto 歡迎您幫忙翻譯成其他語言的版本。
此份文件是以 "SGML-Tools" 工具軟體所撰寫的,您可以在下面的連結得到此軟體 - http://www.sgmltools.org 您可使用以下指令編譯原始檔,例如:
sgml2html xxxxhowto.sgml (獲取 html 檔案)
sgml2html -split 0 xxxxhowto.sgml (獲取 single page html 檔案)
sgml2rtf xxxxhowto.sgml (獲取 RTF 檔案 )
sgml2latex xxxxhowto.sgml (獲取 latex 檔案)
(譯注:中譯版使用者請至 ftp.linux.org.tw/pub/CLDP/src 下載 zh-sgmltools-1.x-x.tar.gz 並安裝之,再以 bg5sgml2html、bg5sgml2rtf、 bg5sgml2latex 或 gbsgml2html、gbsgml2rtf、gbsgml2latex 指令編譯原始檔。詳見 SGMLtools 中文套件使用說明 http://www.linux.org.tw/CLDP/zh-sgmltools.html)
4.1. Acrobat PDF 格式
PDF 檔案可以從 postscript 檔案使用 acrobat distill 或 Ghostscript 來取得。 而 postscript 檔案是從 LaTex 檔案先轉成 DVI, 再轉成 postscript 而取得。 您可以從 http://www.adobe.com 下載 distill。 如以下範例所示:
-
bash$ man sgml2latex bash$ sgml2latex filename.sgml bash$ man dvips bash$ dvips -o filename.ps filename.dvi bash$ distill filename.ps bash$ man ghostscript bash$ man ps2pdf bash$ ps2pdf input.ps output.pdf bash$ acroread output.pdf
或者您可使用 Ghostscript 的指令 ps2pdf。 ps2pdf 是個與 Adobe's Acrobat Distiller 產品作用相似並擁有其大部分功能的指令: 它將 PostScript 檔案轉換成可攜式文件格式(Portable Document Format, PDF)檔案。 ps2pdf是被一個包含在 Ghostscript 的指令稿 (command script) (批次檔 batch file),且選擇一種名叫 pdfwrite 的特殊 "輸出裝置 (output device)" 來執行。為了要使用 ps2pdf, 當 Ghostscript 在安裝編譯時,pdfwrite 裝置必須要包含在 makefile 裡; 詳見安裝 Ghostscript 的文件。
4.2. 將 Linuxdoc 轉換成 Docbook 格式
這份文件是以 linuxdoc SGML 格式所撰寫。Docbook SGML 格式 較 linuxdoc 格式更強大,且擁有更多特色。 linuxdoc 非常簡單且易用。我們使用 ld2db.sh 程式和一些 perl scripts 來將 linux SGML 檔案轉換成 Docbook SGML。 ld2db 的輸出結果並非 100% 完美,您需要使用 cleanup_ld2db.pl 這個 perl script。您可能必須手動更改文件中的數行。
從 http://www.dcs.gla.ac.uk/~rrt/docbook.html 或從 Milkyway Galaxy site 下載 ld2db 程式
從 Milkyway Galaxy site 下載 cleanup_ld2db.pl 這個 perl script。
ld2db.sh 並非 100% 完美,您在執行以下指令時將會得到許多錯誤
-
bash$ ld2db.sh file-linuxdoc.sgml db.sgml bash$ cleanup.pl db.sgml > db_clean.sgml bash$ gvim db_clean.sgml bash$ docbook2html db.sgml
而您可能必須在執行完 perl script 後, 手動編輯一些小錯誤的地方。例如: 您可能需要 /Para>在每個 Listitem> 寫入封閉標記 (closing tag)
4.3. 轉換成 MS WinHelp 格式
您可以將 SGML howto 文件轉換成 Microsoft Windows Help 檔案。 首先使用以下指令將 sgml 轉換成 html:
-
bash$ sgml2html xxxxhowto.sgml (獲取 html 檔案) bash$ sgml2html -split 0 xxxxhowto.sgml (獲取 single page html 檔案)
然後使用 HtmlToHlp. 您也可使用 sgml2rtf,然後使用 RTF 檔案以獲取 winhelp 檔案。
4.4. 讀取各種不同的格式
要閱讀 dvi 格式的文件,必須使用 xdvi 程式。xdvi 程式在 Redhat Linux 是存在於 tetex-xdvi*.rpm (譯注:隨不同發行套件而有所差異;請洽詢您的發行套件廠商或組織)。 您可以從控制面板(ControlPanel) | 應用程式(Applications) | 出版(Publishing) | Tex 的選單按鈕開啟之。 要讀取 dvi 格式文件,請執行以下指令 -
-
xdvi -geometry 80x90 howto.dvi man xdvi
並且使用滑鼠來重新設定視窗大小。 使用方向鍵、Page Up、Page Down 來導引, 您也可使用 'f', 'd', 'u', 'c', 'l', 'r', 'p', 'n' 字母鍵 來上移、下移、置中、至下一頁、回上一頁等。 要關閉專家選單,請按 'x'。
您可以使用 'gv' (ghostview) 或 'ghostscript' 來閱讀 postscript 格式的文件。 在 Redhat Linux 裡,ghostscript 存在於 ghostscript*.rpm 套件;gv 則存在於 gv*.rpm 套件裡。(譯注:隨不同發行套件而有所差異;請洽詢您的發行套件廠商或組織) 您可以從控制面版(ControlPanel) | 應用程式(Applications) | 美工繪圖(Graphics) 的選單按鈕開啟之。gv 遠比 ghostscript 更人性化。 ghostscript 和 gv 也有其他平台的版本,像是 OS/2、 Windows 95 和 NT,您甚至在那些平台也可以觀看此份文件。
您可從以下網址獲得 Windows 95、OS/2、 和所有作業系統平台的 ghostscript http://www.cs.wisc.edu/~ghost
要閱讀 postscript 格式的文件,執行以下指令 -
gv howto.ps ghostscript howto.ps
您可以使用 Netscape Navigator、Microsoft Internet explorer、 Redhat Baron Web browser 或任何其他的 10 種瀏覽器來閱讀 HTML 格式的文件
您可以使用 LyX -- 一種 latex 在 X-Windows 的前端界面,來閱讀 latex 格式的文件。
5. 版權 Copyright
版權政策按照 LDP (Linux 文件計劃) 為 GNU/GPL。 LDP 是 GNU/GPL 計劃之一。 額外的請求為您在所有的複製文件中保留作者的姓名、電子郵件信箱位址、 和此份版權聲明。假如您對這份文件進行修改或增添, 那麼請您告知此份文件的所有作者。 在這份文件上所登載的姓名為其各自所有人的所有權
原文 (如中譯有誤,以原文為主)
Copyright policy is GNU/GPL as per LDP (Linux Documentation project). LDP is a GNU/GPL project. Additional requests are that you retain the author's name, email address and this copyright notice on all the copies. If you make any changes or additions to this document then you please intimate all the authors of this document. Brand names mentioned in this document are property of their respective owners.