TT Lab
はじめる
学ぶ 学習パス コース

LFCS — Linux Foundation認定システム管理者

LFCS模擬試験A

TT Labで続きを見る

目標

実際のLFCS試験と同じ条件で、課題18個を120分以内に解きます。合格ラインは67%で、部分点制なので、18個のうち13個を通過すれば合格です。

実際の試験環境

この模擬試験の解き方

  1. ヒントを見ずに、まず最後まで解いてみてください。18個をすべて見渡したあとで、そのとき詰まったものだけ、ヒントを開いてください。
  2. Web検索をしないでください。manと--helpだけで解いてください。これが、この試験で最も重要な練習です。実際の試験会場には、検索窓がありません。
  3. コマンド名を思い出せないときは、man -k <키워드>またはapropos <키워드>(プレースホルダーはキーワードです)で探してください。たとえば、man -k acl、man -k quota、man -k "file system"のように使います。今この練習をしておかないと、試験会場で初めてやることになります。
  4. セクション番号が必要なときは、man 5 fstabのように書きます。設定ファイルはセクション5に、管理者コマンドはセクション8にあります。

この環境が実際の試験と違う点

実習Podには、カーネル権限がほとんどなく、systemdがPID 1として動いていません。そのため、mount、systemctl、iptablesは、ここでは動作しません。同じドメインの知識を、この環境で確認できる形に変えて出題しました。実際の試験では、この3つがすべて動作するので、ここで作ったfstabの項目とユニットファイルは、試験会場でmount -aとsystemctl enable --nowにつながると考えてください。

ステップ

  1. /root/exam/find/src/に、data-01.txtからdata-05.txtまで、5つのファイルを作ってください。data-01からdata-03は、それぞれ200000バイト以上、data-04とdata-05は、それぞれ1バイト以上4096バイト未満です。data-01.txtを指すハードリンクdata-01.hardを、同じディレクトリに作ってください。そのあと、srcの直下にある通常ファイルのうち、サイズが100 KiBを超えるものの名前だけを/root/exam/find/big.txtに、ハードリンク数が2以上のものの名前だけを/root/exam/find/links.txtに書いてください。どちらのファイルも、名前だけを1行に1つずつ、LC_ALL=C sortの順序で書きます。
  2. /etc/servicesから、プロトコルがtcpで、ポート番号が1024以上2000以下の項目を選んで、/root/exam/text/tcp-high.txtに書いてください。1行に<포트> <서비스 이름>(プレースホルダーはポートとサービス名です)を、空白1つで区切って書き、サービス名は、その行の最初のフィールドを使います。ポート番号の昇順に並べて、同じ行は1つだけ残します。
  3. /root/exam/arch/src/に、log-01.txtからlog-05.txtまで、それぞれ20000バイト以上のファイルを5つと、拡張子が.tmpのファイルを1つ作ってください。/root/exam/arch/で、srcディレクトリをgzipで圧縮したtarアーカイブ/root/exam/arch/backup.tar.gzを作ります。ただし、.tmpファイルは除外してください。そのアーカイブに入っている項目の一覧を、LC_ALL=C sortの順序で/root/exam/arch/members.txtに書いてください。
  4. GID 4200のグループopsと、GID 4201のグループauditを作ってください。UID 4300のユーザーdeployを作ります。プライマリグループはops、補助グループはaudit、ログインシェルは/bin/bash、ホームは/home/deployにして、ホームディレクトリは実際に作り、権限750、所有deploy:opsにしてください。deployのパスワードポリシーは、最小変更間隔7日、最大使用期間60日、期限切れの警告14日にして、アカウントの有効期限は2027-06-30に指定してください。
  5. UID 4301のユーザーinternを作ってください。ログインシェルは/usr/sbin/nologin、ホームは実際に作り、補助グループとしてopsに入れてください。internにパスワードを一度設定したあと、そのアカウントをロックしてください。最後に、/etc/login.defsのデフォルト値を、PASS_MAX_DAYS 90、PASS_MIN_DAYS 7、PASS_WARN_AGE 14、UMASK 027に変更してください。
  6. ディレクトリ/srv/dataと/srv/scratchを作って、/etc/fstabに2つの項目を追加してください。1つ目は、デバイスがUUID=2f9c1a70-0007-4e00-9a00-000000000007、マウントポイントが/srv/data、種類がext4、オプションがdefaults,nofail、dumpが0、passが2です。2つ目は、デバイスがtmpfs、マウントポイントが/srv/scratch、種類がtmpfs、オプションがrw,nosuid,nodev,noexec,size=256m、dumpが0、passが0です。このPodではmountを実行できないので、項目の作成までにしてください。
  7. /root/exam/storage/data.imgを、ちょうど134217728バイトで作り、そのファイルの上にext4ファイルシステムを作ってください。ボリュームラベルはEXAMDATA、予約ブロックの比率は1%です。作られたファイルシステムのUUIDを、/root/exam/storage/data.uuidに1行で書いてください。
  8. /root/exam/storage/sparse.imgを、見かけのサイズが536870912バイトのスパースファイルとして作ってください(実際の占有は、ほぼ0でなければなりません)。/root/exam/storage/dense.imgは、4 MiBを実際に割り当てたファイルとして作ります。そのあと、/root/exam/storage/usage.txtに、下の3行を書いてください。値は、KiB単位の整数です。 sparse_apparent_kib=<sparse.img 의 겉보기 크기> sparse_actual_kib=<sparse.img 이 실제로 차지하는 크기> dense_actual_kib=<dense.img 이 실제로 차지하는 크기> (プレースホルダーは、順に、sparse.imgの見かけのサイズ、sparse.imgが実際に占めるサイズ、dense.imgが実際に占めるサイズです)
  9. 共有ディレクトリ/srv/teamを作って、所有をroot:ops、権限を2770にしてください。ACLで、deployにrwxを、internにr-xを与え、このディレクトリの下に新しく作られるファイルが、所有グループにrwx、それ以外のユーザーには何の権限も持たないように、デフォルトACLを設定してください。デフォルトACLの所有者の項目はrwxです。
  10. /etc/hostsに、10.60.0.11をweb1.lab.internalと短い名前web1で、10.60.0.12をdb1.lab.internalと短い名前db1で登録してください。そして、/etc/nsswitch.confのhosts:の行で、filesがdnsより前に来るようにしてください。4つの名前がすべて、getent hostsで解決できなければなりません。
  11. /etc/ssh/sshd_config.d/90-exam.confを作って、下の7つをこのファイルに書いてください。PermitRootLogin no、PasswordAuthentication no、MaxAuthTries 3、ClientAliveInterval 300、ClientAliveCountMax 2、AllowTcpForwarding no、X11Forwarding no。設定が文法的に正しく、sshdが解釈した最終値が、この通りでなければなりません。デーモンを再起動する必要はありません。
  12. 127.0.0.1のTCP 9101番ポートで接続を受けるプロセスを、バックグラウンドで起動して、試験が終わるまで生かしておいてください。そのあと、そのソケットを持っているプロセスを探して、/root/exam/net/listener.txtに、下の3行を書いてください。port=9101、pid=<그 프로세스의 PID>、comm=<그 프로세스의 이름>(プレースホルダーは、そのプロセスのPIDと、そのプロセスの名前です)。
  13. このPodの現在のネットワーク状態を調べて、/root/exam/net/facts.txtに4行で書いてください。iface=<기본 경로가 나가는 인터페이스 이름>、ipv4=<그 인터페이스의 IPv4 주소를 프리픽스까지 포함해>、mtu=<그 인터페이스의 MTU>、gateway=<기본 경로의 게이트웨이 주소>(プレースホルダーは、順に、デフォルト経路が出ていくインターフェース名、そのインターフェースのIPv4アドレス(プレフィックスまで含む)、そのインターフェースのMTU、デフォルト経路のゲートウェイアドレスです)。
  14. /usr/local/bin/labhub-batch.shを作って実行権限を与え、/etc/systemd/system/labhub-batch.serviceユニットファイルを作成してください。[Unit]にはDescriptionがあり、WantsとAfterが、どちらもnetwork-online.targetでなければなりません。[Service]のTypeはoneshot、ExecStartは/usr/local/bin/labhub-batch.sh、WorkingDirectoryは/srv/dataです。[Install]のWantedByはmulti-user.targetです。このPodには、systemdがPID 1として動いておらず、systemctl enableが動作しないので、そのコマンドが作るシンボリックリンク/etc/systemd/system/multi-user.target.wants/labhub-batch.serviceを、手で作ってください。
  15. /usr/local/bin/labhub-report.shと/usr/local/bin/labhub-weekly.shを作って、どちらも権限755にしてください。/etc/cron.d/labhub-reportを作って、15分ごとにroot権限で/usr/local/bin/labhub-report.shを実行するように登録し、そのファイルの権限は644、所有はroot:rootにしてください。そして、rootのcrontabに、毎週日曜日の2時30分に/usr/local/bin/labhub-weekly.shを実行する行を登録してください。
  16. /var/log/labhub-app.logを作って、/etc/logrotate.d/labhub-appを作成し、このログを毎日ローテーションして、14個まで保管するようにしてください。compress、delaycompress、missingok、notifemptyを有効にして、ローテーション後の新しいファイルは、create 0640 root admで作られるようにしてください。
  17. /usr/local/bin/exam-worker.shを作って、権限755を与えてください。1行目はシバンで始まらなければならず、内容は、終了せずに回り続けるものであれば十分です。これをnice値15で、バックグラウンドで実行して、そのプロセスのPIDを/run/exam-worker.pidに1行で書いてください。プロセスは、採点の時点まで生きていなければなりません。
  18. パッケージfigletとpvをインストールしてください(この環境はインターネットがなく、/opt/localrepoオフラインリポジトリがすでに登録されています)。インストールされた2つのパッケージの名前とバージョンを、/root/exam/ops/pkg.txtに、1行に1つずつ<패키지 이름> <버전>(プレースホルダーはパッケージ名とバージョンです)の形式で書いてください。最後に、pvだけが自動アップグレードの対象から外れるように、ロックしてください。

参考

findでサイズとリンクの条件に合うファイルを選ぶ

-size +100kの単位はKiBで、-links +1は、ハードリンク数が2以上のものを選びます。名前だけを出力するには、-printfの%fを使い、並べ替えはLC_ALL=C sortで固定してください。ハードリンクはln、シンボリックリンクはln -sです。

/etc/servicesから条件に合う項目を絞り込む

各行の2番目のフィールドが、포트/프로토콜(ポート/プロトコル)の形をしています。awkのsplit()でスラッシュを区切りにして分けたあと、数値を比較してください。ポートの昇順の並べ替えと重複の除去は、sort -n -u1回でできます。

特定の拡張子を除外したtarアーカイブを作る

tarのcは作成、zはgzip、fはファイル名です。除外は--excludeで行い、パターンは、シェルが先に展開しないように、引用符で囲んでください。入っている一覧は、tar -tzfで、もう一度取り出します。

グループ・ユーザーの作成とパスワードの期限ポリシー

groupadd -gと、useraddの-u -g -G -s -m -dを組み合わせます。パスワードポリシーはchageで設定し、アカウントの有効期限はchage -Eです。man 8 useraddとman 1 chageを見てください。ホームディレクトリの権限と所有は、useraddが作ったあとで、別に合わせる必要があるかもしれません。

ログインを遮断したアカウントと基本のパスワードポリシー

シェルを/usr/sbin/nologinにすると、ログインが遮断されます。ロックはusermod -Lまたはpasswd -lですが、パスワードがまったくないアカウントをロックすると、ロックの印だけが残って、ハッシュがありません。chpasswdで、先にパスワードを入れてから、ロックしてください。デフォルト値は/etc/login.defsにあります。

fstabの項目を2つ書く

man 5 fstabに、6つのフィールドの意味がすべて出ています。順序は、デバイス、マウントポイント、種類、オプション、dump、passです。マウントポイントのディレクトリは、前もって作っておく必要があります。文法だけを確認するには、findmnt --verify --tab-file /etc/fstabを使ってください。

ファイルの上にext4を作ってスーパーブロックを読む

空のファイルを正確なサイズで作るのはtruncate -sです。mkfs.ext4は、ブロックデバイスではないファイルにも作れますが、-Fを要求します。ラベルは-L、予約ブロックの比率は-mです。作ったあとで値を読むのは、tune2fs -lまたはdumpe2fs -hです。

スパースファイルと実際の占有サイズの報告

truncateは、穴を開けるだけでスパースファイルを作り、fallocateは、ブロックを実際に確保します。見かけのサイズはdu --apparent-size、実際の占有は、ただのduで、KiB単位は-kです。statの%sと%bを比べてみても、違いが見えます。

setgid共有ディレクトリとデフォルトACL

chmod 2770の先頭の2が、setgidです。ACLはsetfacl -m、新しく作られるファイルに引き継ぐデフォルトACLは-d -mです。今かかっている項目は、getfaclで確認します。man 1 setfaclの例の節が、特に短くて役に立ちます。

静的な名前解決と解決の順序

1行にアドレス1つと名前を複数書くと、後ろに書いたものが別名になります。確認はgetent hosts <이름>(プレースホルダーは名前です)です。解決の順序は、/etc/nsswitch.confのhosts:の行が決めるもので、man 5 nsswitch.confに説明があります。

SSHサーバーの設定と最終値の確認

メイン設定が一番上でsshd_config.d/*.confをincludeしていて、sshdは、同じキーワードが複数回出てくると、先に読んだ値を使います。文法の確認はsshd -t、解釈された最終値の確認はsshd -Tです。man 5 sshd_configに、キーワードがすべてあります。

ポートを開いているプロセスを見つけ出す

待ち受けているTCPソケットと、そのソケットを持つプロセスを一緒に見るには、ss -ltnpです。ポートで絞り込むには、ss -ltnp 'sport = :9101'のように書きます。プロセス名は、/proc/<PID>/commにもあります。シェルを閉じても死なないように起動してください。

現在のインターフェースと経路を読み取って書く

デフォルト経路はip route show default、アドレスはip -o -4 addr show dev <이름>(プレースホルダーはインターフェース名です)で見ます。-oを付けると1行で出力されるので、フィールドを取り出しやすくなります。MTUはip linkにもありますし、/sys/class/net/<이름>/mtuをそのまま読んでもかまいません。

systemdユニットファイルの作成と有効化リンク

ユニットファイルは、[Unit]、[Service]、[Install]の3つの節でできた、ini形式です。文法の確認はsystemd-analyze verify <경로>(プレースホルダーはパスです)です。systemctl enableが実際にしていることは、[Install]のWantedByが指すターゲットの.wantsディレクトリに、シンボリックリンクを作ることだけです。man 5 systemd.serviceを見てください。

cron.dの項目とrootのcrontab

/etc/cron.dの行には、ユーザーのフィールドがもう1つあって、フィールドが6つです。ユーザーのcrontabには、そのフィールドがありません。15分ごとは*/15、日曜日は、曜日の位置の0です。登録の確認はcrontab -l -u rootです。man 5 crontabを見てください。

ログローテーション設定の作成

設定ブロックは、경로 { 지시어들 }(パスとディレクティブ群)の形です。実際にはローテーションせず、パーサーが何を読んだかだけを見るには、logrotate -d <설정파일>(プレースホルダーは設定ファイルです)です。つづりを間違えたディレクティブは、その出力にerror:と出ます。man 8 logrotateに、ディレクティブがすべてあります。

優先度を下げたバックグラウンド作業とPIDファイル

nice -n 15 <명령>(プレースホルダーはコマンドです)で、優先度を下げて起動します。シェルを閉じても生きているようにするには、nohup ... &で起動してください。今起動したプロセスのPIDは、シェル変数$!に入っています。現在のnice値の確認は、ps -o pid,ni,comm -p <PID>です。スクリプトの1行目のシバンは、#!/bin/bashのように書きます。

パッケージのインストールとアップグレードのロック

この環境はインターネットがなく、/opt/localrepoがリポジトリとして登録されているので、apt-get installがそのまま使えます。インストールされたパッケージのバージョンだけを取り出すには、dpkg-query -W -fの書式文字列を使ってください。アップグレードの対象から外すのはapt-mark holdで、確認はapt-mark showholdです。