Red Hat Training

A Red Hat training course is available for RHEL 8

第14章 ホストとその仮想マシン間でのファイルの共有

ホストシステムと、そのホストが実行する仮想マシンとの間で、データを共有することが頻繁に必要になります。これを素早く効率的に行うには、ファイル共有 NFS または Samba をシステムに設定します。

14.1. ホストと Linux 仮想マシン間でのファイルの共有

ホストシステムと、そのホストシステムが接続している Linux 仮想マシンとの間で効率的なファイル共有を行うために、仮想マシンがマウントしてアクセスできる NFS 共有をエクスポートできます。

前提条件

  • nfs-utils パッケージがホストにインストールされている。
  • 仮想マシンと共有するディレクトリーがある。既存のディレクトリーを共有しない場合は、shared-files などの新しいディレクトリーを作成します。

    # mkdir shared-files
  • 仮想マシンにホストが表示され、ネットワーク経由で到達可能である。これは、通常、仮想マシンが、仮想ネットワークの NAT および ブリッジ のタイプを使用して接続されている場合となります。ただし、macvtap 接続の場合は、最初にホストに macvlan 機能を設定する必要があります。改善点を報告する場合は、以下のように行います。

    1. ホストの /etc/systemd/network/ ディレクトリーに、vm-macvlan.netdev などのネットワークデバイスファイルを作成します。

      # vim /etc/systemd/network/vm-macvlan.netdev
    2. ネットワークデバイスファイルを編集し、以下の内容を追加します。vm-macvlan を、ネットワークデバイスの名前に置き換えます。

      [NetDev]
      Name=vm-macvlan
      Kind=macvlan
      
      [MACVLAN]
      Mode=bridge
    3. macvlan ネットワークデバイス (例: vm-macvlan.network) 用にネットワーク設定ファイルを作成します。

      # vim /etc/systemd/network/vm-macvlan.network
    4. ネットワーク設定ファイルを編集し、以下の内容を追加します。vm-macvlan を、ネットワークデバイスの名前に置き換えます。

      [Match]
      Name=_vm-macvlan_
      
      [Network]
      IPForward=yes
      Address=192.168.250.33/24
      Gateway=192.168.250.1
      DNS=192.168.250.1
    5. 物理ネットワークインターフェース用のネットワーク設定ファイルを作成します。たとえば、インターフェースが enp4s0 の場合は、以下のコマンドを実行します。

      # vim /etc/systemd/network/enp4s0.network

      使用するインターフェース名が分からない場合は、ホストで ifconfig コマンドを実行すると、アクティブなネットワークインターフェースの一覧を取得できます。

    6. 物理ネットワークが macvlan インターフェース (この場合は vm-macvlan) の一部になるように、物理ネットワーク設定ファイルを編集します。

      [Match]
      Name=enp4s0
      
      [Network]
      MACVLAN=vm-macvlan
    7. ホストを再起動します。
  • (必要に応じて) セキュリティーを強化する場合は、仮想マシンが NFS バージョン 4 以降と互換性があることを確認してください。

手順

  1. ホストで、ネットワークファイルシステム (NFS) として共有するファイルを含むディレクトリーをエクスポートします。

    1. ファイルを共有する各仮想マシンの IP アドレスを取得します。以下の例では、testguest1 および testguest2 の IP を取得します。

      # virsh domifaddr testguest1
      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet0      52:53:00:84:57:90    ipv4         192.168.124.220/24
      
      # virsh domifaddr testguest2
      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet1      52:53:00:65:29:21    ipv4         192.168.124.17/24
    2. ホストの /etc/exports ファイルを編集して、共有するディレクトリー、共有する仮想マシンの IP、および共有オプションを含む行を追加します。

      Shared directory VM1-IP(options) VM2-IP(options) [...]

      たとえば、以下は、testguest1 および testguest2 があるホストの /usr/local/shared-files ディレクトリーを共有し、仮想マシンがディレクトリーのコンテンツを編集できるようにします。

      /usr/local/shared-files/ 192.168.124.220(rw,sync) 192.168.124.17(rw,sync)
    3. 更新したファイルシステムをエクスポートします。

      # exportfs -a
    4. NFS プロセスが起動することを確認します。

      # systemctl start nfs-server
    5. ホストシステムの IP アドレスを取得します。これは、後で仮想マシンに共有ディレクトリーをマウントするために使用されます。

      # ip addr
      [...]
      5: virbr0: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc noqueue state UP group default qlen 1000
          link/ether 52:54:00:32:ff:a5 brd ff:ff:ff:ff:ff:ff
          inet 192.168.124.1/24 brd 192.168.124.255 scope global virbr0
             valid_lft forever preferred_lft forever
      [...]

      関連するネットワークは、ファイルを共有する仮想マシンによるホストへの接続に使用されるネットワークであることに注意してください。通常、これは virbr0 です。

  2. /etc/exports ファイルで指定されている仮想マシンのゲスト OS で、エクスポートしたファイルシステムをマウントします。

    1. 共有ファイルシステムのマウントポイントとして使用するディレクトリー (例: /mnt/host-share) を作成します。

      # mkdir /mnt/host-share
    2. ホストによりエクスポートされたディレクトリーを、マウントポイントにマウントします。この例では、ゲストの /mnt/host-share にある 192.168.124.1 ホストによりエクスポートされた /usr/local/shared-files ディレクトリーをマウントします。

      # mount 192.168.124.1:/usr/local/shared-files /mnt/host-share
    3. マウントに成功したことを確認するには、マウントポイントの共有ディレクトリーにアクセスして確認します。

      # cd /mnt/host-share
      # ls
      shared-file1  shared-file2  shared-file3