既存環境を仮想マシンに (から) 移動
この記事では Arch Linux の現在の環境を仮想環境 (QEMU, VirtualBox, VMware) に、あるいは仮想環境から移動する方法を説明します。rsync によるフルシステムバックアップの記事が元になっています。仮想マシン (略して "VM") が使用するハードウェアは異なるので、initramfs イメージを再生成して fstab を修正する必要があります (特に SSD を使っている場合)。
VM から移動
仮想環境から移動するのは比較的簡単です。
共有フォルダの設定
ゲストの仮想マシンと使用しているハイパーバイザーのホストに共有フォルダを設定してください。詳しくは仮想環境の wiki ページを参照してください。
ext4 パーティションが存在しない場合は、ビギナーズガイド#デバイスの確認を参照。
Windows を使っている場合は Ext2Fsd をインストールして ext ボリュームがマウントできるようにしてください。
システムの転送
仮想マシンから、ターミナルを開いてシステムを転送してください:
# rsync -aAXv /* /path/to/shared/folder --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,/home/*/.gvfs}
Chroot とブートローダーの再インストール
"ライブ" GNU/Linux ディストリビューションを起動して、ルートパーティションをマウントして chroot してください。ビギナーズガイド#Chroot とベースシステムの設定を参照。
ブートローダーを再インストールしてください: Syslinux, GRUB, Gummiboot のどれかを使います。ビギナーズガイド#ブートローダのインストールと設定に従ってください。忘れずに設定ファイルを更新します: Syslinux の場合は syslinux.cfg
、Grub の場合は grub.cfg
、Gummiboot の場合は /boot/loader/entries/
のブートエントリです。
fstab の修正
ルートツリー全体を単一のパーティションに転送したので、/etc/fstab ファイルを編集してパーティションの変更を反映させる必要があります。
chroot の中では lsblk
はあまり役に立たないので blkid
コマンドを使ってパーティションを確認してください。
initramfs イメージの再生成
ハードウェアが変わったので、chroot の中にいる間に、initramfs イメージを再生成してください:
# mkinitcpio -p linux
仮想マシンでホスト OS のネットワーク設定を使っていた場合、ネットワークを設定する必要があります。ビギナーズガイド#ネットワークの設定を見てください。
VM に移動
仮想マシンの中に移動するのは少し骨が折れます。
コンテナの作成
以下のコマンドで 10 GB の raw イメージを作成します:
# dd if=/dev/zero of=/media/Backup/backup.img bs=1024 count=10482381
ルートパーティションと全く同じ要領のイメージを作成したい場合、fdisk -l
を実行して出力された Blocks
カラムの値を count=
パラメータで指定してください。ルートツリー全体を転送するので、/boot
や /home
フォルダも転送することになります。パーティションを分割する場合は、コンテナを作成するときに注意してください。
必要なモジュールをロードしてループバックデバイスとしてマウントします (例として /dev/loop5
にマウント):
# modprobe loop # losetup /dev/loop5 /media/Backup/backup.img
次に、適当なパーティショニングツールを実行して /dev/loop5
のパーティショニングを行なってください。デバイスにパーティションテーブルを作成 (例: msdos
) したら、パーティション形態を選択してパーティションを作成します。それからパーティションにファイルシステムを作成してください。パーティションは /dev/loop5p1
や /dev/loop5p2
などとなります。
システムの転送
ループバックデバイスをマウントしてシステムを転送してください:
# mkdir /mnt/Virtual # mount /dev/loop5p1 /mnt/Virtual # rsync -aAXv /* /mnt/Virtual --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,/home/*/.gvfs}
コンテナを互換性のある形式に変換
ループバックファイルが存在するディレクトリに移動して、仮想マシンにあわせて適当なコマンドを実行:
$ cd /media/Backup $ qemu-img convert -c -f raw -O qcow backup.img backup.qcow2 $ VBoxManage convertfromraw --format VDI backup.img backup.vdi $ VBoxManage convertfromraw --format VMDK backup.img backup.vmdk
Chroot とブートローダーの再インストール
コンテナを VM に接続して、VM の仮想 CD-ROM として Linux の LiveCD (例: 最新の Arch Linux ISO) をセットしたら、VM を起動して chroot してください:
# mount /dev/sda1 /mnt # arch-chroot /mnt /bin/bash
ビギナーズガイド#ブートローダのインストールと設定に従って Syslinux や GRUB を再インストールします。設定ファイルを忘れずに更新してください:
- Syslinux の場合、
syslinux.cfg
のAPPEND root=/dev/sda1 ro
です。
- GRUB の場合、
grub.cfg
を自動で再生成することを推奨します。
fstab の修正
ルートツリーを単一のパーティションに転送したら、fstab ファイルを編集してください。UUID やラベルを使うこともできますが、ドライブやパーティションが一つしかない場合はあまり意味がありません (混乱する余地がないから)。以下の例では /dev/sda1
だけを設定しています。
/etc/fstab
tmpfs /tmp tmpfs nodev,nosuid 0 0 /dev/sda1 / ext4 defaults,noatime 0 1
Xorg 関連ファイルの無効化
Xorg の設定ファイルの Device
セクションに nvidia
, nouveau
, radeon
, intel
などのエントリがあると起動ができません。これからはエミュレートされたハードウェアを使用するからです (ビデオカードも含む)。従って、以下のようにファイルを移動したり削除することを推奨します:
# mv /etc/X11/xorg.conf /etc/X11/xorg.conf.bak # mv /etc/X11/xorg.conf.d/10-monitor /etc/X11/xorg.conf.d/10-monitor.bak
initramfs イメージの再生成
ハードウェアが変わったので、chroot に入っている間に、initramfs イメージを再生成してからシャットダウンを実行してください:
# mkinitcpio -p linux # exit # umount -R /mnt # poweroff
最後に、LiveCD (ISO ファイル) を排出して、仮想マシンを起動してください。
トラブルシューティング
"mount: special device /dev/loop5p1 does not exist"
まず、fdisk
でループバックデバイスの開始ブロックを確認してください:
# fdisk -l /dev/loop5
Disk /dev/loop5: 10.7 GB, 10733958144 bytes 255 heads, 63 sectors/track, 1304 cylinders, total 20964762 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000b45e8 Device Boot Start End Blocks Id System /dev/loop5p1 * 2048 20963327 10480640 83 Linux
そしてマウントするときに開始ブロックをオフセットとして使ってください:
# mount -o offset=$((2048 * 512)) /dev/loop5 /mnt/Virtual/
"Waiting 10 seconds for device /dev/sda1; ERROR: Unable to find root device '/dev/sda1'"
Waiting 10 seconds for device /dev/sda1 ... ERROR: Unable to find root device '/dev/sda1'. You are being dropped to a recovery shell Type 'exit' to try and continue booting sh: cannot access tty; job control turned off [rootfs /]# _
おそらく poweroff
が実行されておらず、また、VM を閉じるボタンで終了していません (これは電源を切るのと同じです)。initramfs イメージを再生成する必要があります。フォールバックエントリを使って VM を起動します。フォールバックエントリがない場合、Tab
(Syslinux) や e
(GRUB) を押して initramfs-linux-fallback.img
に名前を変えてください。起動後、ターミナルを開いて以下を実行:
# mkinitcpio -p linux # poweroff
"Missing operating system. FATAL: INT18: BOOT FAILURE"
- ブートローダーを(再)インストールする必要があります。ブートローダーを見てください。
- BIOS や VM 設定のブート順序が正しく設定されていません。ブートローダーが含まれているドライブが一番最初に起動するようになっているか確認してください。
メンテナンスで root パスワードが要求される
:: Checking Filesystems [BUSY] fsck.ext4: Unable to resolve '...'
/etc/fstab
にドライブの UUID やラベル、あるいはデバイス名が追加されていません。UUID はフォーマット (もしくは新規作成) するたびに変わるので、一致しなくなります。blkid
で確認してください。