ファイルシステム
ファイルシステム
- ファイル名・更新日付などの属性データ・ファイルデータ本体を効率よく管理するための仕組み
主なファイルシステム
- ディスク
- ext3
- ext4
- XFS
- ネットワーク
- NFS
- CIFS
- 特殊
- procfs
- tmpfs
- FUSE(Filesystem in Userspace)
- カーネル外部のプログラムでファイルシステムを記述するもの
- ディスク
ファイルとは
- 何らかのデータを保持する
- 付帯情報(属性、更新時間 etc...)
- 名前(パス) で指定できる
- ファイルの種類
- 普通のファイル(regular file)
- 内容がそのまま記録されているファイル
- ディレクトリ
- 他のファイルを複数入れることができるファイル
- シンボリックリンク
- 他のファイルの名前を格納したファイルのこと
- デバイスファイル
- 名前付きパイプ
- プロセス間通信で使うファイル
- FIFO
- UNIX ドメインソケット
- プロセス間通信で使うファイル
- 現在は TCP ソケットで代替
- 普通のファイル(regular file)
ファイルシステムの種類
- ext2, ext3, ext4
- ext 参照
- XFS
- Btrfs
- Linux 向けの堅牢なファイルシステム
- FAT/FAT32
- フラッシュメモリ等で使われるファイルシステム
- NTFS
- Windows NT/2000 以降が採用するファイルシステム
- NFS
- procfs
- プロセス情報を扱う仮想ファイルシステム
- sysfs
- デバイス情報を扱う仮想ファイルシステム
- tmpfs
- メモリ上に作成可能なファイルシステム
ファイルシステムの暗号化
LUKS(Linux Unified Key Setup)
- RHEL や CentOS で採用
OS インストール後に暗号化
パッケージインストール
# yum install cryptsetup-luks
暗号化
# cryptsetup create test /dev/vda2
- test
- 名前
- /dev/vda2
- デバイスファイル名
- test
/dev/mapper
配下に指定した名前のデバイスファイルが作成されるext4 にてファイルシステムを作成
# mkfs -t ext4 /dev/mapper/test
Linuxのファイル管理
パーティション
- ハードディスクを利用するために、ハードディスクを区切った単位
- ディスクの内部を複数のパーティション(領域)に区切る作業が必要となる
Linux のディレクトリ構造
- "/" が大元のディレクトリ
- FHS(Filesystem Hierarchy Standard)
- 規格
- これに基づいてディレクトリの構成が作られている
- 2.2. ファイルシステム階層標準 (FHS) の概要
ファイルシステムの操作
- VFS(Virtual File System)
- ローカルファイルシステム
- VFS から受け取った要求を実際に処理
- 「ファイル」という論理的な単位と,「データブロック」という物理的な単位との対応を管理し,それらの変換をする
- ただし,ここでは変換するだけであり,それを保存する場所がハードディスクかフロッピディスクか,あるいはネットワーク上のデバイスかは関知しない
- 最終的にはデバイスドライバが,これらのデータブロックを物理的なデバイスに対応させる
- ここでは,そのデータがどのファイルのものであるかということは一切関知しません。純粋にデータ・ブロックを扱うだけになります
I/O サブシステム
- VFS とブロックレイヤーに分かれる
- VFS
- ユーザプロセスとメモリ上のディスクキャッシュ間のデータ転送を行う
- ブロックレイヤー
- ディスクキャッシュと物理デバイス間のデータ転送を行う
ディスクキャッシュ
バッファキャッシュ
- ディスクへの書き込みが終わったディスクバッファ上のデータを保持しておくことで、再度読み出しが発生した時にそれを利用して高速化を実現するタイプのキャッシュ
ページキャッシュ
- ページ単位で管理されるメモリ上の情報を保持しておくタイプのキャッシュ
ディスクのパーティション
パーティション分割する理由
- システムとデータのバックアップ頻度を差別化する
- 障害発生時の影響範囲を狭める
- ファイルアクセスの速度向上
ハードディスクのバージョン情報の表示
パーティションの分割
- ハードディスクは主に SATA と SAS の 2 つのインタフェース規格が広く使用
- ハードディスクは 1 つのパーティションとして使うか、2 〜 4 つまでのパーティションに分割
- 各パーティションは基本パーティションまたは拡張パーティションとなる
- 拡張パーティションは 1 台のハードディスクに 1 つだけ作ることができ、拡張パーティションの中には、さらに論理パーティションを複数作ることが出来る
- パーティション分割の例
- 基本パーティションを 4 つ
- 基本パーティションを 3 つ + 拡張パーティションを 1 つ(論理パーティションを 2 つ)
- 論理パーティションは、基本パーティションと同様にファイルシステムを作成して、ファイルやディレクトリを保管可能
- 拡張パーティションは論理パーティションを格納する役割となっており、ファイルシステムを作成することは不可
- パーティションの最大数
- IDE : 63
- 基本 3 + 論理 60
- IDE ディスク
- プライマリ・マスタ:hda
- プライマリ・スレーブ:hdb
- セカンダリ・マスタ:hdc
- セカンダリ・スレーブ:hdd
- SATA : 15
- 基本 3 + 論理 12
- SCSI : 15
- 基本 3 + 論理 12
- SCSI ディスクのデバイスファイル名は、ディスク名にパーティション番号を付与したものになる
- 1 番目のSCSIディスク:sda
- 2 番目のSCSIディスク:sdb
- 3 番目のSCSIディスク:sdc
- 7 番目のSCSIディスク:sdg
- IDE : 63
ハードディスクを利用するまでの手順
増設前のデバイス構成の確認
$ ls -l /dev/sd* brw-rw----. 1 root disk 8, 0 6 月 20 11:09 2012 sda brw-rw----. 1 root disk 8, 1 6 月 20 11:09 2012 sda1 brw-rw----. 1 root disk 8, 2 6 月 20 11:09 2012 sda2 brw-rw----. 1 root disk 8, 16 6 月 20 11:09 2012 sdb brw-rw----. 1 root disk 8, 17 6 月 20 11:09 2012 sdb1
- /dev ディレクトリは Linux が認識するすべてのデバイスが置かれている
- hd* または sd* のような名前がついているデバイスがハードディスクドライブになる
- 数字なしのデバイスはディスクドライブ自体を示す
- このシステムでは 2 つのハードディスクドライブが認識されていることが分かる
- 数字付きのデバイスはハードディスクドライブが認識するファイルシステムを示す
- sda には 2 つのパーティションが存在
- sdb には 1 つのパーティションが存在
- /dev ディレクトリは Linux が認識するすべてのデバイスが置かれている
ハードディスクを増設
増設後のデバイス構成の確認
$ ls -l /dev/sd* brw-rw----. 1 root disk 8, 0 6 月 20 11:09 2012 sda brw-rw----. 1 root disk 8, 1 6 月 20 11:09 2012 sda1 brw-rw----. 1 root disk 8, 2 6 月 20 11:09 2012 sda2 brw-rw----. 1 root disk 8, 16 6 月 20 11:09 2012 sdb brw-rw----. 1 root disk 8, 17 6 月 20 11:09 2012 sdb1 brw-rw----. 1 root disk 8, 32 6 月 20 11:09 2012 sdc
- /dev/sdc として追加・認識されている
パーティション情報の確認
# fdisk /dev/sdc コマンド (m でヘルプ): p 現在のパーティション情報を表示 ディスク /dev/sdc: 6442 MB, 6442450944 バイト ヘッド 255 , セクタ 63 , シリンダ 783 Units = シリンダ数 of 16065 * 512 = 8225280 バイト (略) デバイス ブート 始点 終点
- パーティションが分割されていないハードディスクであればブロック Id システム 分割されていない状態で何も表示されない
1. パーティションの作成
- n コマンドで新しいパーティションを確保
- コマンドアクションでは p を指定して、基本 パーティションを 2 つ作成
- パーティションの先頭シリンダ番号と、パーティションのサイズを指定
- パーティションを確保したら、p コマンドで確保されたパーティションを確認する
```
# fdisk /dev/sdc
コマンド (m でヘルプ): n (新しいパーティション領域の確保)
コマンドアクション e 拡張
p 基本パーティション (1-4) p
(p を入力して基本パーティションを作成) パーティション番号 (1-4): 1
(初めてパーティションを作成するので 1) 最初 シリンダ (1-783, default 1): 1
(デフォルトの先頭シリンダを指定)
Last シリンダ,+ シリンダ数 or +size(K,M,G) (1-783, 初期値 783): +1024M (確保するサイズ)
コマンド (m でヘルプ): n (新しいパーティションの確保)
コマンドアクション e 拡張
p 基本パーティション (1-4) p
(基本パーティションを作成) パーティション番号 (1-4): 2
(2 つ目のパーティションを作成するので 2)
最初 シリンダ (126-783, default 126): 126
(先頭シリンダを指定)
Last シリンダ,+ シリンダ数 or +size(K,M,G) (126-783, 初期値 783): +1024M (確保するサイズ)
コマンド (m でヘルプ): p (現在のパーティション情報を表示)
ディスク /dev/sdc: 6442 MB, 6442450944 バイト ヘッド 255 , セクタ 63 , シリンダ 783
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
(略)
デバイス ブート /dev/sdc1 /dev/sdc2
始点
1 126
終点 ブロック Id システム 125 1004031 83 Linux 250 1004062+ 83 Linux
(確保したパーティションがリスト表示される)
```
- パーティションの分割は途中を空けないで連続して指定するので、最初シリンダの数はデフォルトのシリンダ数をそのまま使えます
- 終点シリンダの 数の代わりに + を付けたサイズを指定可能
- シリンダ数を計算して指定するなどの面倒な作業は必要がないので楽
1. パーティションの種類の変更
- 確保したばかりのパーティ ションは、Linux のファイルシステム用である Id の 83(Linux 用)が指定されている
- スワップとして利用するためには、t コマンドで種類を変更する
```
コマンド (m でヘルプ): t (確保したパーティションの情報を変更) パーティション番号 (1-4): 2
16 進数コード (L コマンドでコードリスト表示): L (パーティションの種類のリスト表示)
0 空
1 FAT12
2 XENIX root
3 XENIX usr
4 FAT16 <32M
5 拡張パーティション 41 PPC PReP Boot 85 Linux 拡張領 c7
df e1
1e Hidden W95 FAT1 80 古い Minix be Solaris boot
24 NEC DOS 81 Minix/古い bf Solaris
39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT- 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
40 Venix 80286 84 OS/2隠しC: c6
DRDOS/sec (FAT-
Syrinx 非FSデー CP/M/CTOS/.
Dell ユーテ BootIt
DOS access
6 FAT16
7 HPFS/NTFS
8 AIX
9 AIX ブート 4f QNX4.x 3rd part 8e Linux LVM
a OS/2 ブート 50 OnTrack DM 93 Amoeba
b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT
c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad
f W95 Ext'd (LBA) 54 OnTrackDM6
16 進数コード (L コマンドでコードリスト表示): 82 (スワップ領域を指定)
Changed system type of partition 2 to 82 (Linux swap / Solaris)
```
1. パーティション情報の保存
- パーティション情報は、w コマンドでハードディスクに書き込むと変更されます
- パーティション情報の再読込が行えなかった場合には、警告が表示されるので、システムを再起動する
- パーティション情報をハードディスクへ書き込まないで、パーティションの変更を破棄したい場 合には、fdisk を q コマンドで終わらせます
```
コマンド (m でヘルプ): w (ハードディスクにパーティション情報を書き込む)
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
(ワーニングメッセージは出ますが、書込みは終了できます) コマンド (m でヘルプ): q
```
1. 再起動(警告が表示されて、必要な場合)
1. ファイルシステムの作成
1. マウント
1. スワップパーティションの作成
1. スワップの追加
1. 自動マウントの設定
ファイルシステム
- データは、管理情報などと共に,一定のサイズに分割した「データ・ブロック」の形で保存される
- データ・ブロックの入出力に際して補助記憶装置側は,ディレクトリ階層やファイル名といった情報による区分は一切しません
- 補助記憶装置にファイルを書き込んだり,読み出したりできるのは,OS がファイルとデータ・ブロックとを対応付けて処理するから
- ディスクは,セクターという一定サイズの小さな記録領域に分割されている
- 一般にデータは,分割されて複数のセクターに記録
- セクターの大きさ
- 一般に 1 セクター当たり 512 バイト
- データは,セクターを単位としてディスクに入出力される
- セクターより小さな単位でデータをやりとりすることはできず,どんなに小さなデータでもディスクに保存するときは 1 セクター利用される
- セクターには管理用のアドレス(セクター番号) が割り当てられ,入出力されるデータは,すべてこのアドレスで管理される
- ディスクを管理する際には,ディレクトリ階層やファイル名などの情報は一切参照されず,ファイルだろうとディレクトリだろうと,セクター内のただのデータの塊としてしか扱われません
- そのため,データ入出力の際には,元のデータがディスクのどのセクターに保存されているかや,複数のセクターに分割保存されている場合はその場所や順番などをすべて把握しておく必要があります
ext2/ext3/ext4 ファイルシステムでは、万が一ファイルシステムの全ブロックを一般ユーザが使い切った場合でも、 root による作業を可能にするため、root ユーザ専用の領域が確保されるようになっている
ラベル
- ハードディスクなどのパーティションを認識するための名前
- 指定方法
- 基本パーティションや論理パーティションにファイルシステムを作る時にラベルを指定
- e2label コマンドの利用
マウント
ハードディスクはパーティションを分割しファイルシステムを作ってからマウントする読み書き可能
マウントポイント
- ハードディスクを利用する場合は、存在しているディレクトリのにマウントする必要があり、マウントするために利用するディレクトリをマウントポイントと呼ぶ
マウント(mountコマンド)
自動マウント
/etc/fstab
への記載# cat /etc/fstab # # /etc/fstab # Created by anaconda on Thu Dec 15 11:10:10 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/VolGroup00-LogVol00 / xfs defaults 0 0 UUID=34f47d55-0163-4525-af1c-54c0d4d082ed /boot xfs defaults 0 0 /dev/mapper/VolGroup00-LogVol01 swap swap defaults 0 0
- /dev/mapper/VolGroup00-LogVol00
- ブロックスペシャルデバイス
- ここにはデバイス名 or ラベル or UUID を指定
- NFS や CIFS を使ってリモートファイルシステムを指定することも可能
- /
- マウントポイント
- xfs
ファイルシステムタイプ
カーネルがサポートしているファイルシステムの確認
# cat /proc/filesystems nodev sysfs nodev rootfs nodev ramfs nodev bdev nodev proc nodev cgroup nodev cpuset nodev tmpfs nodev devtmpfs nodev debugfs nodev securityfs nodev sockfs nodev pipefs nodev anon_inodefs nodev configfs nodev devpts nodev hugetlbfs nodev autofs nodev pstore nodev mqueue nodev selinuxfs xfs nodev rpc_pipefs nodev nfsd
- defaults
- オプション
- マウントオプションの指定
- 0
- dump コマンドがダンプ(バックアップ)するか否か
- 0
- ダンプ不要
- 1
- ダンプ
- 0
- dump コマンドがダンプ(バックアップ)するか否か
- 0
- ブート時にチェックする順番
- 0
- チェックしない
- /dev/mapper/VolGroup00-LogVol00
/etc/mtab
- 現在どのようなファイルシステムがマウントされているか、またどのようなマウントオプションが使われているかの確認
/proc/mounts
にもほぼ同じ情報がある- /etc/mtab を誤って編集した場合などは、/proc/mounts を利用して復旧を試みる
# cat /etc/mtab rootfs / rootfs rw 0 0 sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=238292k,nr_inodes=59573,mode=755 0 0 securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0 tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0 devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0 tmpfs /sys/fs/cgroup tmpfs ro,seclabel,nosuid,nodev,noexec,mode=755 0 0 cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0 pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0 cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0 cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0 cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0 cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0 cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0 cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0 cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0 cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0 cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0 cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0 configfs /sys/kernel/config configfs rw,relatime 0 0 /dev/mapper/VolGroup00-LogVol00 / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0 systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=24,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0 mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0 hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0 nfsd /proc/fs/nfsd nfsd rw,relatime 0 0 /dev/sda2 /boot xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 tmpfs /run/user/1000 tmpfs rw,seclabel,nosuid,nodev,relatime,size=50040k,mode=700,uid=1000,gid=1000 0 0
iノード
ハードリンクとシンボリックリンク
リンク機能
- ファイルをコピーしたり移動したりせず、別のディレクトリにあるように扱うことが出来る機能
ハードリンク
- ファイルの実体を直接指し示して共有
- ハードリンクを削除してもファイルは削除されない
- ハードリンクは i ノード番号を共有することで実現しているので、別のファイルシステム(別パーティション)には作成不可
[root@localhost tmp]# cp -a /usr/bin/file . [root@localhost tmp]# ln file file2 [root@localhost tmp]# ll total 48 -rwxr-xr-x. 2 root root 19768 Nov 6 2016 file -rwxr-xr-x. 2 root root 19768 Nov 6 2016 file2 [root@localhost tmp]# rm file rm: remove regular file ‘file’? yes [root@localhost tmp]# ./file2 Usage: file2 [-bchikLlNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname] [-F separator] [-f namefile] [-m magicfiles] file ... file2 -C [-m magicfiles] file2 [--help] [root@localhost tmp]# rm file2
- file コマンドのコピーを用意し、ln コマンドで file のハードリンクである file2 を作成
- file ファイルを削除しても、file2 が実行できるので、データが削除されないことが分かる
- ファイルのハードリンクを作ると i ノードの領域にあるリンク数が 1 つ増え、ハードリンクを削除するとリンク数が 1 つ減る
- ファイルを消してリンク数が 0 になると、ファイルのデータがファイルシステムから完全に削除される
シンボリックリンク
元ファイルが保管されている位置(パス)を示す擬似的なファイルを作る
シンボリックリンクを削除しても元ファイルに影響はなし
元ファイルを消すとシンボリックリンクからのアクセスがエラーになる
シンボリックリンクは別ファイルシステムの間で作成することが可能
[root@localhost tmp]# man less > man-less [root@localhost tmp]# ln -s man-less doc-less [root@localhost tmp]# ll total 108 lrwxrwxrwx. 1 root root 8 Mar 28 16:19 doc-less -> man-less -rw-r--r--. 1 root root 80231 Mar 28 16:19 man-less
ディスクを管理するコマンド
- ファイルシステムのチェックと修復
- ファイルシステムが不整合に陥った場合、fsck コマンドを使って整合性をチェックし、修復を行なう必要がある
- fsck コマンドは、異常終了した後のシステム起動時に自動的に実行される
I/O スケジューラ
I/O を整理して制御
確認
$ cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) $ cat /sys/block/sda/queue/scheduler noop [deadline] cfq
[]
で囲まれたものが現在値
item content noop 特殊な処理はしない
十分高速か賢いデバイス向けdeadline I/O 待ちが一定時間内に終わることを重複する cfq プロセスごとにキューを持ち、処理が公平に割り当たるようにする
ionice はこの I/O スケジューラじゃないと効かない