LPIC 勉強記録 第5章 ファイルの管理

#第5章 ファイルの管理

ユーザは、必ず1つ以上のグループに所属する

| グループ | 説明 | 
|:----------:|:----------|
|1次グループ(必須)|ログイン直後の作業グループ。ファイルやディレクトリを新規作成した際に、それを所有するグループとして使用される|
|2次グループ(任意)|必要に応じて、1次グループ以外のグループを割り当てることができる。複数割り当て可能|

自分の所属グループを表示するには、`groupsコマンド`を使用する
自分がどのユーザでログインしているのか、またどのグループに所属しているのかを調べるには、`idコマンド`で確認できる

ファイルやディレクトリには、誰にどのような操作を許可するのか、それぞれ個別に設定することができ、これを`パーミッション`と呼ぶ
設定された`パーミッション`は、`ls -lコマンド`で調べることができる
パーミッションで表示される内容は、
1. ファイルの種類
2. ユーザ(所有者)に対するパーミッション
3. グループに対するパーミッション
4. その他のユーザに対するパーミッション

| 主な種類 | 説明 | 
|:----------|:----------|
|-|通常ファイル|
|d|ディレクトリ|
|l|シンボリックリンク|

| 種類 | ファイルの場合 |ディレクトリの場合 | 
|:----------|:----------|:----------|
|読み取り権(r)|ファイルの内容を読むことができる。more、cat、cpなどが使用可能|ディレクトリの内容を表示することができる。lsなどが実行可能|
|書き込み権(w)|ファイルの内容を編集することができる。viなどが使用可能|ディレクトリ内のファイルや、ディレクトリを作成や削除することができる。mkdir、touch、rmなどが使用可能|
|実行権(x)|実行ファイルとして実行ができる|ディレクトリへ移動することができる。cdなどが使用可能|

`/etc/passwdファイル`は、ユーザ情報が保存されているファイル
catやmoreコマンドで閲覧可能だが、ユーザ管理はrootユーザしか行えない

既存のファイルやディレクトリに設定されているパーミッションは、`chmodコマンド`で変更できる
変更できるのは、所有者またはrootユーザのみ
コマンドの引数で指定するモードは、`シンボリックモード`と`オクタルモード`の2種類

| モード名 | 説明 | 
|:----------|:---------|
|シンボリックモード|文字や記号を用いて、パーミッションを変更する|
|オクタルモード|目的のパーミッションを8進数の数値を使って変更する|

| ユーザ | 説明 | 
|:----------|:---------|
|u|所有者|
|g|グループ|
|o|その他|
|a|すべてのユーザ|

| パーミッション | 数値 | 
|:----------|:---------:|
|読み取り権|4|
|書き込み権|2|
|実行権|1|
|権限なし|0|

ユーザのデフォルトパーミッションは、シェルに設定された`umask値`で決まる
`umaskコマンド`で、現在設定されている`umask値`を確認する
作成されるファイルのパーミッションは、ファイルを作成するアプリケーションによって指定されたパーミッションと、プロセスごとにカーネル内に保持されている`umask値`の否定との論理積となる
`umask値`とは、アプリケーションによって指定され、パーミッションに対し「ユーザ」、「グループ」、「その他」ごとに割り当てたくないパーミッションを指定したもの
`umask値`は親プロセスから子プロセスに引き継がれる

`chownコマンド`は、指定されたファイルの所有者とグループを変更する
実行できるのはrootユーザのみ
所有者のみ変更するだけでなく、グループもあわせて変更する場合は、`chownコマンド`の引数に`変更後の所有者名.変更後のグループ名`と指定する
グループ名の前には`.`もしくは`:`を指定する
`-Rオプション`はディレクトリにのみ指定が可能であり、サブディレクトリを含め、再起的に所有者、グループが変更される

グループのみの変更を行うコマンドとして、`chgrpコマンド`がある
`rootユーザ`は、所有者が自分以外のファイルもグループを変更できる
また変更先のグループ名は、自分が所属していないグループでも指定可能である
一般ユーザは、所有者が自分のファイルのみグループを変更できる
また変更先のグループ名は、自分が所属しているグループのみ指定可能である
`-Rオプション`はディレクトリにのみ指定が可能であり、サブディレクトリを含め、再起的にグループが変更される

プロセスには`実ユーザID`と`実効ユーザID`が設定されている
`実ユーザ`とは、プロセスを起動したユーザであり、プロセスの所有者
`実効ユーザ`とは、プロセスが実行されるときの権限を持つユーザ
カーネルはプロセスの実行権限を`実効ユーザID(および実効グループID)`でチェックする

`SUID`は、どのユーザが実行しても、`実効ユーザID`がファイルの所有者IDとなる
`SUID`はパーミッションに`4000`、もしくは所有者に`s`を付与する

`SGID`はファイルのグループIDが実効グループIDとして設定される
`SGID`が設定されたディレクトリ以下で、ファイルやディレクトリを作成すると、`SGID`が設定されたディレクトリのグループが引き継がれて設定される
`SGID`はパーミッションに`2000`、もしくは所有者に`s`を付与する
複数ユーザで使用するディレクトリに対して`SGID`を設定することで、誰がファイルを作成しても所有グループを同じにすることができる

`スティッキーピット`は、特定のディレクトリに対し、アクセス権が許可されていても、ファイルの削除や名前の変更は行えないよう保護する設定
`/tmpディレクトリ`は、多くのユーザが作業できるよう、アクセス権がすべて許可されている
`chmodコマンド`で`スティッキーピット`を指定する場合は、`1000`もしくは`o+t`を使用する

`lnコマンド`は、ファイルへのリンクを作成する
同一ファイルに異なる2つの名前を持たせることができる
`-sオプション`を使用して`シンボリックリンク`を作成

初めてバックアップする際は、すべてのファイルをコピーする
次のバックアップは初回時と比較し、変更があったものはコピーするが、変更のなかったものはハードリンクを作成するようにする
毎回すべてのデータをコピーするのではなくなるため、バックアップ時間の削減、および、バックアップ先のディスク容量を節約できる

`シンボリックリンク`はオリジナルファイルの位置情報を保管している別ファイルとして作成されるため、iノード番号も別に割り当てられる
オリジナルファイルを削除した場合、リンクファイル自身が保持している参照先がなくなるため、エラーとなる

`ハードリンクの特徴`
リンクファイルが使用する`iノード番号`はオリジナルファイルと同じ番号
ディレクトリを基にリンクファイルを作成することはできない
`iノード番号`は同一ファイルシステム内でユニークな番号なので、異なるパーティションのハードリンクを作成することはできない

`シンボリックリンクの特徴`
リンクファイルが使用する`iノード番号`はオリジナルファイルと異なる番号
ディレクトリを基にリンクファイルを作成可能
オリジナルファイルと別のパーティションにリンクファイルを作成可能
パーミッションの先頭は、ファイルタイプとしてシンボリックリンクファイルを表す`l`が表示される

`findコマンド`は、指定したディレクトリ以下で、指定した検索条件に合致するファイルを検索する
階層を指定するには、`-maxdepthオプション`に階層数を指定する

| 主な式 | 説明 | 
|:----------|:---------|
|-name|指定したファイル名で検索する|
|-atime|指定した日時を基に、最終アクセスがあったファイルを検索する|
|-mtime|指定した日時を基に、最終更新されたファイルを検索する|
|-uid|ファイルの所有者のユーザIDを指定|
|-user|ファイルの所有者のユーザ名またはユーザIDを指定|
|-print|検索結果を標準出力する|

`xargsコマンド`は、空白または改行で区切られた文字列群を読み込む
`findコマンド`で、実行時に`-print0オプション`を付与すると、ファイルの区切りに空白や改行ではなく、ヌル文字が埋め込まれる
`xargsコマンド`の`-0`オプションは、標準入力からの文字列に対して、空白ではなくヌル文字を区切りとして読み込む

`locateコマンド`は、`locate ファイル名`で検索することができる
指定されたコマンドを完全パスで表示する
ファイル名・ディレクトリ名の一覧のデータベースを使用して、インデックス検索を行っているため、高速に検索する
日々更新されるファイル・ディレクトリについて、データベースの更新を行わないと、検索対象から外れてしまう

データベースの更新には、`updatedbコマンド`を使用する
特定のディレクトリをデータベース作成の対象から外す場合は、`updatedb -e ディレクトリ名`とすることで可能
`updatedbコマンド`の設定ファイルである、`/etc/updatedb.confファイル`に除外するディレクトリを記載しておくこともできる

`whichコマンド`は、指定されたコマンドがどのディレクトリに格納されているかを、`PATH環境変数`で指定されたディレクトリを基に探す
`PATH環境変数`とは、使用したいプログラム(コマンド)のパスを保持する変数
コマンドを実行すると、`PATH変数`に登録された場所を基に検索し、該当するファイルが見つかると実行される
指定されたコマンドを完全パスで表示する

`whereisコマンド`は、指定されたコマンドのバイナリ・ソース・マニュアルページの場所を表示する

`typeコマンド`は指定したコマンドがバイナリなのか、エイリアスなのか等の情報を表示する

#おわりに
3周目終了！
理解度はかなり低い！