Linuxのディレクトリ構造はFHS(Filesystem Hierarchy Standard)として標準化されています.RedHat,Debian,SUSE,どんなディストリビューションであっても概ね同じような場所に同じようなファイルが配置されています.
今回はRaspberryPiを使ってディレクトリ構造を説明していきます.
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
- FHS(Filesystem Hierarchy Standard)
- RasPiで見るFHS
- /bin – Essential command binaries
- /boot – Static files of the boot loader
- /dev – Device files
- /etc – Host-specific system configuration
- /home – User home directories
- /lib – Essential shared libraries and kernel modules
- /media – Mount point for removable media
- /mnt – Mount point for mounting a filesystem temporarily
- /opt – Add-on application software packages
- /proc – Kernel and process information virtual filesystem
- /root – Home directory for the root user
- /run – Run-time variable data
- /sbin – Essential system binaries
- /srv – Data for services provided by this system
- /sys – Kernel and system information virtual filesystem
- /tmp – Temporary files
- /usr
- /var
- lost+found
- おわりに
FHS(Filesystem Hierarchy Standard)
WindowsではCドライブの中にWindowsやProgramFilesなど決まった名前のフォルダが配置されています.LinuxでもFHSといった標準化されているファイルシステム構造により,どこに何を配置するのかある程度決められています.
2020-07-08現在,2015年にリリースされたFHS3.0が最新となっています.システムを構築する際に,どこにどんなファイルを配置するのが適当か悩んだときにはFHSをのファイルシステム構造を思い返してみましょう.
RasPiで見るFHS
/(root)を起点に機能毎に様々なディレクトリが配置されています.今回はルート配下のディレクトリについて紹介していきます.
$ tree -L 1 / / ├── bin ├── boot ├── dev ├── etc ├── home ├── lib ├── lost+found ├── media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin ├── srv ├── sys ├── tmp ├── usr └── var 19 directories, 0 files
/bin – Essential command binaries
sh,bash等,一般ユーザでも利用可能な基本的なコマンドが配置されています.
$ which sh bash ls cp mv rm cat nano ps /bin/sh /bin/bash /bin/ls /bin/cp /bin/mv /bin/rm /bin/cat /bin/nano /bin/ps
/boot – Static files of the boot loader
起動に必要な設定ファイルやカーネルイメージが配置されています.このディレクトリはSDカードの先頭の方に配置されており,ルートファイルシステムとは別のパーティションとして用意されています.sshというファイル名のファイルを配置しておくことで,RasPiの起動時にsshdを有効化することが出来ます.
$ sudo fdisk -l ... Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 8192 532479 524288 256M c W95 FAT32 (LBA) /dev/mmcblk0p2 532480 31116287 30583808 14.6G 83 Linux ... $ df /boot Filesystem 1K-blocks Used Available Use% Mounted on /dev/mmcblk0p1 258095 52231 205865 21% /boot
/dev – Device files
RasPiのOSが入っているSDカードのようなブロックデバイスや,i2c,今文字を入力しているpts/0などのキャラクターデバイスが配置されています.
$ ls -l /dev/{mmcblk0*,i2c-1,pts/0} crw-rw---- 1 root i2c 89, 1 Jul 4 17:53 /dev/i2c-1 brw-rw---- 1 root disk 179, 0 Jul 4 17:53 /dev/mmcblk0 brw-rw---- 1 root disk 179, 1 Jul 4 17:53 /dev/mmcblk0p1 brw-rw---- 1 root disk 179, 2 Jul 4 17:53 /dev/mmcblk0p2 crw--w---- 1 pi tty 136, 0 Jul 8 03:03 /dev/pts/0 $ w 03:06:12 up 3 days, 9:13, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT pi pts/0 ${接続元IP等} 01:43 0.00s 1.92s 0.01s w
/etc – Host-specific system configuration
システムやアプリケーションの設定ファイル,スクリプトファイルが配置されています.sshデーモンの設定ファイル,バッシュ起動時に読み込まれるbashrcなど,システム構築に必要な多くの設定ファイルがこのディレクトリに配置されています.
$ ls -l /etc/{profile,bash.bashrc,ssh/sshd_config,passwd,shadow}
-rw-r--r-- 1 root root 1994 Apr 18 2019 /etc/bash.bashrc
-rw-r--r-- 1 root root 1560 May 27 16:24 /etc/passwd
-rw-r--r-- 1 root root 799 May 27 16:12 /etc/profile
-rw-r----- 1 root shadow 912 May 27 16:24 /etc/shadow
-rw-r--r-- 1 root root 3250 Feb 1 05:55 /etc/ssh/sshd_config
/home – User home directories
ユーザ毎のホームディレクトリが配置されています.RasPiのデフォルトではpiユーザのディレクトリのみ配置されています.ユーザ毎のホームディレクトリは/etc/passwd
ファイルでも確認することが出来ます.
$ ls -l /home/
total 4
drwxr-xr-x 7 pi pi 4096 Jul 8 03:13 pi
$ cat /etc/passwd | grep pi
pi:x:1000:1000:,,,:/home/pi:/bin/bash
/lib – Essential shared libraries and kernel modules
共有ライブラリやカーネルモジュールなどが配置されています.例えばcpコマンドの場合には以下の用に/lib
以下のライブラリをいくつも利用しています.
$ ldd /bin/cp linux-vdso.so.1 (0x7efaa000) /usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so => /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so (0x76f87000) libselinux.so.1 => /lib/arm-linux-gnueabihf/libselinux.so.1 (0x76f55000) libacl.so.1 => /usr/lib/arm-linux-gnueabihf/libacl.so.1 (0x76f3e000) libattr.so.1 => /usr/lib/arm-linux-gnueabihf/libattr.so.1 (0x76f29000) libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76ddb000) /lib/ld-linux-armhf.so.3 (0x76f9c000) libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0x76d64000) libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0x76d51000) libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x76d27000)
/media – Mount point for removable media
リムーバブルメディアのマウントポイントとして利用するディレクトリを配置します.USBメモリ,CD-ROM,ZIPファイルなどのマウントポイントを置いて使うと良さそうです.
$ ls -al /media/ total 8 drwxr-xr-x 2 root root 4096 May 27 16:05 . drwxr-xr-x 21 root root 4096 Jun 4 22:09 ..
/mnt – Mount point for mounting a filesystem temporarily
NFS等のファイルシステムを一時的にマウントするために利用します.
$ ls -al /mnt/ total 8 drwxr-xr-x 2 root root 4096 May 27 16:05 . drwxr-xr-x 21 root root 4096 Jun 4 22:09 ..
/opt – Add-on application software packages
アドオンパッケージのインストール場所として利用します.RasPiではraspberrypi-firmwareに含まれるプログラムが配置されています.
オンボードハードウェアセンサやカメラモジュールのユーティリティ,いくつかのサンプルプログラムが配置されています.
$ /opt/vc/bin/vcgencmd measure_temp temp=45.6'C $ /opt/vc/bin/vcgencmd measure_volts core # コアの電圧 volt=1.2000V $ /opt/vc/bin/vcgencmd measure_volts sdram_c # sdram Core の電圧 volt=1.2000V $ /opt/vc/bin/vcgencmd measure_volts sdram_i # sdram I/O の電圧 volt=1.2000V $ /opt/vc/bin/vcgencmd measure_volts sdram_p # sdram PHY の電圧 volt=1.2250V $ ls -l $(which raspistill) lrwxrwxrwx 1 root root 22 Jun 2 02:38 /usr/bin/raspistill -> /opt/vc/bin/raspistill
/proc – Kernel and process information virtual filesystem
カーネルやプロセスのインターフェイスとなるファイルが配置されている仮想ファイルシステムです.procファイルシステムとして認識しています.CPUやメモリの情報を確認できるcpuinfoやmeminfoは有名です./proc配下のファイルは一部のコマンドからも参照されています.例えばメモリを確認するfreeコマンドはこのmeminfoを使っています.
$ df /proc Filesystem 1K-blocks Used Available Use% Mounted on proc 0 0 0 - /proc $ cat /proc/cpuinfo | head processor : 0 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 $ cat /proc/meminfo | head MemTotal: 948280 kB MemFree: 704896 kB MemAvailable: 804704 kB Buffers: 39536 kB Cached: 131356 kB SwapCached: 0 kB Active: 124696 kB Inactive: 59588 kB Active(anon): 13620 kB Inactive(anon): 35684 kB $ man free | grep 'parsing /proc/meminfo' free displays the total amount of free and used physical and swap memory in the system, as well as the buffers and caches used by the kernel. The information is gathered by parsing /proc/meminfo.
/root – Home directory for the root user
rootユーザのホームディレクトリです.
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
/run – Run-time variable data
PID情報やソケットファイルなど,OS起動後のシステム情報が配置されています.例えばpsで表示されるPIDは/run以下のpidファイルでも確認することができます.
$ ps -C cron PID TTY TIME CMD 339 ? 00:00:03 cron $ cat /run/crond.pid 339
/sbin – Essential system binaries
システム管理に必要となるコマンドが配置されます.shutdown,reboot,fdiskなどroot権限が必要となるコマンドがたくさん配置されています.
$ which shutdown reboot init mkfs fdisk insmod
/sbin/shutdown
/sbin/reboot
/sbin/init
/sbin/mkfs
/sbin/fdisk
/sbin/insmod
/srv – Data for services provided by this system
サービスに関するファイル等を置いておく場所です.細かい使い方は定義されていません.Apacheで使うwwwディレクトリ,ftpやrsync用の公開データ配置場所などに利用すると良いようです.デフォルトのRasPiでは何も配置されていません.
/sys – Kernel and system information virtual filesystem
デバイス,ドライバ,カーネル機能の情報やインターフェイスが配置されています.RasPiは電源ランプ(赤)とSDカードのアクセスランプ(黄)がオンボードで実装されています.一つはact,もう一つはpwrという名前が設定されています.pwrのトリガーはinputとなっており,電源が入っていれば輝度255で点灯します.もしもLEDが眩しければ,消灯させることも出来ます.もちろん点灯トリガーを変更することも出来ます.
$ head /sys/class/leds/led*/uevent ==> /sys/class/leds/led0/uevent <== OF_NAME=act OF_FULLNAME=/leds/act OF_COMPATIBLE_N=0 ==> /sys/class/leds/led1/uevent <== OF_NAME=pwr OF_FULLNAME=/leds/pwr OF_COMPATIBLE_N=0 $ cat /sys/class/leds/led1/trigger | sed -e 's/ /\n/g' | grep '^[' [input] $ cat /sys/class/leds/led1/brightness 255 $ echo 0 | sudo tee /sys/class/leds/led1/brightness 0
/tmp – Temporary files
一時的なファイル置き場として利用します.このディレクトリは所有者のみがファイルやディレクトリを削除出来るようにスティッキービットという特殊なアクセス権が設定されています.
$ ls -ld /tmp/
drwxrwxrwt 8 root root 4096 Jul 10 18:08 /tmp/
/usr
このディレクトリにはコマンドやライブラリなどを配置します.
$ ls -l /usr/ total 52 drwxr-xr-x 2 root root 24576 Jul 8 02:17 bin drwxr-xr-x 2 root root 4096 May 11 05:59 games drwxr-xr-x 36 root root 4096 Jun 14 15:58 include drwxr-xr-x 48 root root 4096 Jul 4 19:50 lib drwxr-xr-x 10 root root 4096 May 27 16:05 local drwxr-xr-x 2 root root 4096 Jun 4 22:43 sbin drwxr-xr-x 98 root root 4096 Jul 4 19:51 share drwxr-xr-x 2 root root 4096 May 11 05:59 src
中身はbin,sbinなどのディレクトリで細分化されています.ここまでで紹介してきた/binや/sbinなど名前が同じディレクトリがありますが,これらの使い分けについてLPI-JAPANでは次のように説明しています.
まず、「/bin」ディレクトリには、シングルユーザモードでも利用できるコマンドを置きます。逆の言い方をすると、「/usr/bin」や「/usr/local/bin」に置かれているコマンドなどはシングルユーザモードで利用できないということになります。シングルユーザモードは、基本的にOSが壊れて正常に起動できないなど非常時に利用するものですので、「/bin」にはごく基本的かつ非常時に利用するコマンドが置かれることになります。
LPI-JAPAN – Linux豆知識 214 「/bin」「/usr/bin」「/usr/local/bin」ディレクトリの使い分け
つまり最小限の環境で動作するために必要なものは/bin,その他は/usr/binに配置するというようなポリシーとなっています.なぜこんな紛らわしい仕様になっているかは以下が参考になります.
そもそもなぜ、/binと/usr/binで分けるようになったのか。それは、インストールやシステム修復時に使うminirootのようなシングルユーザーモードで必要なものをルートパーティションに置いたためで、このルートパーティションの容量は必要最小限(古くはフロッピーディスクの容量)で済むように工夫されてきた。そこで、必須のものを/bin、それ以外を/usr/binに置くようになった。もちろんルートパーティションと/usrパーティションを同一にすることも可能だが、現実には、そのような運用はあまりされていない。
/bin – 通信用語の基礎知識
しかしながら,ディストリビューションによってポリシーが異なる場合があります.Arch Linuxでは/binを/usr/binへのシンボリックとして扱っているようです.この辺りは今後統廃合されるかもしれません.
ちなみにusrは”User Services and Routines”の略です.
/var
ここには可変データファイルを配置します.このディレクトリで最も有名なのはおそらくlogディレクトリでしょうか.その他メールやプリンタのスプールなど頻繁に書き換えられるデータが配置されています.
$ ls -l /var/ total 102436 drwxr-xr-x 2 root root 4096 Jul 10 06:25 backups drwxr-xr-x 8 root root 4096 May 27 16:24 cache drwxr-xr-x 28 root root 4096 Jul 4 19:50 lib drwxrwsr-x 2 root staff 4096 May 11 05:59 local lrwxrwxrwx 1 root root 9 May 27 16:05 lock -> /run/lock drwxr-xr-x 4 root root 4096 Jul 10 00:00 log drwxrwsr-x 2 root mail 4096 May 27 16:05 mail drwxr-xr-x 2 root root 4096 May 27 16:05 opt lrwxrwxrwx 1 root root 4 May 27 16:05 run -> /run drwxr-xr-x 4 root root 4096 May 27 16:09 spool -rw------- 1 root root 104857600 May 27 16:24 swap drwxrwxrwt 3 root root 4096 Jul 10 00:00 tmp
lost+found
このディレクトリはシステムがクラッシュした際にファイルを保持するためのディレクトリです.平時は特に気にする必要もないディレクトリですが,誤って削除してしまった場合はmklost+found
コマンドで作成することが出来ます.
おわりに
FHSについてRasPiを使って説明しました.一部FHSの定義に含まれていないものもありますが,どのLinuxを使っても概ね同じような構成であることが理解できれば御の字です.システム構築の際にはどこに何を配置するかFHSを頭の片隅に置いておくと良いです.
単一のページとしては長い...長過ぎる...
コメント