tags: Linux
OS
GRUB
硬盤分區(qū)
背景
2016年雙十一入手了一塊500G的 SSD(Solid State Drive锄贷,固態(tài)硬盤)翩迈,打算安裝到自己的筆記本上姑荷。筆記本的 HDD(Hard Disk Drive伟葫,機(jī)械硬盤)已經(jīng)跑了 Ubuntu16.10 + Win10 雙系統(tǒng)鼓蜒。光驅(qū)位的硬盤支架也裝好了家乘,一直虛位以待。工作忙一直拖到了2017年固棚。
公司的 PC 機(jī)器也是 Ubuntu16.10统翩,并且安裝的軟件比較齊全仙蚜,所以計劃將 PC 的 Ubuntu16.10 遷移到 SSD 上,然后在筆記本上運(yùn)行厂汗。
開工準(zhǔn)備
- Ubuntu16.10委粉,PC 上安裝,各項遷移步驟運(yùn)行的環(huán)境并作為要遷移到 SSD 的系統(tǒng)面徽。
- Gparted Partition Editor艳丛,圖形化的分區(qū)工具。
- 外接硬盤盒趟紊,通過 USB 線將 SSD 連接到 PC 上。
基礎(chǔ)知識
該章節(jié)是計算機(jī)啟動和系統(tǒng)加載的一些概念碰酝,有助于加深對遷移原理的理解霎匈,注重實踐的話可以直接跳過。
總結(jié)不一定準(zhǔn)確送爸,僅作為個人理解铛嘱。干貨可以看這篇文章:uefi-boot-how-does-that-actually-work-then
BIOS vs UEFI
BIOS(Basic Input/Output System)和 UEFI(Unified Extensible Firmware Interface )是不同的計算機(jī)啟動固件(Fireware),需要硬件(通常為主板)支持袭厂,相互代替的墨吓,其中 UEFI 是比較新的方式。
BIOS
經(jīng)典的啟動固件纹磺,會調(diào)用磁盤的 MBR帖烘,然后由 MBR 中的 loader 繼續(xù)加載操作系統(tǒng)。UEFI
UEFI 用來代替 BIOS橄杨,并克服 BIOS 的缺點(diǎn)秘症,大多數(shù)的 UEFI 固件會提供兼容 BIOS 的啟動方式。區(qū)別
可以看這篇文章:[UEFI是什么式矫?與BIOS的區(qū)別在哪里?][UEFI是什么乡摹?與BIOS的區(qū)別在哪里]
MBR vs GPT
MBR 與 GPT 用于存儲硬盤的分區(qū)信息,是不同的硬盤分區(qū)表類型采转。
MBR
MBR 表示 MBR 分區(qū)表聪廉,MBR 分區(qū)表在硬盤開頭處存放了特殊的啟動分區(qū),稱為 MBR(Master Boot Record故慈,主啟動記錄)板熊,包含 Boot Loader 和硬盤邏輯分區(qū)。MBR 支持最大約2T的硬盤惯悠,最多能劃分4個主分區(qū)邻邮,更多分區(qū)需要使用拓展分區(qū)實現(xiàn)。
(MBR
在行文中可以表示MBR 分區(qū)表
和主啟動記錄
兩個意思克婶,注意甄別筒严。)GPT
GPT 表示 GUID(Globally Unique Identifier) 分區(qū)表丹泉,是 UEFI 規(guī)范的一部分,用于替換 MBR 的分區(qū)方式鸭蛙。GPT 沒有分區(qū)數(shù)和分區(qū)大小限制摹恨。區(qū)別
可以看這篇文章:[What’s the Difference Between GPT and MBR When Partitioning a Drive][What’s the Difference Between GPT and MBR When Partitioning a Drive]
File System
File System(文件系統(tǒng))是存儲媒介中文件存儲的組織方式。
不同的文件系統(tǒng)類型有不同的速度娶视,靈活性晒哄,安全性和占用空間。不同操作系統(tǒng)只支持特定的文件系統(tǒng)類型肪获。
常見的文件系統(tǒng)類型有 FAT16寝凌,F(xiàn)AT32,NTFS孝赫,EXT3较木,EXT4,HFS 等青柄。
磁盤發(fā)展史
Wikipedia 上有許多關(guān)于磁盤的資料伐债,在磁盤分區(qū)上,我猜測的發(fā)展脈絡(luò)是這樣的:
- 磁盤跟內(nèi)存一樣直接物理尋址去訪問數(shù)據(jù)致开;
- 為了方便峰锁,建立數(shù)據(jù) Index,有了 File System双戳;
- 需要多個分區(qū)虹蒋,搞出了 Partition Tabel。
小結(jié)
- BIOS/UEFI 跟 MBR/GPT 是不同層級的拣技,BIOS/UEFI 是 Fireware千诬,MBR/GPT 是分區(qū)表。
- 推薦的使用方式: BIOS + MBR 或 UEFI + GPT:
If you want to do a ‘BIOS compatibility’ type installation, you probably want to install to an MBR formatted disk.
If you want to do a UEFI native installation, you probably want to install to a GPT formatted disk.
- 理論上來說是可以組合使用的:
Of course, to make life complicated, many firmwares can boot BIOS-style from a GPT formatted disk.
UEFI firmwares are in fact technically required to be able to boot UEFI-style from an MBR formatted disk.
- Windows 通常會要求 UEFI 的啟動方式使用 GPT膏斤,不然不給繼續(xù)安裝徐绑。
SSD 分區(qū)
硬盤狀態(tài)
使用外接硬盤盒,將 SSD 連接到 PC 機(jī)上莫辨,先查看硬盤狀態(tài):
$ sudo fdisk -l
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xb2708ce0
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 411647 409600 200M 7 HPFS/NTFS/exFAT
/dev/sda2 411648 210126847 209715200 100G 7 HPFS/NTFS/exFAT
/dev/sda3 210128894 913704959 703576066 335.5G f W95 Ext'd (LBA)
/dev/sda5 210128896 703989759 493860864 235.5G 83 Linux
/dev/sda6 703991808 704966655 974848 476M 83 Linux
/dev/sda7 704968704 764067839 59099136 28.2G 83 Linux
/dev/sda8 764069888 771973119 7903232 3.8G 82 Linux swap / Solaris
Partition 3 does not start on physical sector boundary.
Disk /dev/sdb: 489.1 GiB, 525112713216 bytes, 1025610768 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 33553920 bytes
其中/dev/sda
為 PC 上的硬盤傲茄,裝有 Ubuntu16.10 + Win7;/dev/sdb
為 SSD沮榜,當(dāng)前 SSD 為空盤盘榨。
分區(qū)策略
- 筆記本是 2011 年的機(jī)器,主板啟動引導(dǎo)好像不支持 UEFI蟆融,是用 BIOS草巡。
- 考慮 SSD 的拓展性,分區(qū)表選擇 GPL型酥,選用的引導(dǎo)方式為 BIOS + GPT山憨。
- 此時安裝 GRUB 引導(dǎo)對分區(qū)劃分有要求查乒,具體參考接下文的《GRUB 引導(dǎo)》章節(jié)。
-
先上分區(qū)結(jié)果:
(注:前文出現(xiàn)的/dev/sdb1
郁竟,/dev/sdf1
和后面可能出現(xiàn)的/dev/sd#1
都為同一個分區(qū)玛迄,因為多次插拔了 SSD ,所以標(biāo)識一直按字母序遞增)
- 不建立
/swap
分區(qū)了棚亩,因為 Ubuntu17.04也要移除 swap 分區(qū)蓖议。 -
/dev/sdf1
分區(qū),建立 GRUB 引導(dǎo)所需分區(qū)讥蟆,大小為 1M勒虾,分區(qū)文件類型為unformatted
,分區(qū) flag 為bios_grub
瘸彤。 -
/dev/sdf2
分區(qū)从撼,Linux/boot
分區(qū),大小 1G钧栖。 -
/dev/sdf3
分區(qū),Linux/
分區(qū)婆翔,大小 50G拯杠。 -
/dev/sdf4
分區(qū),Linux/home
分區(qū)啃奴,大小 300G潭陪。
分區(qū)操作
分區(qū)操作在 Gparted 軟件中完成,命令行fdisk
和parted
也可以操作最蕾,但是我不熟悉依溯。
- 建立分區(qū)表
SSD 是一個空磁盤,此時并沒有分區(qū)表瘟则,所以要先建立分區(qū)表黎炉。分區(qū)表的格式選用 GPT:
- 打開 Gparted,點(diǎn)擊
Device
-->Created Partition Table
醋拧。 - 選擇
partition tabel type
為gpt
慷嗜,然后點(diǎn)擊Apply
。
- 建立 GRUB 所需分區(qū)
-
分區(qū)大小為1M丹壕,分區(qū)類型為
unformatted
庆械。
-
在新建的分區(qū)上點(diǎn)擊右鍵,選擇
managerFlags
菌赖,然后選中bios_grub
選項缭乘。
- 建立 Linux 系統(tǒng)分區(qū)
根據(jù)上文<<分區(qū)策略>>章節(jié),依次建立其他分區(qū)琉用,分區(qū)的文件格式選擇ext4
堕绩。
分區(qū)結(jié)果:
$ sudo fdisk -l /dev/sdh
Device Start End Sectors Size Type
/dev/sdh1 2048 4095 2048 1M BIOS boot
/dev/sdh2 4096 2101247 2097152 1G Linux filesystem
/dev/sdh3 2101248 106958847 104857600 50G Linux filesystem
/dev/sdh4 106958848 736104447 629145600 300G Linux filesystem
GRUB 引導(dǎo)
GRUB 是什么
GRUB(Grand Unified Boot loader)是硬盤中的軟件策幼,引導(dǎo)器(loader)的一種。目前主流版本是 GRUB2逛尚,可以看 [GRUB2 中文介紹][GRUB2 中文介紹]垄惧。
GRUB 用于從多操作系統(tǒng)的計算機(jī)中選擇一個系統(tǒng)來啟動,或從系統(tǒng)分區(qū)中選擇特殊的內(nèi)核配置绰寞。
provides a user the choice to boot one of multiple operating systems installed on a computer or select a specific kernel configuration available on a particular operating system's partitions. -- GRUB
示例:
如圖:第一個選項和最后一個選項是選擇不同的操作系統(tǒng)到逊;第一個選項和第二個選項是選擇不同的內(nèi)核配置。
GRUB 位置
其啟動代碼(boot.img)直接安裝在 MBR 中滤钱,然后執(zhí)行 GRUB 內(nèi)核鏡像(core.img)觉壶,最后從/boot/grub
中讀取配置和其他功能代碼。
BIOS 引導(dǎo)方式中件缸,MBR 分區(qū)表和 GPT 分區(qū)表的 GRUB 引導(dǎo)文件所放分區(qū)不同:
如圖铜靶,GRUB 的執(zhí)行順序為 boot.img
--> core.img
--> /boot/grub/
。
- 在 MBR 分區(qū)表中他炊,
boot.img
和core.img
都在 MBR 中争剿。MBR 雖然只占用一個扇區(qū)(512Byte),但是其所在的磁道是空閑的痊末,不會用于分區(qū)蚕苇,可以放下core.img
。
Some MBR code loads additional code for a boot manager from the first track of the disk, which it assumes to be "free" space that is not allocated to any disk partition, and executes it. -- MBR
- 在 GPT 分區(qū)表中,MBR 為 protected MBR(為兼容 MBR,在硬盤起始位置保留的空間)缩幸,后面并沒有空間放
core.img
褪迟,需要建一個專門的分區(qū)來放,稱為BIOS boot partition,該分區(qū)的文件類型為unformatted
,flag 為BOIS_grub
,該 flag 用于標(biāo)識core.img
所要安裝到的分區(qū)恩沽。若果使用 UEFI 引導(dǎo),GRUB 讀取的是 ESP 分區(qū)中的數(shù)據(jù)切心,不需要 flag 為BIOS_grub
的分區(qū)飒筑。
建立 GRUB 引導(dǎo)
使用 grup-install 的教程來安裝 GRUB 到 SSD 盤。
- 掛載
/boot
掛載 SSD 的/boot
為 PC Ubuntu 的/mnt
绽昏,因為我們需要將 GRUB 配置文件放入 SSD 的/boot/grub
中协屡。
$ sudo mount /dev/sdb2 /mnt
- 安裝 GRUB
執(zhí)行以下命令:
$ sudo grub-install --target=i386-pc --root-directory=/mnt --recheck --debug /dev/sdb
如果看到以下輸出,應(yīng)該就是成功了:
...
Installation finished. No error reported.
此時/mnt
目錄下全谤,應(yīng)該有一個./boot/grub
的文件夾:
/mnt/boot/grub ? 20:54:33
$ ls
fonts grubenv i386-pc locale
- 修復(fù)
/grub
位置
查看下 PC Ubuntu 的/boot
,/grub
是直接放置在/boot
下的:
/boot/grub ? 13:30:33
$ ls
fonts gfxblacklist.txt grub.cfg grubenv i386-pc locale unicode.pf2
而grub-install /dev/sdb
安裝的 GRUB 是/mnt/boot/grub
肤晓,其中/mnt
是 SSD /dev/sdb2
分區(qū),從 SSD 啟動 Ubuntu 的話,/dev/sdb2
會掛載為/boot
补憾,此時 GRUB 的位置是/boot/boot/grub
漫萄。而當(dāng)grub-install /dev/dsa
安裝 GRUB 到 PC Ubuntu 啟動磁盤時,生成的/grub
是在/boot/grub
盈匾。grub-install
的處理邏輯應(yīng)該是先判斷/boot
路徑是否存在腾务,沒有就新建。
所以削饵,要將/mnt/boot/grub
移動到/mnt/grub
:
$ sudo mv /mnt/boot/grub /mnt/grub
GRUB 引導(dǎo)修復(fù)類型
啟動電腦后岩瘦,當(dāng) GRUB 無法按照boot.img
--> core.img
--> /boot/grub/
順序執(zhí)行時,會看到命令行界面窿撬,等待用戶輸入命令启昧。此時可以通過輸入 GRUB 內(nèi)置的命令來修復(fù) GRUB 引導(dǎo)。
boot.img
是寫在 MBR 中的劈伴,如果不能執(zhí)行密末,直接跟 GRUB 引導(dǎo)方式說再見了,所以執(zhí)行boot.img
一般沒問題跛璧。boot.img
不能識別任何文件系統(tǒng)严里,core.img
的位置是硬編碼進(jìn)boot.img
的,所以執(zhí)行boot.img
一般沒問題追城。因此田炭,常見的引導(dǎo)問題集中在/boot/grub/
,主要有兩種漓柑,對應(yīng)有兩種引導(dǎo)修復(fù)模式:
GRUB Rescue 模式
GRUB Rescue 模式是 GRUB 無法找到/boot
分區(qū),也就無法找到/boot/grub/
叨吮。修復(fù)方法可以參考:grub rescue 模式下修復(fù)辆布。GRUB Normal 模式
GRUB Normal 模式是 GRUB 無法找到 GRUB 菜單grub.cfg
,無法選擇合適的內(nèi)核或系統(tǒng)來啟動茶鉴。修復(fù)方法可以參考:Boot GNU/Linux from GRUB锋玲。
數(shù)據(jù)復(fù)制
該步驟是把 PC 硬盤中幾個 Linux 分區(qū)的數(shù)據(jù)拷貝到 SSD 上對應(yīng)的分區(qū)。
(注意:PC Ubuntu 和 SSD Ubuntu 都有/
涵叮、/boot
惭蹂、/home
分區(qū),閱讀下文時注意辨別割粮,我有時并沒有寫得很清晰盾碗。)
操作方式
操作的套路是先將 SSD 的分區(qū)使用mount
命令掛載為 PC 的/mnt
,使用cp
命令復(fù)制數(shù)據(jù)舀瓢,再用umount
命令移出這個分區(qū)廷雅;對下一個分區(qū)做同樣操作。
- 掛載和移出操作
// 掛載
$ sudo mount /dev/sdb2 /mnt
// 移出
$ sudo umount /mnt
- 復(fù)制操作
使用cp
指令要加-r
,-f
航缀,-a
參數(shù)商架,-r
表示遞歸復(fù)制,-f
表示強(qiáng)制覆蓋芥玉,-a
表示保留原文件的屬性(mode蛇摸,ownership,tiemstamps等)
$ sudo cp -rf -a source destination
復(fù)制/boot
分區(qū)
SSD Ubuntu 的/boot
從 PC Ubuntu 上看為/dev/sdb2
灿巧,將/dev/sdb2
掛載為 PC Ubuntu 的/mnt
赶袄。安裝 GRUB 之后,/mnt
已經(jīng)有/grub
這個文件夾和默認(rèn)的lost+found
文件夾砸烦。
使用cp
將 PC 的/boot
中其他文件復(fù)制到/mnt
弃鸦。結(jié)果類似:
/mnt/ ? 13:56:06
$ ls | sort
abi-4.8.0-36-generic
config-4.8.0-36-generic
grub
initrd.img-4.8.0-36-generic
lost+found
memtest86+.bin
memtest86+.elf
memtest86+_multiboot.bin
System.map-4.8.0-36-generic
vmlinuz-4.8.0-36-generic
復(fù)制/
分區(qū)
SSD Ubuntu 的/
分區(qū)(根目錄)比較特殊:一些子目錄掛載了其他分區(qū),并存在“偽目錄”幢痘,不同子目錄有特定的用途唬格。
所以復(fù)制/
分區(qū)是有選擇性的,不區(qū)分子目錄進(jìn)行復(fù)制颜说,可能會提示“權(quán)限問題”购岗、“無法訪問”等錯誤。
不需要復(fù)制的目錄
/boot
,/home
门粪,/mnt
掛載了其他分區(qū)/media
/cdrom
掛載可移除的媒體(cdrom 等)/swap
交換分區(qū)(不需要交換分區(qū)了)需要復(fù)制的目錄
主要參考: Linux操作系統(tǒng)備份之二/bin
系統(tǒng)可執(zhí)行文件/etc
系統(tǒng)核心配置文件/opt
用戶程序文件/root
root用戶主目錄/sbin
系統(tǒng)可執(zhí)行文件/usr
程序安裝目錄/var
系統(tǒng)運(yùn)行目錄需要手動創(chuàng)建的目錄
在/mnt
中需要給 SSD 的/
創(chuàng)建幾個空目錄喊积。/dev
主要存放與設(shè)備(包括外設(shè))有關(guān)的文件/proc
正在運(yùn)行的內(nèi)核信息映射/sys
硬件設(shè)備的驅(qū)動程序信息
這幾個目錄是 Linux 內(nèi)核啟動后由內(nèi)核來掛載并存放信息的,不能從運(yùn)行中的 PC Ubuntu 復(fù)制過去玄妈,但是需要建立空目錄乾吻,不然內(nèi)核啟動后會報類似錯誤:
mount: mount point /dev does not exist
創(chuàng)建命令:
$ sudo mkdir dev proc sys
- 操作策略
- 每個目錄單獨(dú)執(zhí)行復(fù)制命令,出錯了好處理拟蜻。
復(fù)制/home
分區(qū)
掛載 SSD Ubuntu/home
到 PC Ubuntu /mnt
绎签,然后全盤復(fù)制:
$ sudo mount /dev/sdb4 /mnt
$ sudo cp -rf -a /home/* /mnt
掛載/home
和/boot
分區(qū)
SSD Ubuntu 的/home
和/boot
需要掛載到/
,掛載方法為:修改/ect/fstab
酝锅。
- 掛載
/dev/sda3
為 PC Ubuntu/mnt
- 使用
blkid
查看 SSD 各分區(qū)的 UUID
$ sudo blkid
...
/dev/sdb3 UUID="a5eb2b0c-2104-4afe-aa78-93396d3e0986" TYPE="ext4" PARTUUID="b2708ce0-07"
...
- 修改 SSD Ubuntu 的
fstab
文件
$ sudo vim /mnt/etc/fatab
fstab
文件大概是這樣子的:
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda3 during installation
UUID=a5eb2b0c-2104-4afe-aa78-93396d3e0986 / ext4 errors=remount-ro 0 1
#
# /boot was on /dev/sda2 during installation
UUID=8cba10c6-dff2-4300-a630-ab0e7a4782af /boot ext4 defaults 0 2
#
# /home was on /dev/sda4 during installation
UUID=298ba5ad-d306-4b4a-aaa8-54312590dec6 /home ext4 defaults 0 2
GRUB 引導(dǎo)修復(fù)
將 SSD 通過 USB 插入到筆記本诡必,開機(jī),選擇從 USB 啟動搔扁。此時應(yīng)該會是看到類似下圖的畫面爸舒。
說明已經(jīng)進(jìn)入到 GRUB 引導(dǎo)程序中,但是沒有 GRUB 啟動選項稿蹲,無法繼續(xù)引導(dǎo)了扭勉。距離成功僅剩一步:修復(fù) GRUB 引導(dǎo)。
指定內(nèi)核啟動
- 指定
/boot
分區(qū)和/grub
位置(好像不需要這步苛聘,GRUB Rescue 才需要)
// grub> root=hd0,gpt2
// grub> prefix=(hd0,gpt2)/grub
grub> set root=hd0,gpt2
grub> set prefix=(hd0,gpt2)/grub
- 設(shè)置啟動的 Linux 內(nèi)核
grub> linux /vmlinuz-4.8.0-36-generic ro root=/dev/sda2
- 設(shè)置虛擬內(nèi)存
grub> initrd /initrd.img-4.8.0-36-generic
- 啟動 SSD Ubuntu
grub> boot
到這一步應(yīng)該可以啟動 SSD 的 Ubuntu剖效,但是下次重新開機(jī)嫉入,又需要手動指定內(nèi)核才能啟動,通過在 SSD Ubuntu 中重建 GRUB 引導(dǎo)可以解決該問題璧尸。
重建 GRUB 引導(dǎo)
從 SSD 開啟 Ubuntu 成功后咒林,執(zhí)行以下命令:
$ sudo update-grub
$ sudo grub-install /dev/dsa
以上命令更新了 GRUB 可引導(dǎo)的系統(tǒng)/內(nèi)核列表:/boot/grub/grub.cf
,并重新安裝了 GRUB爷光〉婢海可以參考:Grub2/Installing。
筆記本下次開機(jī)蛀序,就能看到類似畫面:
完成
將 SSD 放入筆記本內(nèi)置硬盤位欢瞪,將舊的 HDD 放到光驅(qū)位置,開機(jī)徐裸,完成G补摹(撒花)!
結(jié)語
總共花了三天時間搞定這個事情重贺,整理出文章花了N天骑祟,查看了很多資料,對計算機(jī)開機(jī)引導(dǎo)气笙,硬盤分區(qū)和 GRUB 算是比較了解了次企。
現(xiàn)在筆記本有了 SSD + HDD,下一步可能會實踐雙硬盤的數(shù)據(jù)備份潜圃。
最后放上 HDD 凌亂的分區(qū)圖缸棵,紀(jì)念這幾年裝機(jī)折騰的日子。折騰中總有收獲谭期。
Refenrences
- UEFI是什么堵第?與BIOS的區(qū)別在哪里
http://www.ihacksoft.com/uefi.html
[UEFI是什么?與BIOS的區(qū)別在哪里]:http://www.ihacksoft.com/uefi.html
- Linux:系統(tǒng)啟動引導(dǎo)過程
- What’s the Difference Between GPT and MBR When Partitioning a Drive
http://www.howtogeek.com/193669/whats-the-difference-between-gpt-and-mbr-when-partitioning-a-drive/
[What’s the Difference Between GPT and MBR When Partitioning a Drive]:http://www.howtogeek.com/193669/whats-the-difference-between-gpt-and-mbr-when-partitioning-a-drive/
- 6 Stages of Linux Boot Process (Startup Sequence)
- GRUB2 中文介紹
https://my.oschina.net/guol/blog/37373
[GRUB2 中文介紹]:https://my.oschina.net/guol/blog/37373