LXDでコンテナとホストでフォルダを共有する

今回の内容はLXDを試すでc1インスタンスを作成したままの状態であることを前提にして話を進めます。

※ホスト側のマシンはRaspberry Pi OS(ラズベリーパイOS)を想定しています。

※c1インスタンスは上記のリンク先で作成したインスタンスを指します。


今回はLXDのマウントについて触れてみます。

LXDにおけるマウントはホスト側の任意のディレクトリ(フォルダ)をコンテナ(インスタンス)側で参照出来るようにします。


実際に設定をしながら、マウントとは何か?について見ていくことにしましょう。


今回は、ホスト側の /home/pi/mnt を、c1インスタンス側と繋ぎ(マウント)、インスタンス側からファイルの参照や編集を行ってみます。

今回の内容は第16回 Linuxカーネルのコンテナ機能 [6] ─ユーザ名前空間 | gihyo.jpを参考にして話を進めています。




最初にホスト側でmntディレクトリを生成しておきます。

$ mkdir ~/mnt

続いて、c1インスタンス側でマウント用のディレクトリ(/root/mnt)を作成します。

$ lxc start c1
$ lxc exec c1 bash
# mkdir mnt
# exit

※# はコメントではなく、rootアカウントで操作している意味になります




ホスト側の/home/pi/mnt とc1インスタンス側の/root/mntを共有します。

$ lxc config device add c1 share disk source=/home/pi/mnt path=/root/mnt
Device share added to c1

上記のコマンドで正しく設定されているか?を確認します。

$ lxc config show c1
architecture: aarch64
config:
  image.architecture: arm64
  image.description: ubuntu 24.04 LTS arm64 (release) (20240423)
  image.label: release
  image.os: ubuntu
  image.release: noble
  image.serial: "20240423"
  image.type: squashfs
  image.version: "24.04"
  volatile.base_image: 33534c9f8ea2994a8d77d1a5de9668f7c086327680391f621dcdf98a9824fb7a
  volatile.cloud-init.instance-id: c3fc3568-5a4f-49ee-9123-3f38b672ba36
  volatile.eth0.host_name: veth0b2a6cde
  volatile.eth0.hwaddr: 00:16:3e:ef:45:5a
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":165536,"Nsid":0,"Maprange":10000001},{"Isuid":false,"Isgid":true,"Hostid":165536,"Nsid":0,"Maprange":10000001}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":165536,"Nsid":0,"Maprange":10000001},{"Isuid":false,"Isgid":true,"Hostid":165536,"Nsid":0,"Maprange":10000001}]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
  volatile.uuid: 6b9a3e4c-9b7f-4511-b623-176f1c9d35a6
devices:
  share:
    path: /root/mnt
    source: /home/pi/mnt
    type: disk
ephemeral: false
profiles:
- default
stateful: false
description: ""

c1インスタンスのconfigの下の方のdevicesに今回の設定の内容が追加されています。

タイプ: disk - LXD ドキュメント




確認の為に、ホスト側でファイルを作成します。

$ nano /home/pi/mnt/hoge.txt
hoge

hoge.txtにhogeという文字列を保存しておきます。


c1インスタンスの方でファイルを確認する前にホスト側で下記のコマンドで確認しておきます。

$ ls -l ~/mnt
合計 4
-rw-r--r-- 1 pi pi 5  ** ** **:** hoge.txt

※ファイルの生成日に関しては省略します。


piユーザがファイルを作成したことになっています。


c1インスタンスにログインして、上記で作成しましたhoge.txtを読み込んでみます。

$ lxc stop c1
$ lxc start c1
$ lxc exec c1 bash
# less /root/mnt/hoge.txt

※# はコメントではなく、rootアカウントで操作している意味になります

hoge

が出力されました。

c1インスタンスにログインして、hoge.txtというファイルを手動で作成はしていませんので、ホスト側のファイルを読み込んだことになります。


次にhoge.txtを編集してみます。

# nano /root/mnt/hoge.txt

※# はコメントではなく、rootアカウントで操作している意味になります

をして、hoge.txtをエディタで開いてみますが、変更権限がなくファイルを変更する事が出来ません。


# ls -l /root/mnt

をして、ファイルの権限を確認してみますと、

total 0
-rw-r--r-- 1 nobody nogroup 0 ** ** **:** hoge.txt

ユーザ(nobody)とグループ(nogroup)が見覚えのない値になっていました。

※メモ:nobodyのUIDは65534でnogroupのGIDも65534

ユーザー識別子 - Wikipedia




c1インスタンス側からマウントしたフォルダ内でファイルの作成や編集を行えるようにしてみます。

# exit

でインスタンスから抜けた後、ホスト側でUIDやGIDの設定を行っていきます。


最初にホストを操作しているアカウントの情報を調べます。

$ whoami; id -u; id -g
pi
1000
1000

現在操作中のアカウントはpiというアカウントでUIDが1000、GIDが1000になっていました。

ユーザー識別子 - Wikipedia


Linuxの慣習により、アカウントのユーザー識別子は1000から付与するそうで、最初に作成しましたpiには、UIDとGIDに1000を付与することになります。

※次にadduserで追加したアカウントにはUIDとGIDに1001を付与するそうです。


上記で調べました値をsubuidとsubgidに登録します。

$ sudo nano /etc/subuid

でsubuidを開き、末尾に

root:1000:1

を追加します。


同様に

$ sudo nano /etc/subgid

でsubgidを開き、末尾に

root:1000:1

を追加します。


続いて、

lxc config set c1 raw.idmap 'both 1000 1000'

でc1インスタンスの設定にraw.idmap 'both 1000 1000'を追加します。


念の為に設定内容を確認しておきます。

$ lxc config show c1
architecture: aarch64
config:
  image.architecture: arm64
  image.description: ubuntu 24.04 LTS arm64 (release) (20240423)
  image.label: release
  image.os: ubuntu
  image.release: noble
  image.serial: "20240423"
  image.type: squashfs
  image.version: "24.04"
  raw.idmap: both 1000 1000
  volatile.base_image: 33534c9f8ea2994a8d77d1a5de9668f7c086327680391f621dcdf98a9824fb7a
  volatile.cloud-init.instance-id: ad374b14-b285-4110-914b-9d0047e730ac
  volatile.eth0.host_name: veth5974fc87
  volatile.eth0.hwaddr: 00:16:3e:b1:5a:48
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":165536,"Nsid":0,"Maprange":1000},{"Isuid":true,"Isgid":true,"Hostid":1000,"Nsid":1000,"Maprange":1},{"Isuid":true,"Isgid":false,"Hostid":166537,"Nsid":1001,"Maprange":9999000},{"Isuid":false,"Isgid":true,"Hostid":165536,"Nsid":0,"Maprange":1000},{"Isuid":true,"Isgid":true,"Hostid":1000,"Nsid":1000,"Maprange":1},{"Isuid":false,"Isgid":true,"Hostid":166537,"Nsid":1001,"Maprange":9999000}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":165536,"Nsid":0,"Maprange":1000},{"Isuid":true,"Isgid":true,"Hostid":1000,"Nsid":1000,"Maprange":1},{"Isuid":true,"Isgid":false,"Hostid":166537,"Nsid":1001,"Maprange":9999000},{"Isuid":false,"Isgid":true,"Hostid":165536,"Nsid":0,"Maprange":1000},{"Isuid":true,"Isgid":true,"Hostid":1000,"Nsid":1000,"Maprange":1},{"Isuid":false,"Isgid":true,"Hostid":166537,"Nsid":1001,"Maprange":9999000}]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
  volatile.uuid: 778a5b9c-6686-4d70-8d34-a203b3eae59a
devices:
  share:
    path: /root/mnt
    source: /home/pi/mnt
    type: disk
ephemeral: false
profiles:
- default
stateful: false
description: ""

raw.idmap: both 1000 1000が追加されていました。


$ lxc stop c1
$ lxc start c1
$ lxc exec c1 bash

でc1インスタンスにログインして、

# ls -l /root/mnt

でファイルの権限を確認してみますと、

total 4
-rw-r--r-- 1 ubuntu ubuntu 5 ** ** **:** hoge.txt

ubuntu(UID:1000)がhoge.txtを作成したことになっています。


rootアカウントのままでmntフォルダ内でroot.txtというファイル名のファイルを作成してみます。

作成後に

# ls -l /root/mnt

で確認してみましたところ、

total 8
-rw-r--r-- 1 ubuntu ubuntu 5 ** ** **:** hoge.txt
-rw-r--r-- 1 root   root   5 ** ** **:** root.txt

root(UID=0)アカウントがroot.txtを作成したことになっています。

※c1インスタンス内でのファイルの編集に関しましては端折ります


# exit

でインスタンスから抜けた後、ホスト側でroot.txtの作成者を確認してみますと、

$ ls -l
合計 8
-rw-r--r-- 1 pi     pi     5  ** ** **:** hoge.txt
-rw-r--r-- 1 165536 165536 5  ** ** **:** root.txt

UID、GID共に165536のアカウントが作成したことになっていました。


このIDはLinuxのコンテナを理解する上で重要になってくるそうですが、今回は触れずに終了します。

マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。