既存環境を仮想マシンに (から) 移動

From ArchWiki
Jump to navigation Jump to search

関連記事

この記事では 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
ヒント: fallocate を使うほうが高速です: # fallocate -l 10GiB -o 1024 /media/Backup/backup.img

ルートパーティションと全く同じ要領のイメージを作成したい場合、fdisk -l を実行して出力された Blocks カラムの値を count= パラメータで指定してください。ルートツリー全体を転送するので、/boot/home フォルダも転送することになります。パーティションを分割する場合は、コンテナを作成するときに注意してください。

必要なモジュールをロードしてループバックデバイスとしてマウントします (例として /dev/loop5 にマウント):

# modprobe loop
# losetup /dev/loop5 /media/Backup/backup.img

次に、適当なパーティショニングツールを実行して /dev/loop5 のパーティショニングを行なってください。デバイスにパーティションテーブルを作成 (例: msdos) したら、パーティション形態を選択してパーティションを作成します。それからパーティションにファイルシステムを作成してください。パーティションは /dev/loop5p1/dev/loop5p2 などとなります。

システムの転送

ループバックデバイスをマウントしてシステムを転送してください:

ノート: コンテナを /mnt/media 以外の場所に保存した場合、除外リストに含めるのを忘れないでください。
# 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.cfgAPPEND 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"

  • ブートローダーを(再)インストールする必要があります。ブートローダーを見てください。
  • Btrfs ファイルシステムで /boot を圧縮すると、Syslinux で起動できなくなります。
  • BIOS や VM 設定のブート順序が正しく設定されていません。ブートローダーが含まれているドライブが一番最初に起動するようになっているか確認してください。

メンテナンスで root パスワードが要求される

:: Checking Filesystems                        [BUSY]
fsck.ext4: Unable to resolve '...'

/etc/fstab にドライブの UUID やラベル、あるいはデバイス名が追加されていません。UUID はフォーマット (もしくは新規作成) するたびに変わるので、一致しなくなります。blkid で確認してください。