TL;DR
- macOS 上の Docker でホストのディレクトリをマウントすると、GNU/Linux のコンテナの中でも、ファイル名の大文字と小文字が区別されなかった。
- マウントしたディレクトリは Virtiofs で共有されており、実際のファイル操作はホストの APFS が行っているので、APFS の挙動になると解釈した。
背景
GNU/Linux のコンテナを立ち上げたところ、ファイル名の大文字と小文字が区別されなかった(case-insensitive)。具体的には、touch a.txt と touch A.txt を実行しても、a.txt しかできなかった。GNU/Linux であれば、本来は大文字と小文字が区別される(case-sensitive)はずである。
環境
- ホスト OS: macOS
- Docker: 27.4.1
- コンテナ: Debian GNU/Linux 12 (bookworm)
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"検証
コンテナの中で df コマンドを実行し、ファイルシステムを確かめた。
$ df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
overlay overlay 555453432 14710880 540742552 3% /
tmpfs tmpfs 65536 0 65536 0% /dev
shm tmpfs 8208384 0 8208384 0% /dev/shm
mac virtiofs 971350180 402002032 569348148 42% /app
/dev/vdb1 btrfs 555453432 14710880 540742552 3% /etc/hosts
tmpfs tmpfs 8208696 0 8208696 0% /sys/firmware結果
ホスト側からマウントしているディレクトリ(/app)は、ファイルシステムとして Virtiofs を使っていた。
考察
Virtiofs の Design Document の Architecture の節には、次のように書かれている。
File I/O is performed on behalf of the VM by virtiofsd using system calls. An underlying file system on the hypervisor performs the file I/O. The underlying file system can be a local file system or a remote file system.
ファイル I/O は、VM の代わりに virtiofsd がシステムコールで実行し、実際のファイル I/O はハイパーバイザ上にある下層のファイルシステムが担当する。
この「ハイパーバイザ上にある下層のファイルシステム」は、今回の場合は macOS のファイルシステムである APFS だと解釈した。実際のファイル操作は APFS 自身が行っているので、コンテナの中でも大文字と小文字が区別されない挙動になる。コンテナが物理ストレージを直接見られるわけでも、その権限があるわけでもないので、納得のいく結末だった。より詳しく知るには virtiofsd のソースコードを読めばよさそうだが、今回はそこまでは調べていない。
キーワード
- Docker
- Virtiofs
- APFS