104 Device / FHS#
パーティションとファイルシステムの作成#
以下はLinuxで主に使用されるファイルシステム
ファイルシステム | 説明 |
---|---|
ext2 | 以前のLinuxで標準的に使用されていた規格 |
ext3 | * ext2の後継 * ジャーナリングファイルシステム |
ext4 | * ext3の後継 * ジャーナリングファイルシステム |
XFS | * シリコングラフィックス社(SGI)が開発 * ジャーナリングファイルシステム * 動的innode |
JFS | * IBMが開発 * ジャーナリングファイルシステム * 動的innode |
-
ジャーナリングファイルシステム(Journaling file system)
書き換え処理要求(トランザクション)単位で内包するファイル構成情報を含むメタデータを管理および保持できる機能を持ったファイルシステムのこと。 ジャーナルファイルシステムともいう。端的に言うと、更新履歴をジャーナル(ログ)に記録しておく機能をもったファイルシステム。 -
innode
inodeとは、Linuxファイルシステムにおいてファイルの属性(パーミッションや所有ユーザなどの情報)を格納するものです。 全てのファイルには対応するinode番号があります。動的inodeの機能とは、ファイル作成時にinode番号を動的に割り当てる機能のことです。 inodeを動的に割り当てるため、inodeの数に制限はありません。 動的inodeの機能がないファイルシステムでは、inodeはファイルシステム作成時に作成され、増やすことはできません。 そのため、ファイルの数が増えるなどして使用可能なinodeがなくなると、 ディスクに空き容量があってもファイルを新規に作成することができなくなります。
ハードディスク#
ハードディスクは「パーティション」と呼ばれる部分に分割して利用します。 ディスク全体をひとつの領域とする場合にも、全容量を割り当てたひとつのパーティションを作る必要があります。
ハードディスク全体のパーティションの情報をパーティションテーブルと呼びます。 パーティションテーブルの管理方式は従来のMBR(Master Boot Record)と新しいGPT(GUID Partition Table)の2種類があります。
MBRでは、パーティションには基本(Primary)パーティションと拡張(Extended)パーティションがあり、 基本パーティションは 4 個までしか作成することができません。それ以上の数に分割するためには、 基本パーティションのひとつを拡張パーティションとして割り当て、そのパーティションを さらに論理(Logical)パーティションに分割します。 これらパーティションに関する操作には fdisk というコマンドを使用します。
GPTでは基本パーティションが128個作成できるようになっています。 そのため拡張パーティション、論理パーティションという考え方はなくなりました。 また、MBRにあったハードディスク容量が2.2TB(2TiB: テビバイト)までしか管理できないという制約がなくなり、 理論上9.4ZB(8ZiB: ゼビバイト)までの容量のハードディスクを管理することができるようになっています。 こういった大幅な変更のため、GPT方式のハードディスクでは fdisk は使用できません。 GPTでのパーティションに関する操作には gdisk というコマンドを使用します。
Info
ZB(ゼタバイト)とは、1GB(ギガバイト)x 1000(テラ:T) x 1000(ペタ:P)x 1000(エクサ:E)x 1000(ゼタ:Z)のサイズのことです。
各パーティションはただの領域であり、それだけではデータの読み書きに利用することができません。 パーティションをファイルシステムで「フォーマット」することで、ファイルを単位としたデータの管理が行えるようになります。 この操作には mkfs などのファイルシステムを作成するコマンドを使用します。
そして実際にファイルの読み書きを行うためには、さらにそのファイルシステムを現在のルートファイルシステム上の どこかにマウントし、ルート (/) からのパスを使ってアクセス可能にしなければなりません。 この操作には mount コマンドを使用します。
したがって、新しいハードディスクを Linux システム上で利用するためには
- パーティションを切る(基本パーティション、拡張パーティション、論理パーティションを作成)
- 各パーティションをフォーマットし、ファイルシステムを作る
- 作ったファイルシステムをマウントする
という手順を踏む必要があります。
以下ではパーティションの種類について解説します。
・基本パーティション 基本パーティションは1つのハードディスクにMBRだと最大4個、GPTだと最大128個作成することができます。 また、それぞれのパーティションにはファイルシステムを作成することができます。 ファイルシステムを作成することで、パーティション内でファイルやディレクトリのようなデータを扱うことができるようになります。
1番目のSCSIハードディスクの基本パーティションは以下のように表します。
- /dev/sda1 1番目のパーティション
- /dev/sda2 2番目のパーティション
- /dev/sda3 3番目のパーティション
- /dev/sda4 4番目のパーティション
なお、MBRでは基本パーティションのうち1つを拡張パーティションにすることができます。
-
拡張パーティション
論理パーティションを作成するためのパーティションです。拡張パーティションにファイルシステムを作成することはできません。 拡張パーティションは基本パーティションの1つに割り当てますので、上記のSCSIハードディスクの場合、表記は「/dev/sda1」から 「/dev/sda4」のどれかになります。 -
論理パーティション
論理パーティションは拡張パーティション内に作成します。MBRで管理するハードディスクにおいて、 基本パーティションのみでは足りない場合(パーティションが5つ以上必要な場合)に論理パーティションを 利用します。それぞれのパーティションにはファイルシステムを作成することができます。 なお、論理パーティションは作成された基本パーティションの数に関わらず、5番目のパーティションからの表記となります。 上記のSCSIハードディスクの場合ですと、「/dev/sda5」からです。
IDE / SATA / SCSI#
IDEの接続インターフェースにはプライマリとセカンダリがあり、それぞれにマスターとスレーブのデバイスを接続できます。 合計4台のIDEデバイスを接続できます。対応するデバイスファイル名は以下の通りです
- /dev/hda プライマリのマスター(1番目のディスク)
- /dev/hdb プライマリのスレーブ(2番目のディスク)
- /dev/hdc セカンダリのマスター(3番目のディスク)
- /dev/hdd セカンダリのスレーブ(4番目のディスク)
また、各ディスクのパーティションの番号は、ファイル名の末尾の数字で表します。
例)「/dev/hda」ディスクのパーティションの場合
- /dev/hda1 1番目のパーティション
- /dev/hda2 2番目のパーティション
- /dev/hda3 3番目のパーティション
SCSI接続のハードディスクではデバイスファイル名は以下のようになります。 また、IDE接続のハードディスクでも、カーネル2.6.18以降では、こちらの表記に統一されました。
- /dev/sda 1番目のディスク
- /dev/sdb 2番目のディスク
- /dev/sdc 3番目のディスク
- /dev/sdd 4番目のディスク
例えば、2番目のディスクの3番目のパーティションであれば「/dev/sdb3」となります。
exFAT#
exFAT(Extended FAT: イーエックスファット)は、USBメモリのようなフラッシュドライブ向けのファイルシステムです。 exFATには以下の特徴があります。
- マイクロソフトが開発したプロプライエタリなファイルシステム
ソフトウェアにおける「プロプライエタリ(私有の)」とは、「開発者によりプログラムやソースコードの利用に際して、 秘密保持契約や利用料の支払いが必要などの制限がかけられている」ことを意味します。exFATはマイクロソフトにより 仕様やソースコードが開示されておらず、そのためLinuxカーネルでは直接サポートしていません。(※1)
Note
(※1)2019年8月に、マイクロソフトによってexFATの仕様が公開されました。
- LinuxでのexFATの利用にはFUSE(Filesystem in Userspace)が必要
上述の制限を回避するため、LinuxでexFATを使用するにはFUSEが必要になります。FUSEは、Linuxカーネルでサポートしていない ファイルシステムをユーザ空間(ユーザプログラムが直接アクセスできるリソース)からアクセスできるようにするための インターフェースです。有志が作成したexFAT用のFUSEモジュールを組み込むことで、Linux上でexFATを扱えるようになります。 LinuxでexFATファイルシステムをマウントして使用するには、exfat-utilsやfuse-exfatなどのパッケージをインストールする 必要があります。(※2)
Note
(※2)exFATの仕様公開後、カーネル5.4からUbuntuなど一部のディストリビューションにおいてexFATがサポートされました。
- フラッシュドライブ向けのファイルシステム
Windows/Linux/macOSで使用できるため、異なるOS間でのデータ共有に使いやすいです。 従来のフラッシュドライブ向けのFATファイルシステムとの互換性はありません。FAT32ファイルシステムで扱えるファイルの最大サイズが4GiB (ギビバイト)であるのに対して、exFATでは大容量のファイルを扱えるようになりました(理論上では16EiB: エクスビバイト)。 最大ボリュームサイズも拡張されています。
Btrfs#
Btrfs(B-tree File System: バターエフエス、またはビーツリーエフエスと発音します)は 比較的新しく高機能なLinuxのファイルシステムです。Btrfsは以下の機能を持っています。
-
マルチデバイスへの対応
これまでのext2/ext3/ext4は、単一デバイスの単一パーティションにしかファイルシステムを作成できませんでした。 その後「論理ボリュームマネージャ(LVM: Logical Volume Manager)」によって複数デバイスを論理的に1つの デバイスとして扱うことで、複数のデバイスにまたがってファイルシステムを作成することができるようになりました。 しかし、Btrfsはファイルシステム自身が複数のデバイス(マルチデバイス)を直接扱えるようになっています。 -
サブボリューム
Btrfsは、ディレクトリの一部を「サブボリューム」として個別のファイルシステムのように扱えます。 サブボリュームを使うことで、ある時点のファイルシステムの状態を「スナップショット」として取得 することができるようになります。 -
圧縮
Btrfsは、ファイルシステムが自動でデータを圧縮できるようになっています。圧縮用の特別な操作を必要とせず、 マウント時に自動圧縮を有効にするオプションを指定するだけで動作します。
以下はBtrfsの操作例です。
-
例)複数のデバイス「/dev/sda1」と「/dev/sdb1」にBtrfsファイルシステムを作成する
mkfs.btrfs /dev/sda1 /dev/sdb1
-
例)「/home」のスナップショットを「/tmp/home_bak」という名前で取得する
btrfs subvolume snapshot /home /tmp/home_bak
スワップ#
スワップに関連するコマンドには mkswap, swapon, swapoff があります。 実際にスワップを利用する流れとしては、
- スワップ用のパーティション(またはファイル)を用意する
- mkswap コマンドでスワップ領域を作成
- swapon コマンドでスワップ領域を有効化
- (不要になれば)swapoff コマンドでスワップ領域を無効化
swapon#
スワップを有効にするコマンド
Tip
スワップ領域とは、物理メモリ(実メモリ)に収まらなかった情報を一時的に格納する為の、通常ハードディスク上に作成する領域です。
swapoff#
スワップ領域を無効にするコマンド
mkswap#
スワップを作成するコマンド
parted#
MBR形式、GPT形式のパーティションテーブルをサポートするパーティション操作コマンドはpartedです。 partedは以下のパーティションテーブルをサポートしています。
- bsd
- loop (raw disk access)
- gpt
- mac
- msdos
- pc98
- sun
partedコマンドの書式は以下のとおりです。 parted [ -l ] デバイスファイル名
「-l」オプションはすべてのデバイスのパーティションテーブルを表示します。パーティションテーブルにはパーティションの情報が格納されています。
Warning
partedコマンドの呼び出しは、以下の点でfdiskと異なりますので注意が必要です。 * デバイスファイル名を指定しない場合、fdiskは処理を行わずコマンドヘルプを表示しますが、partedでは検出した最初のブロックデバイスを自動で選択します。 * 「-l」オプションは、fdiskは表示するデバイスを指定できますが、partedでは指定は無視され、すべてのハードディスクの情報を表示します。
主なサブコマンド:
サブコマンド | 機能 |
---|---|
mklabel, mktable | 新しいパーティションテーブルを作成する |
mkpart | 新しいパーティションを作成する |
rm | パーティションを削除する |
print(省略形:p) | パーティションテーブルの情報を表示する |
quit(省略形:q) | partedでの作業を終了する |
partedコマンドで新しいハードディスクにパーティションを作成するには、以下の順に作業を行います。
-
パーティションテーブルの指定
mklabel サブコマンドで、パーティションテーブルの方式を指定します。未指定の場合MBR形式として動作します。
mklabel サブコマンドの書式は以下のとおりです。(parted) mklabel [ パーティションテーブル ]
- MBR形式を明示的に指定するには、msdosを指定します。
- GPT形式とする場合はgptを指定します。
-
パーティションの作成 mkpartサブコマンドで、パーティションを作成します。 mkpartサブコマンドの書式は以下の通りです。
(parted) mkpart [ パーティションタイプ ファイルシステム種別 パーティション名 ] 開始位置 終了位置
パーティションタイプはMBR形式で指定可能で、 primary(基本)、extended(拡張)、logical(論理) を指定します。
作成されたパーティションの情報は、printサブコマンドで確認します。
partedでの編集結果は即時反映されます。そのため、特に書き込み指示などなしで quit で終了させます。
このあとは従来通り、作成したパーティション上にmkfsコマンドによるファイルシステムの作成を行います。
なお、partedコマンドは対話形式ではなくサブコマンド指定で直接パーティション編集を行うことも可能です。 以下の例ではハードディスクのパーティションテーブルをMBR形式とし、100MBの領域を2つ作成しています。
fdisk#
fdiskコマンドはMBR方式のハードディスクにおけるパーティションの作成、削除、変更および情報表示を行うコマンド
fdiskコマンドの書式は以下のとおりです。
fdisk [-l] デバイス名
fdiskコマンドの主なサブコマンドは以下のとおりです。
サブコマンド | 説明 |
---|---|
m | サブコマンドのメニューの表示 |
l | パーティションタイプの一覧表示 |
n | パーティンションの作成 |
d | パーティションの削除 |
p | パーティションテーブルの表示 |
t | パーティションタイプ(システムID)の変更 |
w | パーティションテーブルの変更を保存して終了 |
q | パーティションテーブルの変更を保存せずに終了 |
なお、作成したパーティションを利用するには、「mkfs」や「mke2fs」コマンドを利用してパーティションにファイルシステムを作成する必要があります。 また、作成したパーティションをスワップ領域として使用するには「mkswap」コマンドを利用します。
mkfs / mke2fs#
各種ファイルシステムを作ることができるコマンド
mke2fs [オプション] デバイス名
オプション | 説明 |
---|---|
-j | ext3 ファイルシステムを作成 |
-t [ファイルシステムの種類] | ファイルシステムの種類を指定 |
b | ファイルシステムを作成する前に不良ブロックを検査 |
mkfs [オプション] デバイス名
オプション | 説明 |
---|---|
-t [ファイルシステムの種類] | ファイルシステムの種類を指定 |
-c | ファイルシステムを作成する前に不良ブロックを検査 |
ext3ファイルシステムを「/dev/sda2」に作成
Warning
スワップは特別な領域で、厳密にはファイルシステムではないため、mkfs で作ることはできません。
(例)ext3ファイルシステムを「/dev/sda2」に作成
- mkfs -t ext3 /dev/sda2
- mke2fs -j /dev/sda2
- mke2fs -t ext3 /dev/sda2
ファイルシステムの整合性の維持#
du#
ディレクトリ内のファイル容量を表示するコマンド duコマンドの書式および主なオプションは以下のとおりです。
du [オプション] [ファイル名またはディレクトリ名]
オプション | 説明 |
---|---|
-a | ディレクトリ以外にファイルについても表示 |
-h | 分かりやすい単位(メガはM、ギガはGなど)を付加して表示 |
-c | 合計容量も同時に表示 |
-s | 指定したファイルやディレクトリの合計容量のみを表示 |
-S | ディレクトリの容量にサブディレクトリの容量を含めずに表示 |
-k | キロバイト単位で表示 |
-m | メガバイト単位で表示 |
df#
dfコマンドの書式と主なオプションは以下のとおりです。
df [オプション] [デバイス名またはディレクトリ名]
オプション | 説明 |
---|---|
-h | 分かりやすい単位(メガはM、ギガはGなど)を付加して表示 |
-k | キロバイト単位で表示 |
-m | メガバイト単位で表示 |
-i | inodeの使用状況を表示 |
tune2fs#
ファイルシステムをext2からext3に変換するにはtune2fsコマンドを利用します。
tune2fsコマンドの書式および主なオプションは以下のとおりです。
オプション | 説明 |
---|---|
-c 回数 | e2fsckコマンドでファイルシステムのチェックを行うまでの最大マウント回数を指定 |
-i 時間 [d|m|w] | e2fsckコマンドでファイルシステムのチェックを行うまでの最大時間間隔を指定 * 時間のみ・またはdをつけると「日」 * mを付けると「月」 * wを付けと「週」 |
-j | ext2 をext3ファイルシステムに変換 |
-L ラベル名 | ファイルシステムのボリュームラベルを設定 |
- (例)ファイルシステムをチェックせずに「/dev/sda2」がマウント出来る回数を10回に変更
tune2fs -c 10 /dev/sda2
fsck#
fsckコマンドはファイルシステムのチェック、および問題を修復することが出来ます。
fsckコマンドの書式と主なオプションは以下のとおりです。
fsck [オプション] デバイス名
オプション | 説明 |
---|---|
-t ファイルシステムの種類 | ファイルシステムの種類を指定 |
-A | 「/etc/fstab」に記述されている全ファイルに対して実行 |
-N | 実際には実行せず、実行する内容を表示 |
-a | 問題を自動的に修復 |
-r | 問題を対話的に修復 |
e2fsck#
e2fsckコマンドは、ext2/ext3/ext4ファイルシステムのチェック、および問題を修復することができます。
e2fsckコマンドの書式と主なオプションは以下のとおりです。
e2fsck [オプション] デバイス名
オプション | 説明 |
---|---|
-y | 全ての問合せに対し、自動的に「yes」と回答 |
-n | 全ての問合せに対し、自動的に「no」と回答 |
-p | 全ての問題を自動的に修復 |
XFS#
XFSは、シリコングラフィックス社(SGI)が開発したジャーナリングファイルシステムです。
XFSファイルシステムを管理するために使用される主なコマンドは以下のとおりです。
コマンド | 説明 |
---|---|
mkfs.xfs | XFSファイルシステムを作成する「mkfs -t xfs」で呼び出されるコマンド |
xfs_info | ファイルシステムの情報を表示する |
xfs_db | ファイルシステムのデバッグを行う |
xfs_check | ファイルシステムをチェックする |
xfs_fsr | ファイルシステムのデフラグを行う |
xfs_repair | ファイルシステムを検査・修復する |
Note
ext2/ext3/ext4ファイルシステムでは、デフォルトでファイルシステム全体の5%分の領域がrootユーザ用の 予約領域として確保されます。
ファイルシステムのマウントとアンマウント#
「/etc/fstab」ファイル#
「/etc/fstab」ファイルは、利用するファイルシステムのマウント設定を事前に行っておく設定ファイルです。
mountコマンドはこのファイルの設定内容を参照して動作します
デバイス名の設定は、「/dev/sda1」のようにデバイスファイルを書くか、ラベルやUUIDを使った指定を書きます。
以下は主なマウントオプションをまとめたものです。
オプション | 説明 |
---|---|
async | 非同期で入出力を行う |
auto | 「mount -a」コマンド実行時にマウント |
noauto | 「mount -a」コマンド実行時にマウントしない |
defaults | デフォルト指定 (async, auto, dev, exec, nouser, rw, suid) |
exec | バイナリの実行を許可 |
noexec | バイナリの実行を禁止 |
ro | 読み取り専用 |
rw | 読み書きを許可 |
suid | SUID と SGIDを 有効化 |
user | 一般ユーザでマウント可、本人のみアンマウント可 |
users | 一般ユーザでマウント可、誰でもアンマウント可 |
nousers | 一般ユーザーによるマウントを禁止 |
デフォルトでは async, auto, exec, nouser, rw, suid (と、表には載っていないdev)が指定されたのと同じ状態で、 オプションを記述するとこれが上書きされていきます。 どのオプションも上書きせず、そのままで良いことを示す指定が「defaults」です。
mount#
ファイルシステムにアクセスし、利用するためには、「マウント」を行う必要があります。 マウントとは、デバイスとその上に構築されているファイルシステムを OS に認識させ、指定のディレクトリに割り当て、 そのディレクトリ以下のパスでファイルシステム内にアクセスできるようにすることです。 逆に、マウントされているファイルシステムを切り離し、マウント前の状態に戻すことを「アンマウント」といいます。
Linuxでマウントを行うには mountコマンドを使います。
mount [オプション] [デバイス] [マウント先]
オプション | 説明 |
---|---|
-a | 「/etc/fstab」ファイルに記載されているファイルシステムをすべてマウント (noautoマウントオプションが指定されているものは除く) |
-o | 続けてマウントオプションを指定 |
-t | 続けてファイルシステムの種類を指定 (指定しない場合は自動で種類を推測) |
--bind | 書式:mount --bind \ |
o に続けて指定するマウントオプションとしては、「/etc/fstab」に記述するものと同じマウントオプションが利用できます。 ファイルシステムの種類によって利用できるオプションが異なります。 以下の例では、-o ro と指定することで読み取り専用でマウントを行うよう指定しています。
- 例)ext3ファイルシステムの「/dev/sda2」を「/mnt/mydata」に読み取り専用(ro)でマウントする場合
mount -t ext3 -o ro /dev/sda2 /mnt/mydata
「デバイス」にはデバイスファイルを指定します。(/dev/cdrom、/dev/sda1 など) 「マウント先」(「マウントポイント」とも呼ばれる)には、そのファイルシステムをどのディレクトリに割り当てるかを指定します。
なお、マウントの設定ファイル「/etc/fstab」に設定が存在する場合は、「デバイス」か「マウント先」のどちらか片方だけ指定すれば、もう片方は 「/etc/fstab」が参照され自動的に決定されます。 以下は「/etc/fstab」に設定が存在する場合のmountコマンドの書式です。オプションもファイルの設定が参照されますので、省略できます。
mount デバイス
または mount マウント先
また、「デバイス」と「マウント先」どちらも指定しなかった(mount のみ実行した)場合は、現在マウントされているファイルシステムの一覧が、 「/etc/mtab」ファイルの情報を元に表示されます。(マウント中のファイルシステムについては、下記「※マウント中のファイルシステムについて」もご参照ください。)
umount#
アンマウントを行うには、umountコマンドを使います。
umount [オプション] [デバイスorマウント先]
既にマウントされているファイルシステムについて、デバイスかマウント先のどちらかを指定すればアンマウントされます。 片方だけ指定すればよいことに注意します。
umountコマンドの主なオプションは以下の通りです。
オプション | 説明 |
---|---|
-a | 「/etc/mtab」ファイルに記載されているファイルシステムをすべてアンマウント |
-t | 指定した種類のファイルシステムのみをアンマウント |
「/etc/mtab」ファイル#
現在マウントされているファイルシステムの情報が格納されているファイル
なお、mountコマンドを引数およびオプションを指定せずに実行した場合は、「/etc/mtab」ファイルを参照して、 現在マウントされているファイルシステムの情報を表示します。 /etc/mtabやmountコマンドのほかに、Linuxにおいて各種リソース情報を格納している「/proc」ディレクトリ 配下でもマウント情報を確認することができます。
以下は、現在マウントされているファイルシステムを確認できるコマンドとです
- mount
- cat /etc/mtab
- cat /proc/self/mounts
- cat /proc/mounts
ファイルのパーミッションと所有権の管理#
chmod#
パーミッションとは、ファイルやディレクトリに対する権限です。権限には「読み取り権」「書き込み権」「実行権」の3種類が あります。これらの権限は、「所有ユーザ」(ファイルの所有ユーザ)、「所有グループ」(ファイルの所有グループ)、 「その他のユーザ」(所有ユーザ、所有グループ以外のユーザ)のそれぞれに対して設定されます。
誰がどのような権限を持つのか、パーミッションの表現方法には「記号表現」と「数値表現」の2つがあります。
記号表記 | 2進数 | 8進数 |
---|---|---|
--- | 000 | 0 |
--x | 001 | 1 |
-w- | 010 | 2 |
-wx | 011 | 3 |
r-- | 100 | 4 |
r-x | 101 | 5 |
rw- | 110 | 6 |
rwx | 111 | 7 |
chgrp#
指定したファイルまたはディレクトリの所有グループのみを変更可能なコマンドはchgrpです。
- 例)「file.txt」の所有グループをtestからstaffgroupに変更する場合
chgrp staffgroup file.txt
umask#
ファイルやディレクトリを新規作成した際の、デフォルトのパーミッションを設定するにはumaskコマンドを利用します。
umaskコマンドの書式は以下のとおりです。
umask [マスク値]
umaskコマンドではマスク値というものを設定して、新規に作成するファイルとディレクトリのデフォルトのパーミッションを決定します。マスク値はユーザ毎に指定できます。通常「/etc/bashrc」などに設定されており、シェルの起動時にシステムのデフォルト値に戻ります。
マスク値が0の場合に使用されるデフォルトのパーミッションは、ファイルが「666」、ディレクトリが「777」です。これらの値から、指定したマスク値を引いた値が新たなデフォルトのパーミッションとして設定されます。
666 - マスク値 = ファイルのデフォルトのパーミッション 777 - マスク値 = ディレクトリのデフォルトのパーミッション
パーミッションの表記は各桁が独立して、左から所有ユーザ、所有グループ、その他のユーザを表します。ですのでumask値を引く際も各桁ごとに引きます。 なお、ファイルのデフォルトのパーミッションは「666」で実行権が無いので、umask値に関わらず実行権は設定されません。
ファイル | 所有ユーザ | 所有グループ | その他 | ディレクトリ | 所有ユーザ | 所有グループ | その他 | |
---|---|---|---|---|---|---|---|---|
umask値が0の場合のパーミッション | 666 | rw- | rw- | rw- | 777 | rwx | rwx | rwx |
umask値 | 027 | --- | -w- | rwx | 027 | --- | -w- | rwx |
デフォルトのパーミッション | 640 | rw- | r-- | --- | 750 | rwx | r-x | --- |
chown#
指定したファイルまたはディレクトリの所有ユーザやグループを変更するにはchownコマンドを利用します。所有ユーザを変更できるのはrootユーザのみです。
所有ユーザと所有グループを同時に変更する場合の書式は以下のとおりです。
-
所有ユーザのみを変更する場合
chown [-R] ユーザ名 ファイルまたはディレクトリ
-
所有ユーザと所有グループを同時に変更する場合
chown [-R] ユーザ名:グループ名 ファイルまたはディレクトリ
-
所有グループのみを変更する場合
chown [-R] :グループ名 ファイルまたはディレクトリ
chgrp [-R] グループ名 ファイルまたはディレクトリ
「-R」オプションを使用すると、指定したディレクトリ、およびその配下にあるファイルの所有ユーザやグループを再帰的に変更できます。
なお、「:」の部分は「.」としても同じです。
特殊なパーミッション#
特殊なパーミッションとして、以下の3つがあります。
-
SUID
実行ファイルに設定する事で、そのプログラムをどのユーザが実行しても、プログラムの所有ユーザの権限で実行されます。 設定はchmodコマンドで、通常のパーミッションの値に4000を加えた値を設定するか、所有ユーザに「s」という権限を追加します(u+s)。 これが設定された代表的なプログラムに「passwd」コマンドがあります。 -
SGID
実行ファイルに設定する事で、そのプログラムをどのユーザが実行しても、プログラムの所有グループの権限で実行されます。 また、ディレクトリに設定する事で、そのディレクトリ配下に作成したファイルやディレクトリの所有グループは親ディレクトリと同じになります。 設定はchmodコマンドで、通常のパーミッションの値に2000を加えた値を設定するか、所有グループに「s」という権限を追加します(g+s)。 -
スティッキービット
ディレクトリに設定する事で、そのディレクトリに対して書き込み権限を持つユーザでも、自分が所有する以外のファイルを削除できなくなります。 設定方法はchmodコマンドで、通常のパーミッションの値に1000を加えた値を設定するか、その他ユーザに「t」という権限を追加します(o+t)。 これが設定された代表的なディレクトリに「/tmp」ディレクトリがあります。
ハードリンクとシンボリックリンクの作成・変更#
Linuxではファイル(ディレクトリはファイルの一種)を「ファイルの実体(データ本体)」と「inode」を使用して管理しています。inodeにはファイルの属性や、 「ファイルの実体」にアクセスするためのアドレスなどのメタデータ(格納されているデータそのものに関する情報)が格納されています。 Linuxには、同じ「ファイルの実体」に対して複数の名前でアクセスできる、リンクという仕組みが2種類あります。それが「ハードリンク」と「シンボリックリンク」です。
上図のFile1とFile2は同じ実体を参照しています。ですのでFile1の中身を編集すると、File2の中身も同じく変更されます。
ハードリンクの数とinode番号は「ls -il」コマンドで確認することが出来ます。
ハードリンクを作成するにはlnコマンド(書式:ln 元ファイル リンクファイル)を利用します。
- 例)File1のハードリンクをFile2として作成する場合
ln File1 File2
ile2はFile1のハードリンクのため、inode番号が同じです。ただこの時点で、どちらがリンクファイルであるかの区別は無くなります。 この状態でFile1を削除しても、File2が実体にリンクしているため実体は残ります(削除されません)。File2も削除し、ハードリンクが0になると、実体がはじめて削除されます。
ハードリンクの制限として以下の2点があります。 1. ディレクトリのハードリンクは作成できない 2. 異なるファイルシステム(パーティション)にハードリンクを作成できない
1の制限は循環ディレクトリの作成を防ぐためです。例えば、testという1ユーザーしか利用しない環境で「/home」を 「/home/test」にハードリンクしてしまうと、「/home/test」の「/home」が「/home/test」に置き換えられるため、 「/home/test/test/test/...」と無限に続く循環ディレクトリができてしまうことになります。
2の制限はinode番号が各ファイルシステム毎に別々に管理されているためです。異なるファイルシステムではinodeの 利用状況が異なるため、全く同じinodeを割り当てて正しく参照できる保証がありません。
これらの制限はシンボリックリンクを使う事で解決できます。
【シンボリックリンク】
シンボリックリンクとは、Windowsでのショートカットのようなもので、元ファイルの場所を指し示すリンクの事です。
シンボリックリンクが持っている情報は「元ファイル(ディレクトリ)がどこにあるのか」というパス情報のみです。
上図のFile2はFile1への単なるショートカットです。 File1を削除すると(他に同じinode番号を持つハードリンクが無ければ)、ファイルの実体は削除されますが、File2は残ります。 ただその場合、File2にアクセスすると、リンクしているFile1が無いためエラーになります。
シンボリックリンクを作成するにはlnコマンドに「-s」オプションを付加して作成します。(書式:ln -s 元ファイル リンクファイル)
- 例)File1のシンボリックリンクをFile2として作成する場合
ln -s File1 File2
File1とFile2ではinode番号が違う事が分かります。 また、File2にはシンボリックリンクを示す「l」がパーミッションの先頭に表示されています。 ファイル名を示す欄では、File2はFile1のシンボリックであることが分かります。
システムファイルの検索、適切なファイル配置#
find#
指定したディレクトリ以下からファイルやディレクトリを検索するにはfindコマンドを利用します。
findコマンドの書式と主な検索式・アクションは以下のとおりです。
find [検索起点ディレクトリ] [検索式] [アクション]
検索式 | 説明 |
---|---|
-name ファイル名 | ファイル名で検索 |
-atime 日数 | 最終アクセス日で検索 |
-mtime 日数 | 最終更新日で検索 |
-perm アクセス権 | アクセス権で検索 |
-size サイズ | ファイルサイズで検索 |
-type ファイルの種類 | ファイルの種類で検索(f : ファイル、d : ディレクトリ、l : シンボリックリンク) |
-user ユーザ名 | ファイルの所有者で検索 |
- maxdepth 階層数 | 指定した階層まで検索 |
- mindepth 階層数 | 指定した階層から下を検索 |
アクション | 説明 |
---|---|
検索結果を改行で区切って表示(省略可能) | |
- print0 | 検索結果をNULL文字(\0)で区切って表示 |
- exec コマンド名 {}\; | 検索結果のファイルに大してコマンドを実行 |
which#
whichコマンドは指定したコマンドが格納されている場所を検索し、絶対パスで表示します。検索するディレクトリは環境変数PATHで設定されている(パスが通っている)ディレクトリです。
whereis#
指定したコマンドと、そのマニュアル、ソースコードが置かれている場所を絶対パスで表示するコマンド
type#
typeコマンドは、指定したコマンドが通常のコマンドか、シェルの組み込みコマンドか、エイリアスか、などの情報を表示します。通常のコマンドの場合、そのコマンドが格納された絶対パスを表示します。
locate#
updatedbコマンドであらかじめ作成された検索用のデータベースに沿って、検索パターンに合致したファイルやディレクトリを高速に検索します。
updatedb#
locateコマンドが利用する検索用のデータベースを更新するコマンド
/usr#
「/usr」ディレクトリには起動には不要なプログラムなどが格納されています。
以下はFHSで規定されている「/usr」以下のディレクトリ配置をまとめたものです。
ディレクトリ | 格納物 |
---|---|
/usr/bin | システムの起動には必須ではない、一般ユーザ用のコマンド |
/usr/sbin | システムの起動には必須ではない、システム管理用のコマンド |
/usr/lib | /usr/lib、/usr/sbinに格納されるコマンドが必要とする共有ライブラリ |
/usr/local | ホスト固有で使用するプログラムや設定ファイル(個人作成など) 配下にプログラムを格納するbin、設定ファイルを格納するetcなどのディレクトリなどがある |
/usr/share/man | マニュアル |