---
# System prepended metadata

title: 無痛轉移Linux系統與資料（舊電腦舊硬碟→新電腦新硬碟）

---

# 無痛轉移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/。