# 無痛轉移Linux系統與資料(舊電腦舊硬碟→新電腦新硬碟)
### 0. 將新硬碟接上舊電腦
### 1. 安裝```pigz```
```=shell
### Ubuntu
$ sudo apt-get install pigz
### Arch Linux
$ sudo pacman -S pigz
### CentOS
$ sudo yum -y install pigz
```
### 2. 壓縮系統與所有的資料
建議可以先用df指令來看```/home```與```/```各還有多少空間,因為通常```/home```與```/```會分開掛載在大硬碟與小硬碟上,怕容量會不夠。
```=shell
$ sudo tar --use-compress-program=pigz -cvpf \
arch-backup.tgz --exclude=/proc --exclude=/lost+found \
--exclude=/arch-backup.tgz --exclude=/mnt --exclude=/etc/fstab \
--exclude=/sys --exclude=/run/media --exclude=/media <path>
```
### 3. 確認新硬碟
```=shell
$ df -h
```
會列出所有已掛載硬碟的資訊
```
Filesystem Size Used Avail Use% Mounted on
devtmpfs 32G 0 32G 0% /dev
tmpfs 32G 0 32G 0% /dev/shm
tmpfs 32G 9.7M 32G 1% /run
tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/mapper/ol-root 894G 177G 717G 20% /
/dev/sdb2 1014M 607M 408M 60% /boot
/dev/sdb1 599M 5.1M 594M 1% /boot/efi
/dev/sda 5.4T 92G 5.1T 2% /home
tmpfs 6.3G 12K 6.3G 1% /run/user/42
tmpfs 6.3G 4.0K 6.3G 1% /run/user/1009
```
再使用
```=shell
$ ls /dev/[sh]d*
```
會列出所有有接上電腦的硬碟
```
/dev/sda /dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdc
```
查看/dev/sdc資訊
```=shell
$ sudo parted /dev/sdc print
```
```
Model: ATA WDC WD40EFZX-68A (scsi)
Disk /dev/sdc: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size Type File system Flags
```
這裡就會知道```/dev/sdc```確實是我們新接上的4TB新硬碟,也還未有任何分割區。
### 5. 確認開機模式
```=shell
$ sudo ls /sys/firmware/efi/efivars
```
:::danger
如果沒有以下資料夾,那就是用 **傳統BIOS(Legacy)** 開機,反之是用 **UEFI** 開機,這步驟很重要,因為**舊電腦目前的開機模式不同會導致後續指令的不同**,如果是使用傳統BIOS開機,無法強制讓其轉為UEFI開機(應該啦,我自己試過是會掛載不到硬碟)。
:::
### 4. 給新硬碟分區或掛載
:::info
這裡只說明```parted```,因為```fdisk```不支援2TB以上硬碟分區。
:::
```=shell
$ sudo parted /dev/sdc
```
進入我們的新硬碟後,這裡就會分成傳統BIOS開機與UEFI開機的不同切法。
#### 傳統BIOS開機
先切出一個非File System的分割區(不用太大),並設為bios開機分割區。
因為```/dev/sdc```還未有分割區,所以這個分割區應該會為編號1。
```
(parted) mkpart non-fs 0MB 5MB
(parted) set 1 bios_grub on
```
再切出所需要的File System的分割區(因為我只有一顆硬碟,所以就不區分```/home```與```/```了)
:::info
要先確認原本硬碟格式,必須跟舊硬碟相同(目前較通用為ext4)。
:::
```
(parted) print
```
```
Model: ATA WDC WD40EFZX-68A (scsi)
Disk /dev/sdc: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size Type File system Flags
1 17.4kB 5000kB 4983kB bios_grub
2 5243kB 4001GB 4001GB ext4
```
確認分割區都正確,離開```parted```
```
(parted) q
```
格式化File System分割區
```=shell
$ sudo mkfs -t ext4 /dev/sdc2
```
#### UEFI開機
先切出一個的UEFI開機分割區,**格式必須為fat32**。
因為```/dev/sdc```還未有分割區,所以這個分割區應該會為編號1。
```
(parted) mkpart primary fat32 0MB 512MB
(parted) set 1 boot on
```
再切出所需要的File System的分割區(因為我只有一顆硬碟,所以就不區分```/home```與```/```了)
:::info
要先確認原本硬碟格式,必須跟舊硬碟相同(目前較通用為ext4)。
:::
```
(parted) print
```
```
Model: ATA WDC WD40EFZX-68A (scsi)
Disk /dev/sdc: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size Type File system Flags
1 17.4kB 512MiB 511MiB boot
2 513MiB 4001GB 4000GB ext4
```
確認分割區都正確,離開```parted```
```
(parted) q
```
格式化UEFI開機分割區
```=shell
$ sudo mkfs.fat -F32 /dev/sdc1
```
格式化File System分割區
```=shell
$ sudo mkfs -t ext4 /dev/sdc2
```
### 5. 掛載新硬碟到/mnt
:::danger
掛載與創建資料夾的順序必須由外而內。
:::
新建新硬碟目錄並掛載
#### 傳統BIOS開機
```=shell
$ sudo mkdir -pv /mnt/new
$ sudo mount /dev/sdc2 /mnt/new
```
#### UEFI開機
```=shell
$ sudo mkdir -pv /mnt/new
$ sudo mount /dev/sdc2 /mnt/new
$ sudo mkdir -pv /mnt/new/boot/efi
$ sudo mount /dev/sdc1 /mnt/new/boot/efi
```
### 6. 恢復系統與資料
```=shell
$ sudo tar --use-compress-program=pigz -xvpf <path/to/arch-backup.tgz> -C /mnt/new
```
### 7. 建立壓縮時排除的資料夾
```=shell
$ sudo mkdir -pv /mnt/arch/proc
$ sudo mkdir -pv /mnt/arch/sys
```
### 8. 確認硬碟的UUID
```=shell
$ sudo lsblk
```
### 9. 產生電腦可以自動掛載硬碟的文件
```=shell
$ sudo genfstab -U /mnt/new >> /mnt/new/etc/fstab
```
確認UUID是否需要修改
```=shell
$ sudo cat /mnt/new/etc/fstab
```
### 10. 進入新系統中的root
```=shell
### Ubuntu/CentOS
$ sudo chroot /mnt/new/
### Arch Linux
$ sudo arch-chroot /mnt/new/
```
是否需要修改```/mnt/new/etc/fstab```
:::info
已經進入新系統中的root,路徑不需要再加```/mnt/new```。
:::
```=shell
$ sudo vim /etc/fstab
```
修改UUID對應的掛載點。
### 11. 更新Grub引導
還是在```chroot```權限下
#### 傳統BIOS開機
安裝開機文件在新硬碟(```/dev/sdc```)中。
```=shell
$ grub-install --target=i386-pc --recheck /dev/sdc
$ grub-mkconfig -o /boot/grub/grub.cfg
```
#### UEFI開機
```=shell
$ grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader=GRUB --recheck
$ grub-mkconfig -o /boot/grub/grub.cfg
```
### 12. 更新```mkinitcpio```
```=shell
$ mkinitcpio -p linux-lts
```
如果產生問題,改為執行
```=shell
$ mkinitcpio -p linux
```
### 13. 退出```chroot```權限
```=shell
$ exit
```
### 14. 取消掛載新硬碟
:::danger
取消掛載的順序必須由內而外。
:::
#### 傳統BIOS開機
```=shell
$ sudo umount /mnt/new
```
#### UEFI開機
```=shell
$ sudo umount /mnt/new/boot/efi
$ sudo umount /mnt/new
```
### 15. 將舊主機關機,新硬碟插入新主機
```=shell
$ sudo shutdown now
```
### 16. 新主機開機
#### 傳統BIOS開機
需打開CSM才能從舊BIOS開機,參考
https://www.yakuo.com.tw/support/support.php?article_id=11
#### UEFI開機
應該可以直接開機。
## 踩雷
### 1. 解壓縮系統到新硬碟之後絕對不能更新系統。
### 2. ASUS 500系之後的主機板都不支援CSM了,必須要接上獨立顯卡才能從舊BIOS開機,詳情:https://www.asus.com/tw/support/FAQ/1045467/。