2013年5月11日土曜日

WindowsからVirtualBoxを使ってLinuxのファイルシステムにアクセスする

2013-05-11: 作成
2013-08-14: VBoxManageが使用できない時の対処を注釈に記述。

注意:このエントリの内容は実験段階です。 別々のOSから同じハードディスクにアクセスするように設定します。 このような使い方はハードディスクのデータを突然壊すかもしれません。

経過を見ていますが、今のところ壊れていません。

はじめに

LinuxとWindowsのデュアルブート環境でexfatを使用していましたが、 ファイルシステムが壊れました。読み込みはできるのですが、 書き込みができません。 考えてみたらVistaでもWindows7でも同じことが起きたことがあります。 私の使い方が悪いのでしょうか。

このブログのようにchkdskで治るかもしれませんが、私の場合は無理でした。

ということでexFATから乗り換え先を探さねばなりません。 NTFSはLinuxから NTFS-3G で読み書き可能ですが、おもしろみがありません。 なんだかんだ言ってもLVMは便利です。

考えてみた結果、Linuxの仮想マシンを通してWindowsからLinuxのファイルシステムにアクセスしてみようと思います。 別パーティションとは言えWindowsを使用している時に別のOSが同じディスクにアクセスするなんて Windowsからは想定外でしょうから、かなり危険です。 最悪データが全部飛ぶことを考え、バックアップは外部のディスクに入念にとっておこうかと思います。

仮想マシンにはOracleの VirtualBox を使用します。 理由はただ単にただだからです。Linuxは簡単にインストールできるものが良かったので、 お気に入りのSystemRescueCDを使用することにします。使用したバージョンは 以前の投稿 と一緒です。

今回使用した環境は
  • Windows8 64bit
  • VirtualBox 4.2.12
  • SystemRescueCd-x86-3.4.2
  • ハードディスクは2台、Ubutntu、Windowsのデュアルブート
  • アクセスしたいLinuxのVG : vgdata、 LV : data

VitualBoxから実ハードディスクにアクセスできるようにする

まず、VirtualBoxを ダウンロード してインストールします。

次に、コマンドプロンプトを管理者で起動させます。簡単な方法はWindowsキーを押し、 cmdと入力します。コマンドプロンプトを選択し、ctrl + shift + Enterを押します。

以下の方法で「 C:\VBox 」以下にディスクに直接アクセスするためのファイルを作成します。 アクセスするディスクは0番から始まります。確認したい場合は「diskmgmt.msc」と入力すればすぐに見れます。 いくつあるか見たいだけなら「echo list disk | diskpart」でもいいです。

WindowsでアクセスするハードディスクとLinuxでアクセスするハードディスクを分ければ少しは安全な気がするかもしれませんが、 どうせ危険なことに変わりないので、ハードディスクはすべてアクセスできるようにします。:

> mkdir C:\VBox
> cd C:\VBox
> PATH C:\Program Files\Oracle\VirtualBox;%PATH%
> VBoxManage internalcommands createrawvmdk ^
-filename Drive0.vmdk -rawdisk \\.\PhysicalDrive0
> VBoxManage internalcommands createrawvmdk ^
-filename Drive1.vmdk -rawdisk \\.\PhysicalDrive1

VirtualBoxも管理者権限で実行しなければディスクにアクセスできませんので、 デスクトップのショートカットのを右クリックし、 プロパティを開き「管理者としてこのプログラムを実行する」にチェックをつけておきます。 [1]

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-DHoxnpWRqBZ-Lm3FO9qrXD-lGMxZBvSNNHs6DNhFNwRduEBAF7TqJAugDiI24PZy3JVjr29brGX3NhTy8rBgk87PsO0Qg2R3hKTxJf6jULAASZ6AROISNS0flCNPBwoqvIzsFz-1Po2m/s320/screenshot.20130417_233132.png

仮想OSの起動方法を考える

私は物好きなのですべてのハードディスクにSystemRescueCDが入っています。 実機のハードディスクをVirtualBox設定して、仮想マシンを起動させると実機のGrubが起動するので そこからSystemRescueCDを起動させてやればいいのですが、実機のGrubはデフォルトでWindowsが起動します。 同じ領域にあるOSが2重に起動するのは、試してもいませんが、おそらくロックすると思いますが、そうでない場合、 「おそろしくやばそうな感じ」なので、この方法は却下し、仮想ハードディスクにSystemRescueCDをインストールすることにしました。 [2]

仮想マシンの作り方

まずバーチャルボックスを起動し、 新規ボタンを押します。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8uaMTmvLFh9o_er2kQ60axIq6AO-ovWCbpXS4e7JWR8un9XWOLw9ASh0xFFbdKdtuhETICnYq7-BmQ0TjcIi0D8YIUwMHK2ecLYGdzdCFWn_-Jxfs79ceVdSgnNMvwWuJRB43GNsLC9y-/s1600/screenshot.20130421_151230.png

出てきた仮想マシンの作成ダイアログで名前を入力します。私はRealDiskとしました。

タイプはLinuxに設定します。

バージョンは一応SystemRescueCDの元になったGentooを設定しました。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiQQjl1ZDvc-MCIYq1nc-O5pEg0FCf36KL-dbWW4WkvGY2QT3iP3UDW6-MjQJEI-BSxc6G27C5HYvXeVJMinhszZ9PmJHuUkIp_1a9GTOqWIjA7xGSQ6qwabQ4hfhqJtlXrJoTDhTnw_09/s320/screenshot.20130419_024954.png

メモリサイズの設定をします、とりあえず128MBとしました。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2FmNCEqRUIpuHE_HhZZ-B9eGNK7okgXSn_O09nFydK5_fd-V0b06se-EYs6W0Nhw0Ym0XXoEtuE8Sf3SErc0jAfDXBGOF8VOrC25I3Z7YMnmUiOcu-1wT9Zs-Z7-qRnNcrDIVbxN__Jgm/s320/screenshot.20130419_025013.png

仮想ハードドライブを作成しますを選択します。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe7Kr061gqN6xOqLhISL1YhLtuoWyVWdSbRJqfyi2pX_UTW6CWRxzrHUacvJyC7NJ2g1OdDWa5b_JE1q_zCkoW1FBHtZr3xIkLBSGjPz2fmIPsoI9F4TJ3ryhthZgJYJSjsnNLlewYEtEp/s320/screenshot.20130419_025021.png

デフォルトのVDIのままにしました。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi14ZYkUos1joDB9SpSxXoMBlVHY432Ypg7aJvTwsBz2PV5sdegPMytGZERuiLKycv5V0am4tGow6ObksUluJpKheOpdB23PeGeyTQSfDAB6nBdw6_fkT40FLbgwFYwpfwQJ4KX79Mkn-ay/s320/screenshot.20130419_025029.png

可変サイズとしました。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSVR8KbjIhMY9PAmHzVOIUAvc1ZVkZCdkNVIEUFSVnPGgNMvVdWT7rz0JKmI8tfpXGRBxof2Nk-kbV-tkd1zDZglLUzOpxf93WyeyZXij3khaC2xVLaa2V3Kx-ZISwF35cYxejJTK61AAb/s320/screenshot.20130419_025034.png

デフォルトのままです。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPbhC2oiDEs_eB571e8QVFaCn3Rl3DRLP-BUV8UZzoatsILmnxUx2b4kHktZ26legagFaaR6oytVbkm4yFVH4Wt_vJMkR9GTVFs7_JR1xd-c8gkk8tno3zsU-iSdHgldkK9xA0ORm8kPS7/s320/screenshot.20130419_025042.png

仮想マシンができたら、右クリックして、設定を選びます。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivdLm7PsGEpHlemeHLpO1PEpg-MGktVjgRBelVE2pkdbffq2Z1imZ9OwC2H-M9rdp2AcQvTR6VcRmv4_gQ6BnHqooIqsiF09xn6VqT8vko834EsbIihIh-V5S_5HmFkuKwpAojkV7-_BTr/s1600/screenshot.20130421_151220.png

ストレージを選び、CDにSystemRescueCDのISOファイルを設定します。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYU0N4eDX3uU5uD8PbOSDbQD6ZYZMGbijvBruWa7sE-FdjuthkuJ_fU5QvYy-fuDySHABeU-OBHQ7PwcaOi7LJ6xWxr3Lnniozbx1C5Zm0mkbepfAo-Pnds7Ma_7oq9GLZepg4DZaS4Zu/s320/screenshot.20130419_025159.png

ネットワークを選び、割り当てを「ブリッジアダプター」に変更します。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwlUlJo4-VhDVmkfaPYGH2qKHpNJ62DX8Gqi-bZV3LmH_FJ36UfR6BJv9uF64UfAD7pxd9lFPXflDniPD4dQCesq9h6y-4zMW8F4EsUA9i-XDPXN1hZrSLHWrfJj96lDRipsgeJeXZXS8w/s320/screenshot.20130423_014107.png

仮想マシンへのSystemRescueCDのインストール

仮想マシンを起動させるとメニューが表示されます。そのままEnterを押し、起動させます。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNbm5V_j6ty32UNZj5kaevRLM-KWSi1SrxsXVdPFeDQ9wkOcehxg0AibbAJpotVmXsBq5CI5Eu19aGa2Dn1vkVEX43E4djsy6RYWD5JIG9xD1jwtIKjhaJjX4fNfLQGZEqNDOW84Q59TiA/s320/screenshot.20130419_025216.png

途中で言語を聞かれるので、22を入力します。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_Z229r6GZgCslgMaJBcndyypNZsODjalO6b8mghhu4vu0tBBFflFKGf4-IPfwPJNyGk82gvCsZ8s3HJbivuIU-nAjwVJIwCh_7-pEnVdDu1ensCOaNteSRPPfBbieQu68ISFn7PCp-QHi/s320/screenshot.20130419_025232.png

プロンプトが表示されたら、fdisk /dev/sdaを実行し、パーティションを1つ作ります。

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwdqDggGAgAlG4Y_LvFxqAziCz6SCVPawrCqYyg5dQEe8Ehyphenhyphen92uKwMH_xIlXa-EMUBRbQDow5IXgOFK53wlGsdpfMxu3SXY2FOJOTX9QjoOWsvXIP40yg85Pz1TU9Z2hHhotwLEuVa8fwZ/s320/screenshot.20130419_030701.png

フォーマットします。:

% mkfs.ext4 /dev/sda1

sshで作業したい場合、パスワードを設定します。私はなぜかTeratermで接続できなかったので、puttyで接続しました。:

% passwd

マウントし、Grubをインストールします。:

% mkdir /sda1
% mount /dev/sda1 /sda1
% grub2-install --root-directory=/sda1 /dev/sda

SystemRescueCDが起動するようにします。ISOファイルは仮想マシンに持ってくるのが手間なので、 起動に使用したISOファイルをそのまま書き込ませます。:

% mkdir /sda1/boot/sysres
% dd if=/dev/cdrom of=/sda1/boot/sysres/sysres.iso
% vi /sda1/boot/grub2/grub.cfg

grub.cfgには以下を書き込みます。今回は設定を少し凝ってみました。 起動時に3秒以内にESCを押さなければメニューが表示されません。:

set pager=1
#set timeout=10
set default=0

echo -n "Press ESC to show boot menu..."
if sleep --verbose --interruptible 3 ; then
  set timeout=0
fi

set sysres_iso=/boot/sysres/sysres.iso
insmod loopback
loopback sysres_disk $sysres_iso

menuentry "RealDisk" {
  linux (sysres_disk)/isolinux/rescue32 isoloop=$sysres_iso setkmap=jp
  initrd (sysres_disk)/isolinux/initram.igz
}

ここで仮想マシンを停止します。次にCDではなく、仮想ハードディスクから起動させるため、 先ほどストレージ設定に設定してあったSystemRescueCDのISOファイルの登録を解除します。:

% shutdown -h now

SystemRescueCDの起動とバッキングストアの有効化

登録を解除したら仮想マシンを起動させます。自動的にSystemRescueCDが起動します。

さてハードディスクのデータを共有できるようにシステムの設定を行わなければなりません。 とは言うもののLiveCDのシステムイメージから起動しているため、 設定しても再起動すれば、設定は元に戻ってしまいます。(※)

しかし、SystemRescueCDにはファイルを更新するための仕組みがはじめから備わっていて、 Backing-store を使うとシステムに書き込んだデータを別の書き込み可能な領域に書き込み保存することができます。 まずはこの機能を有効にし、データを書き込む領域は/dev/sda1を使用することにします。 [3]

バッキングストアを使用するために、バッキングストア先の/dev/sda1にファイルを作成しなければなりません。 しかし、/dev/sda1はISOイメージがあるため、/livemnt/isostoreに自動的に読み込みのみでマウントされるため、 書き込むことができません。以下のコマンドで読み書きできるよう再マウントします。:

% mount -o remount,rw /livemnt/isostore

次にバッキングストアを作成します。:

% sysresccd-backstore create /livemnt/isostore/sysrcd.bs 256

ハードディスクにバッキングストアをおいた場合、grubのオプションを変更する必要があります。 以下のようにlinux行の最後に backstore=alldevを追加します。:

% vi /livemnt/isostore/boot/grub2/grub.cfg

    linux (sysres_disk)/isolinux/rescue32 isoloop=$sysres_iso setkmap=jp backstore=alldev

上記は一行で入力して下さい。変更が終わったらバッキングストアを有効化するために再起動します。:

% shutdown -r now

起動したら先ほど設定したバッキングストア設定されているか確認してみましょう。 確認するためには、mountコマンドを実行してみて、 /dev/loop2が/livemnt/memoryにマウントされていればバッキングストアが働いています。:

% mount | grep memory
/dev/loop2 on /livemnt/memory type ext3 (rw,rela.......

一応関連しているファイルを調べてみます。:

% losetup /dev/loop2
/dev/loop2 [2049]:14 (/livemnt/backstore/sysrcd.bs)

ディスク共有設定

はじめの方で``C:VBox``以下に実ハードディスクにアクセスするためのファイルを作成しましたが、 トラブルを避けるため、仮想マシンに設定していませんでした。ここで仮想マシンを停止します。:

% shutdown -h now

ストレージ設定を開き、実機のハードディスクにアクセスするためのファイルを設定します。

設定が終わったら、また仮想マシンを起動させます。 なおsshで作業したい場合、パスワードを設定します。:

% passwd

まずはホスト名を設定します。:

% echo HOSTNAME=realdisk > /etc/conf.d/hostname
% /etc/init.d/hostname restart

ファイルシステムをマウントさせるため、fstabに書き加えます。:

% vi /etc/fstab
/dev/mapper/vgdata-data  /mnt/data       ext4    defaults    0  0

マウントポイントを作ります。:

% mkdir /mnt/data

これだけではうまくマウントされませんでした。 起動時にコマンドを実行させてマウントできるようにします。

(停止時のアンマウントはしているようなので、何もしていません。):

% vi /etc/local.d/mount.start

    #!/bin/bash
    mount -a

% chmod 700 /etc/local.d/mount.start
% rc-update add local

Windowsからアクセスできるようにするには、smb.confのデフォルト設定をコピーして、 一番下にエントリを書き加えます。:

% cd /etc/samba
% cp smb.conf.default smb.conf
% vi smb.conf

    [data]
      path = /mnt/data
      public = yes
      only guest = no
      writable = yes
      printable = no

sambaを起動時に起動するようにします。:

% rc-update add samba default
% /etc/init.d/samba start

sambaでアクセスするためのユーザーを作成し、パスワードを設定します。 pdbeditコマンドを実行したらパスワードを2回入力します。:

% useradd -mU spp5
% pdbedit -au spp5

MacからはSambaからでもアクセスできますが、いちおうNFSからもアクセスできるようにしてみましょう。 通常は「rc-update nfs default」を実行して、/etc/exportsを書き換えればいいのですが、

ここではよく忘れるので、コマンドでエクスポートする方法を書いて置きます。

再起動すると設定は消えてしまいますので、少しだけの間共有したい場合は便利です。:

% /etc/init.d/nfs start
% exportfs -o rw,insecure,all_squash 192.168.0.1/24:/mnt/data
% exportfs -v

rootのパスワードは起動毎に消されているようです。 再起動するとsshで接続できなくなります。 セキュリティを気にしないなら以下のようにすれば起動時に設定できます。:

% vi /etc/local.d/password.start

    #!/bin/bash
    cat << EOF | passwd
    test
    test
    EOF


% chmod 700 /etc/local.d/password.start

これで設定は終わりです。仮想マシンを再起動させましょう。:

% shutdown -r now

起動したら、Windowsからアクセスしてみます。

Windowsキー+Rを押し、 ファイルを指定して実行画面で「 \\realdisk 」 (だめならば「 \\LinuxのIPアドレス 」)を入力すれば、Linuxのファイルシステムにアクセスできるはずです。

Macからつなげる場合は、Command+Kを押し、「 smb://realdisk」(だめならば「 smb://(LinuxのIPアドレス」)を入力すれば、 Linuxのファイルシステムにアクセスできるはずです。

使い終わったら、仮想マシンをきちんと終了させましょう。:

% shutdown -h now

VirtualBoxのサービス化(失敗)

Windowsが起動した時に仮想マシンが起動すると便利です。 VirtualBoxをWindowsサービスとして起動させる方法はこの  ブログ が参考になりました。 しかし、私の環境ではサービスは登録できたのですが、仮想マシン自体は起動しませんでした。 Windows 8だからでしょうか。とりあえずそのうち調査することにしてサービス化はあきらめました。

サービスで起動できたらの話ですが、SystemRescueCDはACPI シャットダウンに対応していませんので、 Windowsの終了時に自動的に停止させることができません。 停止できるようにするにはsys-power/acpidパッケージを入れる必要があります。

インストールするにはGentooのPortageツリーをダウンロードして展開する必要がありますが、 容量が大きいのでローカルのハードディスクに専用の領域を作り、それをマウントしました。 ext4でフォーマットしたところファイルが多いのでi-nodeの数が足りなくなってしまいました。 何も考えずにxfsでフォーマットしなおしました。 また、インストール中にメモリが足りなくなってしまったため、 シングルユーザーモードに切り替えて作業をし直しました。

以下使用したコマンドです。:

% init 1
% vgchange -ay
% lvcreate -n portage -L2G vgdata
% mkfs.xfs /dev/vgdata/portage
% mount /dev/vgdata/portage /usr/portage
% cd /usr/portage
% wget http://ftp.jaist.ac.jp/pub/Linux/Gentoo/snapshots/portage-latest.tar.xz
% tar xJvf portage-latest.tar.xz -C /usr
% emerge -av acpid
% rc-update add acpid default
% /etc/init.d/acpid start

これでACPIシャットダウンができるようになります。 インストールした後はportage領域は要らないので、消してしまっても大丈夫です。:

% cd
% umount /usr/portage
% lvremove /dev/vgdata/portage

% shutdown -r now

終わり

[1] なおこの設定を行うと、VBoxManageコマンドの一部かもしれませんが、COMサーバーと通信できないというエラーが でて使用できなくなるようです。使用する場合管理者権限を外して、VirtualBoxを起動させなおすとうまくいくようです。
[2] (以下断念したので覚え書き) 仮想マシンと実機のディスク構成を合わせたいというのもあり、 仮想マシンでは仮想フロッピーに入れたGrubから実機のハードディスクのSystemRescueCDを起動しようとしました。 仮想フロッピーの作り方がなかなかわからず、やっと 仮想フロッピーディスクイメージの作り方 を見つけて仮想マシンを起動したのですが、 仮想マシンで起動させたSystemRescueCDからはフロッピーディスクが認識されませんでした。原因はわかりません。 ということで、実機とディスク構成が変わってしまいますが、無難に仮想ハードディスクにSystemRescueCDをインストールすることにしました。
[3] (以下断念したので覚え書き) これらの設定を行なうために、最初は起動時に autorun スクリプトファイルを実行する方法を考えました。 この方法だとSystemRescueCDのISOをアップデートできます。 autorunというスクリプ トを/dev/sda1のファイルシステムに置いて、 Grubの起動オプションにar_source=/dev/sda1と指定すれば、それが実行されると思ったのですが、 残念ながら/dev/sda1にはISOファイルがあるため、起動時に/livemnt/isostoreにマウントされてしまいます。 autorunを実行するときに別の場所にマウントしてから実行することになっているので、 マウントに失敗し、autorunを実行できないようでし た。これは単純にISOからの起動が後からできた機能なため、 対応をする気がないのか忘れ去られているのではないかと思います。 Grubの起動オプション でdocacheオプションをつけてシステムイメージを メモリに読みこめば/dev/sda1はアンマウントされるので出来そうですが、 それだとメモリ使 用量が増加するので、ISOファイルのアップデートはあきらめることにしました。 (後述のバッキングストアを使ってもaufsでファイルを上乗せしている だけなので、アップデートはできるかもしれません。)

0 件のコメント:

コメントを投稿