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