1. 程式人生 > >程式設計師修電腦必備: 使用Grub2製作一個多系統(WinPE與Linux, Android X86)啟動的維護行動硬碟和U盤

程式設計師修電腦必備: 使用Grub2製作一個多系統(WinPE與Linux, Android X86)啟動的維護行動硬碟和U盤

說明

多臺計算機安裝了不同的系統(Windows, Linux, MacOS), 如果要對系統進行重灌或者維護, 每一次都是重新制作啟動和維護移動儲存裝置, 為了節省時間, 考慮製作一個即可啟動和維護Windows的也可以啟動和安裝Linux的多啟動移動儲存裝置. 現代的電腦主機板上面的韌體(BIOS)可以支援Legacy BIOS啟動也可以支援UEFI啟動, 下面我們指的是Legacy BIOS, 當然最後也說明了一下製作UEFI啟動盤.

這裡面使用移動U盤和行動硬碟都測試實踐沒有問題. 以下是過程.

如果你想製作一個和我這個一樣的多系統啟動維護移動裝置,那麼可以看最後的總結部分, 通過幾個步驟完成, 所有的檔案我都會上傳. 

作用

多系統啟動的移動儲存裝置可以完成但是不限於下面這些功能

  1. 維護系統, 例如grub2引導修復, windows啟動修復, 系統recovery
  2. 資料恢復
  3. 防毒
  4. 備份資料
  5. 裝機,系統的備份還原
  6. (購買電腦時的)硬體檢測
  7. 隨身系統

製作環境

因為個人習慣用Linux, 這裡用的是Ubuntu 14.04.4 X64, 如果使用Windows, 那麼也可以使用grub2 windows版本來製作, 如果是其他Linux Distribution, 那麼只要安裝了Grub2也可以完成製作.

下面裝置是我用的,測試的裝置, 具體中, 只要有一個4GB甚至2GB的U盤即可, 如果期望裝入很多系統, 那麼就需要size大些:

  • 行動硬碟500GB, MBR, 分割槽多個,具體見下文.
  • U盤一個, 16GB, MBR, 活動分割槽為FAT16, 從而可以作為UEFI啟動介質.

製作過程

安裝Grub2

在Ubuntu 14.04下面安裝grub2到行動硬碟或者U盤非常容易, 先確定自己的移動儲存裝置的節點, 例如下面是我的行動硬碟的裝置節點以及分割槽:


然後具體的裝置與分割槽資訊如下:

$ sudo fdisk -l /dev/sde

Disk /dev/sde: 500.1 GB, 500107862016 bytes
64 heads, 32 sectors/track, 476940 cylinders, total 976773168 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: 0xf0b1ebb0

   Device Boot      Start         End      Blocks   Id  System
/dev/sde1   *   871911424   976771071    52429824    7  HPFS/NTFS/exFAT
/dev/sde2           16166   871910464   435947149+   f  W95 Ext'd (LBA)
/dev/sde5           16198   419762384   209873093+   7  HPFS/NTFS/exFAT
/dev/sde6       419762448   696257099   138247326    7  HPFS/NTFS/exFAT
/dev/sde7       696257163   871910464    87826651    7  HPFS/NTFS/exFAT

Partition table entries are not in disk order
可以看到sde1為"活動"分割槽, 即Boot分割槽, 然後mount資訊如下:
$ mount | grep sde1
/dev/sde1 on /media/hexiongjun/PE type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)

另外這個sde1是NTFS分割槽格式的.

驅動好這些資訊後, 我們使用下面命令安裝:

sudo grub-install --boot-directory=/media/hexiongjun/PE/grub2 --removable /dev/sde
注意--boot-directory為grub存放的路徑, 這個是放在了裝置的這個分割槽的grub2目錄下面, 最後一個引數是裝置節點路徑, 不是分割槽路徑.

如果沒有錯誤,那麼會提示:

$ sudo grub-install --boot-directory=/media/hexiongjun/PE/grub2 --removable /dev/sde
Installing for i386-pc platform.
Installation finished. No error reported.
至此, 我們就安裝好了grub2到這個行動硬碟中了.

配置

完成了grub2的安裝之後,我們需要配置grub2,讓其知道該載入什麼檔案, 當然, 也可以不配置, 然後啟動後直接全部手動輸入來引導也是可以的. 

配置檔案放在:

/media/hexiongjun/PE/grub2/grub/grub.cfg
這個其實配置了啟動的選單, 這裡面我們的內容如下:
set timeout=10
set default=0

menuentry "Ubuntu 14.04.4 X64 Live ISO" {
    loopback loop /ubuntu-14.04.4-desktop-amd64.iso
    linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.4-desktop-amd64.iso splash --
    initrd (loop)/casper/initrd.lz
}

menuentry "Windows 10PE x64 ISO" {
        set root='(hd0,msdos1)'
    set g4d_dir="/Grub4dos/"
    set cfgfile="find --set-root /PE/ConcisePE_Win10x64.iso;map --mem /PE/ConcisePE_Win10x64.iso (0xff);map --hook;chainloader (0xff);boot"
    linux $g4d_dir/grub.exe --config-file=$cfgfile
}

menuentry "WindowsPE UQi ISO" {
        set root='(hd0,msdos1)'
    set g4d_dir="/Grub4dos/"
    set cfgfile="find --set-root /PE/UQi_USBsys_2017.iso;map --mem /PE/UQi_USBsys_2017.iso (0xff);map --hook;chainloader (0xff);boot"
    linux $g4d_dir/grub.exe --config-file=$cfgfile
}

menuentry "AcronisTrueImage2017" {
        set root='(hd0,msdos1)'
    set g4d_dir="/Grub4dos/"
    set cfgfile="find --set-root /PE/AcronisTrueImage2017_NG.iso;map --mem /PE/AcronisTrueImage2017_NG.iso (0xff);map --hook;chainloader (0xff);boot"
    linux $g4d_dir/grub.exe --config-file=$cfgfile
}

menuentry "Porteus 3.2 ISO" {
    set isofile=/PE/Porteus-3.2-i586-20170206.iso
    search --set -f $isofile
    loopback loop $isofile
    linux (loop)/porteus/vmlinuz from=$isofile
    initrd (loop)/porteus/initrd.xz
}

這裡共有五項啟動專案, 分別為2個Linux, 3個PE相關的WindowsOS, 其中PE ISO的啟動用到了grub4dos, 本身grub2也可以引導ISO,但是我測試發現使用memdisk的方式在某些機器上面會有問題, 因此乾脆直接就用grub4dos吧.

2017/03/06更新 新增Android X86的啟動引導:

menuentry "Android-x86 Live" {
    loopback loop /android_x86.iso
    linux (loop)/kernel boot=casper iso-scan/filename=/android_x86.iso root=/dev/ram0 androidboot.hardware=android_x86 video=-16 quiet SRC= DATA=
    initrd (loop)/initrd.img
}


因為用到了grub4dos, 而grub4dos也是bootloader, 因此其實就是grub2--> grub4dos --> PE, 因此我們需要將grub4dos的檔案(點選即可下載)放到硬碟中:

$ ls /media/hexiongjun/PE/Grub4dos/
back.jpg  font6500.gz  grldr  grldr4.mbr  grldr.mbr  grub.exe  ipxegrldr  menu.lst  menu_out.lst  message  說明

裡面有一個grub.exe, 這個就是grub4dos的載入程式, 你可以認為是kernel/zImage, 或者是認為raw executive file.

這個Grub4dos, 我已經上傳, 可以到這裡面下載, 如果你需要的話, 下載後解壓到移動裝置的啟動分割槽即可.

grub.cfg載入的檔案

這裡面我們全部都是iso檔案, 一些位於PE目錄下, ubuntu位於裝置分割槽根目錄下面:

$ ls /media/hexiongjun/PE/ubuntu-14.04.4-desktop-amd64.iso 
/media/hexiongjun/PE/ubuntu-14.04.4-desktop-amd64.iso

$ ls /media/hexiongjun/PE/PE/
AcronisTrueImage2017_NG.iso  ConcisePE_Win10x64.iso  Porteus-3.2-i586-20170206.iso  UQi_USBsys_2017.iso

更新grub.cfg後生效配置

直接編輯grub.cfg後是不會生效的,我們還需要使用update-grub2或者grub-mkconfig來使更新了的配置生效,  但是這裡我們使用和前面update install一樣的命令來更新, 即重新執行前面的命令即可完成更新:

sudo grub-install --boot-directory=/media/hexiongjun/PE/grub2 --removable /dev/sde
Installing for i386-pc platform.
Installation finished. No error reported.

測試

因為實機開機關機慢, 在Linux下面我們直接使用qemu來測試, 例如:

sudo qemu-system-x86_64 -machine accel=kvm:tcg -m 3072 -hda /dev/sde
最後的是裝置節點作為hard disk, 中間還有一個-m 3072, 指的是specify memory 3GB, 如果太小,那麼grub4dos在載入iso檔案到記憶體的時候會出錯. 

如果是使用memdisk來載入的話,也會出現問題, 例如下面的載入會出現out of memory:

如果沒有什麼問題,那麼就會出現grub中的配置的boot menu:


如果我們選擇啟動WinPE,那麼grub4dos就會載入ISO到memory:

載入完成後, 就可以選擇啟動, 例如下面是啟動了ATI的image:


下面是Porteus Linux:


Grub2的基本語法解釋

menuentry

如果要新增一個ISO, 那麼我們可以再新增一個menuentry, 然後再次grub2-install即可. 那麼下面說明一下menuentry的內容與語法:

menuentry "Ubuntu 14.04.4 X64 Live ISO" {
    loopback loop /ubuntu-14.04.4-desktop-amd64.iso
    linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.4-desktop-amd64.iso splash --
    initrd (loop)/casper/initrd.lz
}

loopback: 即為blcok device 的loopback , 第一句將iso檔案mount 到loopback 裝置loop上面

linux: 變數指定要啟動的linux kernel, 但是也可以是其他的可以執行的檔案, 例如前面提到的grub4dos的grub.exe. 

initrd: 即initrd 最小系統, 具體可以看我以前的PPT分享講解的initramfs與initrd的區別. 可以沒有.

linux後還需要指定boot parameters, 即相當於u-boot中的bootargs, 傳入到Linux kernel中的cmdline.

也可以指定對應要執行的程式自定義的引數, 例如--config. 

裝置檔案

前面我們看到了loop為一個block loopback裝置, 後面的linux與initrd都是從這裡面來指定的, 裝置檔案使用()來表示.

使用ls來檢視所有檔案, 使用ls帶裝置來檢視某個裝置分割槽:

同時從前面也可以看到, 如果我們需要檢視某個裝置的UUID是可以通過這個ls來獲取的

下面是使用ls來檢視檔案:

幫助

如何檢視某個命令的幫助

要麼線上看

有的命令有-h選項


文件教程

如果期望檢視grub2的文件,那麼可以參考下面這個文件, 非常詳細, 包含安裝定製與使用:

如何手動測試

使用Qemu來啟動裝置, 並測試grub2,以及確定我們寫的grub.cfg是很有必要的, 例如通過選擇menuentry但是無法啟動, 但是卻找不到原因, 那麼我們就可以通過手動來輸入menuentry來一步步確定問題出現在哪裡. 要手動測試, 那麼就需要進入到Grub2的命令列模式, 這個和其他Bootloader的cmdline模式類似, 例如在UBoot中啟動前的bootdelay時間內敲下Space按鍵(hotkey), 可以進入到cmdline中, 而Grub2中這個按鍵是c, 因此要除錯,那麼在grub執行後, 輸入c即可進入到上面圖中類似的cmdline中.

載入grub.cfg檔案

grub2使用命令configfile載入配置檔案,  我們使用: configfile /Path/To/grub.cfg  那麼就可以載入這個配置, 如果是我們前面的grub.cfg, 那麼就會出現選單, 並根據timeout 與 default選項選擇某個menuentry, 並倒計時. 

手動啟動系統與測試

每一個menuentry可能都是由下面三個部分組成: linux, initrd, 引數. 每一個menuentry的執行過程如下: 執行menuentry{}中的內容, 然後再執行boot命令, 例如下面這個:
menuentry "Ubuntu 14.04.4 X64 Live ISO" {
    loopback loop /ubuntu-14.04.4-desktop-amd64.iso
    linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.4-desktop-amd64.iso splash --
    initrd (loop)/casper/initrd.lz
}

先使用loopback mount ISO檔案 linux變數指定為後面的vmlinuz.efi, 後面的從boot=casper開始到這行結束都是cmdline或者選項 initrd變數指定了initrd檔案 最後grub呼叫boot命令, boot命令根據linux與initrd等變數啟動對應的可執行檔案, 最後這一步boot屬於是hidden operation, 並沒有在menuentry中.

新增UEFI啟動

WinPE UEFI

UEFI需要FAT32 FS, 因此使用我們的U盤為例, 如果你有一個WPE ISO支援UEFI啟動,那麼直接mount ISO, 然後講裡面的內容拷貝到這個FAT32啟動分割槽即可. 例如前面的Concise即支援.

grub2的UEFI啟動

grub2的install中有一個UEFI的對應選項, man手冊可以找得到.

或者通過man grub-install , 然後search efi看到對應的選項.

注意事項

WinPE使用memdisk啟動問題

網上都是參考這篇文章的說法, 使用memdisk來啟動WinPE ISO,但是實際上是可能出現問題的. 尤其是Size較大的Windows 8 PE或者Windows 10 PE.

如果你的WinPE ISO比較大,那麼不要使用memdisk的方式來啟動, 否則會出現下面這個問題:


就算在Qemu中沒有問題, 但是在某些實機上面卻會出現問題, 使用grub4dos沒有這個問題

Qemu無法啟動某些WinPE

可能會出現類似下面這種情況, 其實Windows是啟動了, 但是因為qemu的問題, 導致無法正常啟動:


這個是因為使用了Qemu qvm的緣故.

其他啟動類製作與輔助工作

BOOTICE

Easy2Boot

用來快速製作多系統啟動U盤,但是需要Format 分割槽.

YUMI

與Easy2Boot類似.

新增ISO的WinPE映象啟動項

參考下面這個GIF動畫, 來源於戀夢PE, 用的是EasyBCD, 這個適用於系統安裝完成後, 新增一個PE系統從而方便維護:


參考

Grub4dos參考下載連結中的說明裡面的chm

總結

下面說一下如何製作和測試, 以及使用

  • 2. 安裝grub2到移動儲存裝置
  • 3. 配置grub.cfg, 可以參考前面的內容
  • 4. 再次執行grub-install完成grub.cfg的配置更新
  • 5. 使用qemu測試
  • 6. 使用實機測試與使用

相關推薦

程式設計師電腦必備: 使用Grub2製作一個系統(WinPELinux, Android X86)啟動維護行動硬碟U

說明 多臺計算機安裝了不同的系統(Windows, Linux, MacOS), 如果要對系統進行重灌或者維護, 每一次都是重新制作啟動和維護移動儲存裝置, 為了節省時間, 考慮製作一個即可啟動和維護Windows的也可以啟動和安裝Linux的多啟動移動儲存裝置. 現代的電

Ubuntu裝在行動硬碟或者U在任何電腦上使用

1、把Ubuntu裝在行動硬碟或者U盤,網上有很多教程;2、使用boot-repair修復引導,因為沒有直接把UBuntu安裝在硬碟可以在任何電腦上啟動的,都需要修復引導:如果你是windows+ubuntu的雙系統,那麼重灌windows之後(非ghost方式),是會直接進

程式設計師仙之路- CXO讓我做一個計算器!!

菜菜呀,個稅最近改革了,我得重新計算你的工資呀,我需要個計算器,你開發一個吧 CEO,CTO,

程式設計師雙十一必備購物清單

程式設計師雙十一必備購物清單 這手還剁不剁? 小智 2018 年 11 月 9 日 話題:硬體文化 & 方法其他阿里巴巴 這篇文章不會教你去怎麼研究花裡胡哨的雙十一購物規則(其實是我們自己也不會),只想給你推薦一些你可能用得著的商品清單。如果用不著,那也沒

使用程式設計師電腦是什麼感覺,網友:不敢了,沒有下次了!

程式設計師是一個天天和電腦打交道的群體,程式設計師肯定是最瞭解電腦的群體了,在外人看來,程式設計師用電腦就是得心應手啊,那麼程式設計師使用電腦和平常人有什麼區別嗎?很多網友也同樣好奇,於是試著去體 程式設計師甲: 我用的linux,wm用了awesome(就是你只能用快捷鍵操作所有的東

程式設計師程式設計入門必備的7大工具,你用過幾個?

作為入門級別的程式設計師,幾款趁手的程式設計軟體是最需要的。除了Git、Visual Basic……等等,其實還有很多很很酷的程式設計工具。接下來就給大家看7款不一樣的程式設計工具,如有心動,純屬巧合。 0.Warp,一款非常簡單且由於共享的工具。 Warp允許任何人共享他們的終端。只

領導週末喊程式設計師 bug,程式設計師 我是來上班的,不是賣身的

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

程式設計師面試過關必備網站,你用過幾個?

對於程式設計師而言,面試所謂是人生重要的一件事情,在這之前,還是有必要刷一些程式設計面試題,為面試做好充足的準備! 今天小編給大家分享一些面試相關網站,給大家面試來一波神助攻噢! 在Reddit網站上,你可以討論一些程式設計開發的問題,瞭解最新的IT熱點資訊。

程式設計師程式碼面試指南》給定一個整數n,返回從1到n的數字中1出現的次數

題目: 給定一個整數n,返回從1到n的數字中1出現的次數。 例如: n=5,1~n為1,2,3,4,5。那麼1出現1次所以返回1。 n=11,1~n為1,2,3,4,5,6,7,8,9,10,11。那麼1出現的次數為1(1,10,11)返回4。 import j

程式設計師程式碼面試指南》 給定一個整型矩陣 matrix 請按照轉圈的方式列印它

題目 給定一個整型矩陣 matrix ,請按照轉圈的方式列印它。 例如: 1    2    3     4 5    6    7     8 9    10  11   12 13  14  15   16 列印結果為:1,2,3,4,8

使用程式設計師電腦是怎樣的一種體驗?網友:沒圖示的桌面不會用!

程式設計師作為一個全天候接觸電腦的職業,我想應該沒有誰能夠比他們更加了解電腦的使用了。那麼程式設計師使用的電腦跟我們用的有什麼區別嗎?有很多網友也同樣好奇,於是試著去體驗一下,結果鬧出了許多逗逼事! 程式設計師甲: 我用的linux,wm用了awesome(就是你只能

使用程式設計師電腦是怎樣的一種體驗?網友:沒圖示的桌面不會用了

程式設計師作為一個全天候接觸電腦的職業,我想應該沒有誰能夠比他們更加了解電腦的使用了。那麼程式設計師使用的電腦跟我們用的有什麼區別嗎?有很多網友也同樣好奇,於是試著去體驗一下,結果鬧出了許多逗逼事! 程式設計師甲: 我用的linux,wm用了awesome(就

Java程式設計師高效開發必備工具,其中有你的最愛嗎?

對於Java程式設計開發,有兩種不同的觀點:一種認為Java是最簡單功能最強大的程式語言之一,另一種則表示這種程式語言既難用又複雜。,每個工具都有其優點,學習這些具有可以幫助開發者改善程式碼質量,從而成為一個更高效的開發人員。 下面這些工具或許功能和作用不同,但是有著一個共同的主旨,那就是——它

#使用程式設計師電腦是什麼感覺,網友:不敢了,沒有下次了!

程式設計師是一個天天和電腦打交道的群體,程式設計師肯定是最瞭解電腦的群體了,在外人看來,程式設計師用電腦就是得心應手啊,那麼程式設計師使用電腦和平常人有什麼區別嗎?很多網友也同樣好奇,於是試著去體驗一下,結果鬧出了許多逗逼事! 如果有想學習java的程式設計師,

做個程式設計師太難了,公司竟然強制要求所有程式設計師統一電腦桌面

在職場上經常會遇到一些奇葩的規定,相信不少人都遇到過,因為在公司打工,所以面對這些奇葩規定也是很無奈,只能選擇妥協,那麼大家都遇到過哪些奇葩的規定呢?最近就在職場論壇看到一個公司的奇葩規定。 一家公司要求所有的程式設計師都統一電腦桌面,這位程式設計師朋友直接表示程式設計師連自己的桌面桌布都不能擁

Java 程式設計師 面試前必備知識

                     前言正文自我介紹Java篇計算機網路作業系統資料庫相關XML常識性知識總結前言準備了接近兩個月的面試筆試,現在終於是可以休息下了。真真是應了那句老話“臺上一分鐘, 臺下十年功。”。人嘛,越努力,才會越幸運。機會總是留給有準備的人的。下面分享一下我的Java實習生準備所

企業要求程式設計師統一電腦桌面,網友:桌面桌布都不配擁有?

在職場上經常會遇到一些奇葩的規定,相信不少人都遇到過,因為在公司打工,所以面對這些奇葩規定也是很無奈,只能選擇妥協,那麼大家都遇到過哪些奇葩的規定呢?最近就在職場論壇看到一個公司的奇葩規定。 一家公司要求所有的程式設計師都統一電腦桌面,這位程式設計師朋友直接表示程式設計師連自己的桌面桌布都不能擁

公司強制要求所有程式設計師統一電腦桌面,網友:做個程式設計師太難了!

在職場上經常會遇到一些奇葩的規定,相信不少人都遇到過,因為在公司打工,所以面對這些奇葩規定也是很無奈,只能選擇妥協,那麼大家都遇到過哪些奇葩的規定呢?最近就在職場論壇看到一個公司的奇葩規定。 一家公司要求所有的程式設計師都統一電腦桌面,這位程式設計師朋友直接表示程式設計師連自己的桌面桌布都不能擁

【本人禿頂程式設計師】Java程式設計師漲薪必備技術棧(1-5年必看)

←←←←←←←←←←←← 快!點關注!!! 如果你的目標僅僅是提高自己,那麼很容易實現,但是如果你的目標是成為一個偉大的程式設計師,那麼這就不簡單了。 很多人都願意說,我想變得更好,但是更好是什麼卻很模糊,而且人們也不知道該怎麼樣去做。 時間到了,提高你的程式設計技能,認真+嚴

使用Ubuntu18.04打造程式設計師辦公電腦

安裝篇應用推薦gnome-tweak-toolgnome美化工具,可改變主題,圖示,字型等。sudo apt install gnome-tweak-tooluget一個介面下載工具,可配合aria2sudo add-apt-repository ppa:plushuang-tw/uget-stable su