LFCS — Linux Foundation認定システム管理者
ファイルの扱いとfind式
目標
シェルがいつ何を展開するのか、findがなぜ式の言語なのかを、手で確認します。リンク・アーカイブ・パッチまで、LFCSの必須コマンド領域を一通り巡ります。
なぜ重要なのか
この領域は、試験時間の大部分を食う区間です。問題自体は難しくないのに、-perm 644と-perm -644のように、1文字の違いで結果が変わる文法が多く、静かに間違えます。リンクとinodeを理解すると、「消したのに容量が減らない」のような運用事故が、当然の結果に見えてきます。圧縮形式の選択も、好みではなくトレードオフです。xzはより小さく作れますが、CPUと時間をずっと多く使います。そのため、バックアップの周期と復元時間の要件が、形式を決めます。
ステップ
/root/lfcs-ess/の下に、src、archive、report、patchの4つのディレクトリを作成してください。/root/lfcs-ess/src/に、data-01.txtからdata-06.txtまでの6つのファイルを作成してください。data-01からdata-03まではそれぞれ200000バイト以上、data-04からdata-06まではそれぞれ1バイト以上1000バイト未満である必要があります。data-01.txtのハードリンクsrc/data-01.hardと、シンボリックリンクsrc/data-01.symを作成してください。そして、report/inode.txtに、inode=<data-01.txt 의 inode 번호>とlinks=<링크 수>の2行を書いてください(プレースホルダーは順に、data-01.txtのinode番号、リンク数です)。src/の直下で、名前が.txtで終わり、サイズが100kを超える通常ファイルの名前だけを、report/big.txtに1行ずつ書いてください。data-05.txtとdata-06.txtの権限を600に変更し、src/の直下で、権限がちょうど600である通常ファイルの名前を、report/perm600.txtに書いてください。data-06.txtの更新時刻を30日よりも前に変更し、src/の直下で-mtime +30に該当するファイルの名前を、report/old.txtに書いてください。src/ディレクトリを、archive/src.tar.gzとarchive/src.tar.xzの2つのアーカイブにして、report/compress.txtに、gzip=<바이트 크기>、xz=<바이트 크기>、smaller=<gzip 또는 xz>の3行を書いてください(プレースホルダーは順に、gzipのバイトサイズ、xzのバイトサイズ、gzipまたはxzです)。patch/conf-old.txtにlisten=8080、workers=2、loglevel=info、timeout=30の4行を、patch/conf-new.txtにlisten=9090、workers=4、loglevel=info、timeout=30の4行を作成してください。2つのファイルの差分を統一形式でpatch/conf.patchに保存し、conf-old.txtのコピーであるpatch/conf-target.txtにそのパッチを適用して、conf-new.txtと同じになるようにしてください。
参考
- 決まったサイズのファイルは、
head -c 200000 /dev/urandomのように、先頭部分だけを切り取って作ると速いです。 findの-printfで%fを使うと、パスではなくファイル名だけが出力されます。-size +100kと-size +100は単位が違います。後者は512バイトブロックの数です。- よくある間違い: ステップ8で、パッチを元のファイルに適用してしまうと、
conf-old.txtの検証が壊れます。必ずコピーに適用してください。
作業ディレクトリを4つ作る
/root/lfcs-ess/の下に、src、archive、report、patchの4つのディレクトリを作成してください。
上位のパスがなくても、一度に作成してくれるオプションがあります。4つのディレクトリを1行に並べてもかまいません。
サイズの違うファイルを6つ用意
/root/lfcs-ess/src/に、data-01.txtからdata-06.txtまでの6つのファイルを作成してください。data-01からdata-03まではそれぞれ200000バイト以上、data-04からdata-06まではそれぞれ1バイト以上1000バイト未満である必要があります。
決まったバイト数だけを取り出すには、入力デバイスから先頭部分だけを切り取ってくればよいです。大きなファイル3つは200000バイトを超える必要があり、小さなファイル3つは1000バイト未満である必要があります。
ハードリンク・シンボリックリンクとinode
data-01.txtのハードリンクsrc/data-01.hardと、シンボリックリンクsrc/data-01.symを作成してください。そして、report/inode.txtに、inode=<data-01.txt 의 inode 번호>とlinks=<링크 수>の2行を書いてください(プレースホルダーは順に、data-01.txtのinode番号、リンク数です)。
ハードリンクは、同じinodeに名前をもう1つ付けることなので、リンク数が増えます。inode番号とリンク数は、statの書式出力で一度に読み取れます。
サイズ条件で探す
src/の直下で、名前が.txtで終わり、サイズが100kを超える通常ファイルの名前だけを、report/big.txtに1行ずつ書いてください。
findのサイズ条件は、接尾辞によって単位が変わります。結果をファイル名だけで取り出すには、出力書式を指定してください。サブディレクトリに下りないように、深さも制限します。
権限条件で探す
data-05.txtとdata-06.txtの権限を600に変更し、src/の直下で、権限がちょうど600である通常ファイルの名前を、report/perm600.txtに書いてください。
権限条件は、「完全一致」と「このビットを含む」が別の文法です。今回は、完全一致のほうを使わないと、結果が合いません。
更新時刻の条件で探す
data-06.txtの更新時刻を30日よりも前に変更し、src/の直下で-mtime +30に該当するファイルの名前を、report/old.txtに書いてください。
ファイルの時刻は、touchに時刻を直接指定して変更できます。-mtimeのプラス記号は、「それより古い」という意味です。
gzipとxzの圧縮率の比較
src/ディレクトリを、archive/src.tar.gzとarchive/src.tar.xzの2つのアーカイブにして、report/compress.txtに、gzip=<바이트 크기>、xz=<바이트 크기>、smaller=<gzip 또는 xz>の3行を書いてください(プレースホルダーは順に、gzipのバイトサイズ、xzのバイトサイズ、gzipまたはxzです)。
tarは、圧縮器をオプション文字で選びます。作成したあと、各アーカイブのバイトサイズを読み取り、どちらが小さいかを自分で比較して書いてください。
パッチを作ってコピーに適用する
patch/conf-old.txtにlisten=8080、workers=2、loglevel=info、timeout=30の4行を、patch/conf-new.txtにlisten=9090、workers=4、loglevel=info、timeout=30の4行を作成してください。2つのファイルの差分を統一形式でpatch/conf.patchに保存し、conf-old.txtのコピーであるpatch/conf-target.txtにそのパッチを適用して、conf-new.txtと同じになるようにしてください。
統一形式の差分は、diffにオプションを1つ加えると出力されます。パッチは、元のファイルではなくコピーに適用する必要があります。元のファイルが変わると、前の検証が壊れます。