RaspberryPiで理解するLinuxのディレクトリ構造

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)

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を頭の片隅に置いておくと良いです.

単一のページとしては長い...長過ぎる...

コメント

タイトルとURLをコピーしました