Linux の起動ディスクのお引越
概要
Ubuntu16.04 を違うディスクに引っ越した時に行った作業のメモ。 (もっと簡単に行う方法もあるかもしれない。)
作業
作業は USB メモリなどから起動した別 Linux からの作業とする。 (引越し元のシステムが起動した状態でも行うことはできると思うが、 システムが起動のためにマウントしているファイルシステムなどもあるため、 別システムで行ったほうが安全のように思う。)
ディスクのデバイスファイルは下記のような配置とする。
/dev/sda
引越元ディスク/dev/sda1
引越し元ルートファイルシステムが格納されるパーティション
/dev/sdb
引越先ディスク/dev/sdb1
引越し先ルートファイルシステムが格納されるパーティション
引越し先のファイルシステムのフォーマット
引越し先のディスクのファイルシステム(Ext4, XFS, Btrfs, …)は、 引越し元と同じ形式にすることを想定している。 ファイルシステムを変更した場合は、カーネルモジュールの不足が起きたり、 マウントのオプションが異なったりした場合に起動できない可能性があるため、 ここに書かれていることのみでは成功しない恐れがある。
引越し元のファイルシステムが Ext4 (Ubuntu16.04 のインストール時のデフォルトは Ext4) の場合は↓でパーティションを切ってフォーマットしておけば良い。
$ sudo parted -s -a optimal /dev/sdb -- mklabel msdos mkpart primary ext4 0% 100% set 1 boot on
$ sudo mkfs.ext4 /dev/sdb1
データの複製
引っ越し元から引っ越し先へデータを rsync
でコピーする。 マウント先は適当な場所で良いが今回は /mnt
下にした。
$ sudo mkdir /mnt/sda1
$ sudo mount /dev/sda1 /mnt/sda1
$ sudo mkdir /mnt/sdb1
$ sudo mount /dev/sdb1 /mnt/sdb1
$ sudo rsync -av /mnt/sda1/ /mnt/sdb1/
引越し先のファイルシステム /mnt/sdb1 へ chroot する
↓の手順で chroot
してから、続く作業を行う。
$ sudo mount --bind /dev /mnt/sdb1/dev
$ sudo mount --bind /proc /mnt/sdb1/proc
$ sudo mount --bind /sys /mnt/sdb1/sys
$ sudo chroot /mnt/sdb1
(chroot)#
/etc/fstab の設定を書き換える
/etc/fstab に記載されている /dev/sda1
の UUID を /dev/sdb1
の UUID で書き換える。 blkid
コマンドでパーティションの UUID は確認できる。
(chroot)# blkid
/dev/sda1: UUID="e620079e-cd74-4f72-9bfe-aec792adc666" TYPE="ext4" PARTUUID="d49dc327-01"
lsblk -f
でも確認できる。
(chroot)# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
└─sda1 ext4 e620079e-cd74-4f72-9bfe-aec792adc666 /
/dev/sdb へ GRUB のインストール
/dev/sdb
の MBR へ GRUB をインストールする。
initramfsの更新
再起動
chroot を終了し、コンピュータを再起動する。 BIOSで起動ドライブを /dev/sdb
に対応するディスクに切り替えたら /dev/sdb
から起動が始まる。