今回の内容は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に今回の設定の内容が追加されています。
確認の為に、ホスト側でファイルを作成します。
$ 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
c1インスタンス側からマウントしたフォルダ内でファイルの作成や編集を行えるようにしてみます。
# exit
でインスタンスから抜けた後、ホスト側でUIDやGIDの設定を行っていきます。
最初にホストを操作しているアカウントの情報を調べます。
$ whoami; id -u; id -g
pi 1000 1000
現在操作中のアカウントはpiというアカウントでUIDが1000、GIDが1000になっていました。
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のコンテナを理解する上で重要になってくるそうですが、今回は触れずに終了します。