it-swarm-ja.com

libvirt経由でVMとフォルダーを共有しています、9p、許可が拒否されました

Ubuntu Server 14.04ホストは、libvirt/qemu-kvmを介してUbuntu Server 14.04ゲストをホストします。システムは正常に動作しますが、-ゲストとして-共有フォルダー(<filesystem>)への書き込みで問題が発生します。両方のマシンは相対的なバニラのインストールです。

私はこのように指定されたフォルダを添付しました:

[Host] $ virsh edit guest-vm-name
# ...
<filesystem type='mount' accessmode='mapped'>
  <source dir='/data'/>
  <target dir='/data'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</filesystem>
# ...

ゲストから、次のようにファイルシステムをマウントします。

[guest] $ Sudo -u www-data mkdir /tmp/mnt
[guest] $ Sudo mount -t 9p -otrans=virtio,rw,version=9p2000.L /data /tmp/mnt

www-dataユーザーを使用します。これは後で有効なユーザーになるため、p9を使用する場合はグループIDとユーザーIDが一致する必要があります。また、ホストでは、/ data(ext4パーティション、RAID btwのLVM)は次のようになります

[Host] $ ls -lha /data
[Host] $ drwxrwxr-x  4 www-data www-data 4.0K Nov 11 08:34 .
[Host] $ drwxr-xr-x 24 root     root     4.0K Nov  7 16:58 ..
[Host] $ drwxr-xr-x  2 www-data www-data 4.0K Nov 11 08:34 jail
# ...

ゲストで、共有ファイルシステム上の何かに書き込もうとすると、使用中のユーザーに関係なく、アクセス権エラーが発生します。

[guest] $ Sudo -u www-data touch /tmp/mnt/jail/letmeout
touch: cannot touch ‘/tmp/mnt/jail/letmeout’: Permission denied

でもファイルは読めます

[guest] $ cat /tmp/mnt/jail/throughthewindow
Great Weather!

いろいろなことを試しましたが、特に:

  • apparmorサービスを停止し、aa-complainを呼び出しました(効果的だったと思います)
  • /etc/libvirt/qemu.confでセキュリティをnoneに設定します
  • /etc/libvirt/qemu.confでrootにユーザーとグループを設定します

/ var/log/syslogおよびdmesgには、疑わしいものは何も表示されません。

ポインター?!ありがとう。

7
Felix

私はこれが古いスレッドであることを知っていますが、同様の問題に出くわし、動作する解決策を見つけました少なくとも部分的に

また、/etc/libvirt/qemu.confのユーザーとグループの値をrootに変更しました。
ただし、dynamic_ownership設定も変更しました、説明が有望に聞こえたため:

#libvirtがファイルの所有権を動的に変更するかどうか
#は、上記の構成済みユーザー/グループと一致します。デフォルトは1です。
#0に設定すると、ファイル所有権の変更が無効になります。

私のセットアップは次のとおりです。

  • ホスト:Debian 8(ジェシー)
  • ゲスト:Debian 8(ジェシー)
  • ホスト上の共有フォルダーはrootに属します
  • iD 1000のローカルユーザーは、グループlibvirtのメンバーです(重要な場合があります)
  • ゲストのマウントポイント(/mnt/data)はユーザー1000( "alexander")に属します

both root(0)およびalexander(1000)を使用して、マウントされた共有フォルダーにファイルを最終的に書き込むことができます。 (私がそれをする前に、ここでファイルを書くことができるのはルートだけでした)

dynamic_ownership」を0に設定すると、「マップされた」アクセスモードで実行する必要があります。

ここに私のセットアップに関するいくつかの情報があります:

/etc/libvirt/qemu.conf:

user = "root"
group = "root"
dynamic_ownership = 0

ファイルシステム(virsh編集):

<!-- ... -->
    <filesystem type='mount' accessmode='mapped'>
      <source dir='/share/vm.localdomain/owncloud_data'/>
      <target dir='/data'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
    </filesystem>
<!-- ... -->

ホスト:

ls -al /share/vm.localdomain/owncloud_data/
total 8
drwxr-xr-x 2 root      root      4096 Sep  8 00:15 .
drwxr-xr-x 7 root      root      4096 Sep  8 00:10 ..

ゲストのfstab:

/data  /mnt/data/  9p  trans=virtio  0  0

ゲスト:

[email protected]:~# cd /mnt/data
[email protected]:/mnt/data# touch touched_by_root
[email protected]:/mnt/data# su - alexander
[email protected]:~$ cd /mnt/data
[email protected]:/mnt/data$ touch touched_by_user
[email protected]:/mnt/data$ ls -al
total 16
drwxr-xr-x 2 alexander alexander 4096 Sep  8 00:30 .
drwxr-xr-x 6 root      root      4096 Sep  7 18:13 ..
-rw-r--r-- 1 root      root         0 Sep  8 00:30 touched_by_root
-rw-r--r-- 1 alexander alexander    0 Sep  8 00:30 touched_by_user

ホストに戻る:

[email protected] /share/vm.localdomain # ls -al /share/vm.localdomain/owncloud_data/
total 16
drwxr-xr-x 2 root      root         4096 Sep  8 00:30 .
drwxr-xr-x 7 root      root         4096 Sep  8 00:10 ..
-rw------- 1 root      libvirt-qemu    0 Sep  8 00:30 touched_by_root
-rw------- 1 root      libvirt-qemu    0 Sep  8 00:30 touched_by_user

結論

奇妙なことに、ゲストではこれら2つのファイルは異なるユーザー(rootとalexander)に属しますが、ホストでは両方のファイルが同じユーザー(root:libvirt-qemu)に属します。 :-O
正確にはわかりませんこの魔法の仕組みですが、明らかにそうです。

お役に立てれば、
アレクサンダー

5
Alexander

@Alexanderは素晴らしい答えをくれました。私は彼がしたことをすべてやったわけではありませんが、これは9pファイルシステム全体でsame-user権利を取得するためにやったことです。 (この方法は、セキュリティの面倒なしに、両方の方法で9pを動作させることを目的としています。セキュリティを強化するには、別の方法または設定が必要です)

Host(順序は重要ではありません)

  • ホストユーザーを次のグループに追加しました:<kvm>(私は<libvirtd>)。次の理由により、この手順は不要です。

  • ファイル/ etc/libvirt/qemu.confで、すべてのVMが認証および実行するユーザーとグループを変更できます。

これは強力な小さな変化であり、これを何かに達成しようとしている場合は影響をマッピングする必要があります実稼働サーバーのように

user = "billy"    #### No, my name isn't billy, but it's cute. 
                  #### Alternatively you can declare your <uid>, like
                  ## user = "+1000" ####        << That's what I did.
                  #### (They tell you everything you need to know about
                  #### this stuff inside /etc/libvirt/qemu.conf)
group = "billy"
dynamic_ownership = 1

(上記の変更は、実行中のゲストVMのすべてのlibvirtクロスVMリクエストを<userに変換するように仮想マシンホストに指示することです>設定したもの; guest-VMを含む<root>。* Noteagainlibvirtおよび拡張qemuiflibvirtが唯一のqemuインターフェースである場合)

(ところで、 "Squash"は9pセキュリティモデルを参照します。これは "none"を意味し、このコンテキストに最も許容される設定です)

ゲスト

(以下のドキュメントで説明されているように、1つのオプションも追加しました)私のマウントコマンドは次のとおりです。

mount -t 9p -o trans=virtio,access=any,version=9p2000.L /hostshare /tmp/Host_files

これを設定した後、共有への書き込み権限がない場合、または制限された権限がある場合は、@randomoceanの回答による優れた提案が役立ちます。つまり、<root>で共有の下にフォルダーを作成し、chmod 777を設定します。

-さらに詳しい情報: https://wiki.qemu.org/Documentation/9psetup

1
Hypocritus

私もこの問題を抱えていました。ホストに/home/user/sharedという名前のフォルダーを作成し、virt-managerを使用してフォルダーを追加し、qemu VMに9p virtioとしてマウントしました。

/etc/apparmor.d/libvirtの設定をチェックアウトし、新しい/home/user/shared,のエントリがあり、/home/user/sharedの 'r'権限しか持っていなかったが、すべてのファイルのrwがある/home/user/shared/。書き込み権限にwを追加しようとしましたが、保存されていないようだったので、ホスト/home/user/sharedに移動してサブディレクトリを作成し、そのサブディレクトリでchmod 777を実行しました。これは機能し、ゲストVMはsuディレクターに作成ファイルと編集ファイルを書き込むことができました。

tldr:共有フォルダーに777のアクセス許可を持つサブディレクトリを作成し、それに書き込みできるかどうかを確認します。

1
randomocean