:star:
"優れた管理者はすべてを知っている必要はありませんが、不可能なプロジェクトに対して驚くべき解決策を考案できるべきです。" - cwheeler33 (ServerFault)
:star:
"私のスキルは物事を機能させることであり、無数の事実を知ることではありません。[...] システムを修正する必要がある場合、問題を特定し、ログを確認し、エラーを調べます。ソリューションを実装する必要がある場合、適切なソリューションを調査し、実装して文書化します。その後、頻繁に操作しない限り、それがどのように機能するかについて大まかな知識しか持っていません...だから文書化しているのです。" - Sparcrypt (Reddit)
ℹ️ このプロジェクトには 284 のテスト問題と回答が含まれており、知識をテストしたり、Linux (*nix) システム管理者 などのポジションの面接/試験中に使用できます。
✔️ 回答は 例 に過ぎず、トピック全体を網羅しているわけではありません。ほとんどの回答には、より深く理解するための 役立つリソース が含まれています。
⚠️ *** が付いた質問にはまだ回答がないか、回答が不完全です - プルリクエストを作成して追加してください!
🚥 意味が通じない点や正しくないと思われる点があれば、プルリクエストを作成してください。変更内容やコメントについて、妥当で十分に説明された理由を添えてください。
📚 知識/スキルを向上させるには、devops-interview-questions を参照してください。非常に興味深いものです。
» すべての提案を歓迎します «
私の好きな Linux ディストリビューション:
役立つリソース:
GNU は実際には OS ではありません。それは自由ソフトウェアを規定する一連のルールや哲学のようなもので、同時に OS を作成しようとしながら多数のツールを生み出しました。つまり、GNU ツールは基本的にすでに存在していたツールのオープンバージョンであり、オープンソフトウェアの原則に準拠するように再実装されたものです。GNU/Linux はそれらのツールと Linux カーネル を組み合わせて完全な OS を形成したものですが、GNU/Hurd など他の GNU も存在します。
Unix と BSD は、さまざまなレベルの「クローズドソース」である POSIX の「古い」実装です。Unix は通常完全にクローズドソースですが、Linux と同様に(あるいはそれ以上に)多くの種類の Unix が存在します。BSD は通常「オープン」とは見なされませんが、リリース当時は非常にオープンであると考えられていました。そのライセンスは、当時のより「オープン」なライセンスよりもはるかに少ない制限で商用利用を許可していました。
Linux はこれらの中で最も新しいものです。厳密に言えば「単なるカーネル」ですが、一般には GNU ツールやその他の中核コンポーネントと組み合わせて完全な OS と考えられています。
これらを区別する主な違いは、その理念です。Unix、Linux、BSD はそれぞれ異なる理念を持っています。すべて POSIX であり、基本的には互換性があります。いくつかの同じ問題を異なる方法で解決します。したがって、理念と POSIX 標準の実装方法の選択以外には、大きな違いはほとんどありません。
詳細については、GNU、OSS、Linux、BSD、UNIX の作成に関する簡単な記事を読むことをお勧めします。それらはそれぞれの考え方に偏っていますが、これらの記事で違いをよりよく理解できるはずです。
役立つリソース:
CLI は Command Line Interface(コマンドラインインターフェース)または Command Language Interpreter(コマンド言語インタプリタ)の略語です。コマンドラインはシステム/コンピュータを制御する最も強力な方法の一つです。
Unix 系システムでは、CLI はユーザーがシステムに実行させるコマンドを入力するためのインターフェースです。CLI は非常に強力ですが、エラーに対する許容度は低いです。
CLI を使用すると、システム内部やコードをより細かく操作できます。使用する OS に関係なく、GUI よりも柔軟性と制御性に優れています。例えば Github でホストされているソフトウェアを使用する場合、それらを実行するために CLI でコマンドを実行する必要があるものも多くあります。
お気に入りのツール
screen - フリーのターミナルマルチプレクサ。セッションを開始すると、接続が切れてもターミナルが保存されるため、後で自宅から再開できます。ssh - 全般的に学ぶ価値のある最も重要なコマンド。次のような素晴らしいことができます:
sshfs でインターネット越しにファイルシステムをマウントrsync サーバーに対して rsync デーモンなしで実行し、自身で ssh 経由で起動vi/vim - 最も人気のある強力なテキストエディタ。ユニバーサルで、大きなファイルでも非常に高速に動作します。bash-completion - シェル用の定義済み補完ルールが多数含まれています。ヒントとテクニック
CTRL + R でコマンド履歴を検索popd/pushd やその他のシェル組み込み関数を使ってディレクトリスタックを操作BASH がお気に入りです。これは主に好みの問題で、構文が気に入っていて、自分に「しっくり」きます。入出力リダイレクション構文(>>、<< 2>&1、2>、1> など)が C++ に似ているため、認識しやすいです。
ZSH も好きです。BASH よりもはるかにカスタマイズ可能だからです。Oh-My-Zsh フレームワーク、強力なコンテキストベースのタブ補完、強化されたパターンマッチング/グロビング、ロード可能モジュールなどがあります。
役立つリソース:
man [コマンド名] でコマンドの説明を表示できます(例:man less、man cat)
-h または --help - 一部のプログラムはこのパラメータを渡されると説明書を表示します(例:python -h、python --help)
w - サーバーの稼働時間など、多くの有益な情報が得られます。top - 実行中のすべてのプロセスを表示し、CPU、メモリ使用量などで並べ替えできます。netstat - サーバーがリッスンしているポートと IP、およびそれらを使用しているプロセスを確認できます。df - ファイルシステムによって使用されている利用可能なディスク容量を報告します。history - 現在接続しているユーザーが以前に実行したコマンドを表示します。役立つリソース:
ls -al の出力の各フィールドは何を意味しますか?出力の順序で:```bash -rwxrw-r-- 1 root root 2048 Jan 13 07:11 db.dump
- ファイルの権限,
- リンク数,
- 所有者名,
- 所有者グループ,
- ファイルサイズ,
- 最終更新時刻,
- ファイル/ディレクトリ名
ファイルの権限は次のように表示されます:
- 最初の文字は `-` または `l` または `d` で、`d` はディレクトリ、`-` はファイル、`l` はシンボリックリンク (ソフトリンク) — 特別なファイルタイプです
- 3 文字ずつ 3 セットで、所有者・グループ・その他の権限を示します:
- `r` = 読み取り可能
- `w` = 書き込み可能
- `x` = 実行可能
例 `-rwxrw-r--` は、表示される行が次の意味であることを示します:
- 通常のファイル (`-` と表示)
- 所有者は読み取り・書き込み・実行可能 (`rwx`)
- グループは読み取り・書き込み可能だが実行不可 (`rw-`)
- その他は読み取り可能だが書き込み・実行不可 (`r--`)
参考リソース:
- [ls -al の出力フィールドの意味は? (原文)](https://unix.stackexchange.com/questions/103114/what-do-the-fields-in-ls-al-output-mean)
</details>
<details>
<summary><b>ログイン中のユーザー一覧を取得するには?</b></summary><br>
ログイン中のユーザーの要約として、ユーザー名ごとの各ログイン、ユーザーが接続している端末、ログイン日時、場合によっては接続元のコンピュータを表示するには、以下を入力します:```bash
# It uses /var/run/utmp and /var/log/wtmp files to get the details.
who
詳細情報(ユーザー名、端末、発信元コンピュータのIPアドレス、ログイン開始時刻、アイドル時間、プロセスCPUサイクル、ジョブCPUサイクル、現在実行中のコマンドを含む)を表示するには、次のように入力します:```bash
w
また、最後にログインしたユーザーのリストを表示するためには、次のように入力します:```bash
# It uses /var/log/wtmp.
last
有用なリソース:
バックグラウンドで実行中のプロセスを実行する最大の利点は、他のプロセスがバックグラウンドで動作している間に、他のタスクを同時に実行できることです。そのため、異なるプロセスに取り組んでいる間、バックグラウンドでより多くのプロセスを完了させることができます。これは、コマンドの末尾に特殊文字 & を追加することで実現できます。
通常、実行に時間がかかり、ユーザーの操作を必要としないアプリケーションはバックグラウンドに送られ、ターミナルでの作業を続けることができます。
例えば、バックグラウンドで何かをダウンロードしたい場合は、次のようにします:```bash wget https://url-to-download.com/download.tar.gz &
上記のコマンドを実行すると、次の出力が得られます:```bash
[1] 2203
ここで、1はジョブのシリアル番号、2203はジョブのPIDです。
バックグラウンドで実行中のジョブを確認するには、次のコマンドを使用します。```bash jobs
バックグラウンドでジョブを実行すると、ジョブのPIDが表示されます。バックグラウンドで実行中のジョブを強制終了するには、以下のコマンドを使用します:```bash
kill PID
PIDをジョブのPIDに置き換えてください。実行中のジョブが1つだけの場合、次のようにフォアグラウンドに持ってくることができます:```bash fg
バックグラウンドで複数のジョブを実行している場合、以下のようにして任意のジョブをフォアグラウンドに持ってくることができます:```bash
fg %#
# をジョブの連番に置き換えてください。
参考資料:
未完成。
(すべてを) rootとして実行することは悪いです。理由は以下の通りです。
愚かさ: 不注意なミスを防ぐものは何もありません。もしシステムを潜在的に有害な方法で変更しようとする場合、sudoを使用する必要があり、これにより(パスワード入力中に)一時停止が確保され、ミスをしようとしていないか確認できます。
セキュリティ: 管理者ユーザーのログインアカウントを知らなければハッキングが難しくなります。rootはすでに管理者認証情報の半分を持っていることを意味します。
実際には必要ない: rootとして複数のコマンドを実行する必要があり、sudoの有効期限が切れてパスワードを何度も入力するのが面倒な場合、sudo -iと入力するだけでrootになれます。パイプを使っていくつかのコマンドを実行したい場合は、sudo sh -c "command1 | command2"を使用します。
リカバリーコンソールで常に使用できる: リカバリーコンソールを使用すると、大きなミスから回復したり、アプリケーション(これもsudoで実行する必要があります)によって引き起こされた問題を修正できます。この場合、Ubuntuにはrootアカウントのパスワードはありませんが、変更方法はオンラインで検索できます。これにより、あなたのマシンに物理的にアクセスできる人が害を及ぼすことが難しくなります。
参考資料:
両方に top/htop を使用します。free および vmstat コマンドを使用すると、それぞれ物理メモリと仮想メモリの統計を表示できます。sar コマンドを使用すると、CPU使用率やその他の統計を確認できます(ただし、sar はほとんどのシステムにインストールされていません)。
参考資料:
Linuxのロードアベレージは「システム負荷平均」であり、実行中および待機中のスレッドの平均数として、システム上の実行中のスレッド(タスク)の需要を示します。これは需要を測定し、システムが現在処理している量を超える可能性があります。ほとんどのツールは1分、5分、15分の3つの平均を表示します。
これらの3つの数値は、異なるCPUの数値ではありません。これらは、特定の期間(過去1分、5分、15分)の負荷数の平均値です。
ロードアベレージは通常、「実行キューの平均長」と説明されます。そのため、CPUを消費するプロセスやスレッドが少なくても、ロードアベレージが1を超えることがあります。ロードアベレージがCPUコアの総数より小さければ問題ありません。しかし、CPUの数より高くなると、一部のスレッド/プロセスがキューに残り、実行可能状態ではあるが空きCPUを待つことになります。
これは、複数の期間にわたって平均化されたシステムの状態の概観を提供することを意図しています。平均化されているため、システムに高い負荷がかかった後、0に戻るまでに時間がかかります。
いくつかの解釈:
参考資料:
パスワードはシステムのどこにも保存されていません。/etc/shadow に保存されているのは、パスワードのいわゆるハッシュです。
テキスト(パスワード)に対して一方向関数と呼ばれる処理を実行することでハッシュが生成され、照合用の文字列が作成されます。設計上、その処理を逆転させることは「不可能」(計算上実現不可能)です。
古いUnix系システムでは、暗号化されたパスワードを各アカウントの他の情報とともに /etc/passwd に保存していました。
新しいシステムでは、/etc/passwd の該当フィールドに単に * を入れ、/etc/shadow にパスワードを保存します。これは、他の情報だけが必要な場合にパスワードへの読み取りアクセスを誰も持てないようにするためです(shadow は通常 passwd よりも強く保護されます)。
詳細については man crypt、man shadow、man passwd を参照してください。
参考資料:
すべてのディレクトリを例えば 755 (drwxr-xr-x) に変更するには:```bash
find /opt/data -type d -exec chmod 755 {} ;
例えば、すべてのファイルを **644** (`-rw-r--r--`) に変更するには:```bash
find /opt/data -type f -exec chmod 644 {} \;
参考資料:
command not foundで失敗する。エラーの発生源を追跡して解決するには?どうやらどこかでデフォルトのPATH環境変数が上書きされているようです。発生しているエラーの種類から、PATHに例えば/bin(bashを含むコマンドが格納されている)が含まれていないことが示されています。
bashスクリプトやコマンドのデバッグを始める一つの方法は、-xオプションを付けてサブシェルを起動することです:```bash
bash --login -x
これにより、そのシェル起動時に実行されるすべてのコマンドとその引数が表示されます。
また、`PATH`変数の値を表示することも非常に役立ちます。```bash
echo $PATH
これを実行すると:```bash PATH=/bin:/sbin:/usr/bin:/usr/sbin
ほとんどのコマンドが動作するようになります。その後、`~/.bashrc`の代わりに`~/.bash_profile`を編集し、そこで`PATH`をリセットしているものを修正できます。**root**および他のユーザーのデフォルトの`PATH`変数値は`/etc/profile`ファイルにあります。
役立つリソース:
- [PATHにパスを正しく追加する方法?](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path)
</details>
<details>
<summary><b><code>CTRL + C</code> を入力したのにスクリプトがまだ実行中です。どうやって停止しますか? </b></summary><br>
ほとんどの場合、実行中のスクリプトは `CTRL + C` のキーボードショートカットで停止できます。これはスクリプトに割り込み信号 (SIGINT) を送信し、実行を終了します。これが機能せずスクリプトがまだ実行中の場合は、`CTRL + \` の組み合わせを試すことができます。これは終了信号 (SIGQUIT) を送信し、即座に終了する可能性があります。
あるいは、ターミナルやコマンドラインインターフェースを使用している場合、`kill` コマンドを使用してスクリプトプロセスにシグナルを送信することもできます。`ps` または `top` コマンドでスクリプトのプロセスID (PID) を確認し、`kill` コマンドにPIDを指定してスクリプトを停止します。
場合によっては、通常の `kill` コマンドがスクリプトのスタックや応答なしのために機能しないときは、`kill -9` コマンドを使用して強制的に停止する必要があります。`-9` オプションは SIGKILL シグナルを送信し、プロセスを即座に強制終了します。
</details>
<details>
<summary><b><code>grep</code>コマンドとは何ですか?同じ行で複数の文字列をマッチさせる方法は?</b></summary><br>
`grep`ユーティリティは、`egrep`や`fgrep`を含むUnixツールのファミリーです。
`grep`はファイルのパターンを検索します。別のコマンドの出力内で特定のパターンを探している場合、`grep`は関連する行を強調表示します。ログファイル、特定のプロセスなどを検索するためにこのgrepコマンドを使用します。
複数の文字列をマッチさせるには:```bash
grep -E "string1|string2" filename
各コマンドを、前のコマンドが成功した場合のみ実行したい場合は、&& 演算子を使って結合します:```bash
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
いずれかのコマンドが失敗した場合、それに続く他のすべてのコマンドは実行されません。
前のコマンドが失敗したかどうかにかかわらず、すべてのコマンドを実行したい場合は、セミコロンで区切ります:
command1 ; command2 ; command3
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
```
あなたの場合、次のコマンドの実行が前のコマンドの成功に依存する最初のケースが必要だと思います。
代わりに、すべてのコマンドをスクリプトにまとめて実行することもできます:```bash
#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
```
Useful resources:
- [複数のLinuxコマンドを1行で実行・結合する(原文)](https://stackoverflow.com/questions/13077241/execute-combine-multiple-linux-commands-in-one-line)
</details>
<details>
<summary><b>すべてのユーザーにファイルの実行権限を付与し、他の権限に影響を与えないために <code>chmod</code> に渡すシンボル表現は何ですか?</b></summary><br>```bash
chmod a+x /path/to/file
```
- `a` - すべてのユーザー向け
- `x` - 実行許可
- `r` - 読み取り許可
- `w` - 書き込み許可
参考リソース:
- [chmodを使用したファイル権限の設定方法](https://www.washington.edu/computing/unix/permissions.html)
- [「chmod +x your_file_name」は何をするものですか?またどう使うのですか?](https://askubuntu.com/questions/443789/what-does-chmod-x-filename-do-and-how-do-i-use-it)
</details>
<details>
<summary><b>2つのローカルディレクトリを同期するには?</b></summary><br>
同じシステム上で **dir1** の内容を **dir2** に同期するには、次のように入力します:```bash
rsync -av --progress --delete dir1/ dir2
```
- `-a`, `--archive` - アーカイブモード
- `--delete` - 宛先ディレクトリから余分なファイルを削除
- `-v`, `--verbose` - 詳細モード(冗長性を高める)
- `--progress` - 転送中の進行状況を表示
便利なリソース:
- [2つのローカルディレクトリを同期するには?(オリジナル](https://unix.stackexchange.com/questions/392536/how-can-i-sync-two-local-directories)
- [rsyncによるフォルダの同期](https://www.jveweb.net/en/archives/2010/11/synchronizing-folders-with-rsync.html)
</details>
<details>
<summary><b>多くの基本的なメンテナンス作業では、設定ファイルの編集が必要になります。行った変更を元に戻す方法を説明してください。</b></summary><br>
- 編集前にファイルを手動でバックアップする(ブレース展開を使用:`cp filename{,.orig}`)
- ファイルが保存されているディレクトリ構造を手動でコピーする(例:`cp`、`rsync`、`tar`)
- エディタで元のファイルのバックアップを作成する(例:エディタの設定ファイルにルールを設定)
- 最善の解決策は、設定ファイルを追跡するために `git`(または他のバージョン管理)を使用することです(例:`/etc` ディレクトリには `etckeeper`)
便利なリソース:
- [ファイル名拡張子の前に.bakを付けてバックアップ](https://unix.stackexchange.com/questions/66376/backup-file-with-bak-before-filename-extension)
- [設定ファイルのバージョン管理にgitを使用するのは良いアイデアですか?](https://superuser.com/questions/1037211/is-it-a-good-idea-to-use-git-for-configuration-file-version-controlling)
</details>
<details>
<summary><b>20MBを超えるすべてのファイルを見つける必要があります。どのように見つけますか?</b></summary><br>```bash
find / -type f -size +20M
```
有用なリソース:
- [xバイトより大きい/小さいファイルを見つけるにはどうすればいいですか?](https://superuser.com/questions/204564/how-can-i-find-files-that-are-bigger-smaller-than-x-bytes)
</details>
<details>
<summary><b>なぜ<code>sudo su -</code>を使い、単に<code>sudo su</code>を使わないのですか?</b></summary><br>
`sudo`は、ほとんどの現代的なLinuxディストリビューションに存在します。そこでは(常にではありませんが)rootユーザーが無効化されており、パスワードが設定されていません。そのため、`su`でrootユーザーに切り替えることはできません(試すことはできます)。root権限で`sudo`を呼び出す必要があります:`sudo su`。
`su`は単にユーザーを切り替え、以前のユーザーとほぼ同じ環境の通常のシェルを提供します。
`su -`はユーザー切り替え後にログインシェルを起動します。ログインシェルはほとんどの環境変数をリセットし、クリーンなベースを提供します。
有用なリソース:
- [su vs sudo -s vs sudo -i vs sudo bash](https://unix.stackexchange.com/questions/35338/su-vs-sudo-s-vs-sudo-i-vs-sudo-bash)
- [なぜsu -を使い、単にsuを使わないのですか?(オリジナル)](https://unix.stackexchange.com/questions/7013/why-do-we-use-su-and-not-just-su)
</details>
<details>
<summary><b>システム上で過去60分以内に変更されたファイルを見つける方法は?</b></summary><br>```bash
find / -mmin -60 -type f
```
参考リソース:
- [過去30日以内に変更された全ファイルを取得(オリジナル)](https://stackoverflow.com/questions/23070245/get-all-files-modified-in-last-30-days-in-a-directory)
</details>
<details>
<summary><b>古いログファイルを保持する主な理由は何ですか?</b></summary><br>
システム上の問題を調査するために不可欠です。**ログ管理**はITセキュリティにとって極めて重要です。
サーバー、ファイアウォール、その他のIT機器は、重要なイベントやトランザクションを記録するログファイルを保持しています。この情報は、ネットワーク内外からの敵対的な活動に関する重要な手がかりを提供します。また、ログデータは、設定の問題やハードウェア障害を含む機器の問題を特定し、トラブルシューティングするための情報も提供します。
それは、誰がいつあなたのサイトに来て、何を正確に見たかというサーバーの記録です。非常に詳細で、以下のことがわかります:
- 訪問者の出身地
- 使用していたブラウザ
- 正確にどのファイルを見たか
- 各ファイルの読み込みにかかった時間
- その他多くのマニアックな情報
考慮すべき要素:
- 保持または破棄に関する法的要件
- 保持および破棄に関する会社のポリシー
- ログが有用な期間
- ログから得たいと考える質問
- ログが占める容量
ログを収集・分析することで、ネットワーク内で何が起きているかを把握できます。各ログファイルには多くの情報が含まれており、特にその読み方や分析方法を知っていれば、非常に貴重なものとなります。
参考リソース:
- [ログファイルはどのくらいの期間保持しますか?](https://serverfault.com/questions/135365/how-long-do-you-keep-log-files)
</details>
<details>
<summary><b>増分バックアップとは何ですか?</b></summary><br>
増分バックアップは、前回のバックアップ以降に変更されたファイルのみをコピーするバックアップの一種です。
参考リソース:
- [増分バックアップとは?](https://www.nakivo.com/blog/what-is-incremental-backup/)
</details>
<details>
<summary><b>RAIDとは何ですか?RAID0、RAID1、RAID5、RAID6、RAID10とは?</b></summary><br>
**RAID**(Redundant Array of Inexpensive Disks)は、データストレージのパフォーマンスや信頼性を向上させるために使用される技術です。
- **RAID0**:**ストライピング**とも呼ばれ、ファイルを分割してRAIDグループ内のすべてのディスクドライブにデータを分散させる技術です。障害に対する保護策はありません。
- **RAID1**:2台のドライブに同じデータを書き込むことで安全性を高める、人気のディスクサブシステムです。「**ミラーリング**」と呼ばれ、RAID 1は書き込みパフォーマンスを向上させませんが、読み取りパフォーマンスは各ディスクのパフォーマンスの合計に匹敵する場合があります。ただし、1台のドライブが故障した場合、2台目のドライブが使用され、故障したドライブは手動で交換されます。交換後、RAIDコントローラは動作中のドライブの内容を新しいドライブに複製します。
- **RAID5**:パリティデータを計算することで安全性を高め、3台以上のドライブにデータをインターリーブ(**ストライピング**)することで速度を向上させるディスクサブシステムです。単一のドライブが故障した場合、分散パリティから後続の読み取りを計算できるため、データは失われません。
- **RAID6**:RAID 6は、RAID 5にさらにパリティブロックを追加したものです。最低4台のディスクが必要で、任意の2台の同時ディスク障害に対しても読み取りおよび書き込みを継続できます。RAID 6は読み取り操作にパフォーマンス上のペナルティはありませんが、パリティ計算のオーバーヘッドにより書き込み操作にパフォーマンス上のペナルティがあります。
- **RAID10**:**RAID 1+0**とも呼ばれ、ディスクミラーリングとディスクストライピングを組み合わせてデータを保護するRAID構成です。最低4台のディスクが必要で、ミラーリングされたペア間でデータをストライピングします。各ミラーペア内の少なくとも1台のディスクが機能している限り、データを取得できます。同じミラーペア内の2台のディスクが両方とも故障すると、ストライプセットにパリティがないため、すべてのデータが失われます。
参考リソース:
- [RAID](https://www.prepressure.com/library/technology/raid)
</details>
<details>
<summary><b>ユーザーのデフォルトグループはどのように決定されますか?どのように変更しますか?</b></summary><br>```bash
useradd -m -g initial_group username
```
`-g/--gid`:ユーザーの初期ログイングループのグループ名または番号を指定します。指定する場合、グループ名は既存のものでなければならず、グループ番号が指定された場合は、既存のグループを参照する必要があります。
指定されない場合、useraddの動作は`/etc/login.defs`に含まれる`USERGROUPS_ENAB`変数に依存します。デフォルトの動作(`USERGROUPS_ENAB yes`)は、ユーザー名と同じ名前のグループを作成し、**GID**は**UID**と等しくなります。
参考リソース:
- [Linuxでユーザーのデフォルトグループを変更するには?](https://unix.stackexchange.com/questions/26675/how-can-i-change-a-users-default-group-in-linux)
</details>
<details>
<summary><b>日常業務やスクリプティングに最適なコマンドラインテキストエディタは何ですか? ***</b></summary><br>
追記予定。
</details>
<details>
<summary><b>なぜサーバーをラックにマウントしたいのですか?</b></summary><br>
- ハードウェアの保護
- 適切な冷却
- 整理された作業スペース
- 優れた電源管理
- クリーンな環境
参考リソース:
- [PCをラックマウントする5つの理由](https://www.racksolutions.com/news/custom-projects/5-reasons-to-rackmount-pc/)
</details>
###### ネットワークに関する質問 (23)
<details>
<summary><b>簡単なネットワーク図を描いてください。システム20台、ルーター1台、スイッチ4台、サーバー5台、小さなIPブロックがあります。 ***</b></summary><br>
追記予定。
</details>
<details>
<summary><b>OSI(またはその他の)モデルに関して理解すべき最も重要なことは何ですか?</b></summary><br>
**OSI**(またはその他の)モデルに関して理解すべき最も重要なことは以下の通りです:
- プロトコルを層に分割できる
- 層がカプセル化を提供する
- 層が抽象化を提供する
- 層が機能を他の機能から切り離す
参考リソース:
- [OSIモデルとネットワーキングプロトコルの関係](https://networkengineering.stackexchange.com/questions/6380/osi-model-and-networking-protocols-relationship)
</details>
<details>
<summary><b>VLANとサブネットの違いは何ですか?サブネットを設定するためにVLANは必要ですか?</b></summary><br>
**VLAN**と**サブネット**は異なる問題を解決します。**VLAN**はレイヤー2で動作し、それによって(例えば)ブロードキャストドメインを変更します。一方、**サブネット**は現在のコンテキストではレイヤー3です。
**サブネット** - アドレスの一部(多くの場合ネットワークアドレスと呼ばれる)とサブネットマスク(ネットマスク)によって決定されるIPアドレスの範囲です。例えば、ネットマスクが`255.255.255.0`(略して`/24`)、ネットワークアドレスが`192.168.10.0`の場合、`192.168.10.0`から`192.168.10.255`までのIPアドレスの範囲を定義します。これを省略して書くと`192.168.10.0/24`となります。
**VLAN** - これを「スイッチのパーティショニング」と考えると良いでしょう。VLAN対応の8ポートスイッチがあるとします。4つのポートを1つの**VLAN**(例えば`VLAN 1`)に割り当て、残りの4つのポートを別の**VLAN**(例えば`VLAN 2`)に割り当てます。`VLAN 1`は`VLAN 2`のトラフィックを一切見ることができず、その逆も同様です。論理的には、2つの独立したスイッチを持つことになります。通常のスイッチでは、スイッチがMACアドレスを認識していない場合、トラフィックを他のすべてのポートに「フラッディング」します。**VLAN**はこれを防止します。
サブネットは、レイヤー2および3でホストが通信するのを助けるIPアドレスの範囲にすぎません。各サブネットが独自の**VLAN**を必要とするわけではありません。**VLAN**は分離(レイヤー2通信のサンドボックス、異なる**VLAN**の2つのシステムは通信できませんが、**Inter VLANルーティング**を通じて可能になります)、管理の容易さ、セキュリティのために実装されます。
参考リソース:
- [VLANとサブネットの違いは何ですか?(原文)](https://superuser.com/questions/353664/what-is-the-difference-between-a-vlan-and-a-subnet)
- [ネットワークセキュリティとセグメンテーションのためのVLANとサブネット](https://networkengineering.stackexchange.com/questions/46899/vlans-vs-subnets-for-network-security-and-segmentation)
</details>
<details>
<summary><b>知っておくべき一般的なネットワークポートを5つ挙げてください。</b></summary><br>
<table style="width:100%">
<tr>
<th>サービス</th>
<th>ポート</th>
</tr>
<tr>
<td>SMTP</td>
<td>25</td>
</tr>
<tr>
<td>FTP</td>
<td>データ転送用20、接続確立用21</td>
</tr>
<tr>
<td>DNS</td>
<td>53</td>
</tr>
<tr>
<td>DHCP</td>
<td>DHCPサーバー用67/UDP、DHCPクライアント用68/UDP</td>
</tr>
<tr>
<td>SSH</td>
<td>22</td>
</tr>
</table>
参考リソース:
- [Red Hat Enterprise Linux 4: セキュリティガイド - 一般的なポート](https://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-en-4/ch-ports.html)
</details>
<details>
<summary><b>POPとIMAPとは何か、またどちらを実装すべきかをどのように選択しますか?</b></summary><br>
POPとIMAPはどちらも、メールサーバーからメールクライアントにメッセージを取得するためのプロトコルです。
**POP**(_Post Office Protocol_)は、メールサーバーからクライアントへの一方向のプッシュを使用します。デフォルトでは、メッセージをPOPメールクライアントに送信し、メールサーバーから削除しますが、メールサーバーにすべてのメッセージを保持するように設定することも可能です。メールクライアントでメッセージに対して行った操作(ラベル付け、削除、フォルダへの移動)はメールサーバーに反映されず、したがってメールサーバーから取得する他のメールクライアントからはアクセスできません。POPはメールサーバーのストレージスペースをほとんど使用せず、メッセージがメールサーバーと複数のクライアントではなく、1つのメールクライアントにのみ存在するため、より安全と見なせます。
**IMAP**(_Internet Message Access Protocol_)は、メールサーバーとクライアント間の双方向通信を使用します。IMAPで設定されたメールクライアントでメッセージを削除またはラベル付けすると、メールサーバー上のメッセージも削除またはラベル付けされます。IMAPを使用すると、異なるクライアントやデバイス間でメールにアクセスする際に、メッセージを複数のデバイスで同じ状態で存在させることができるため、一貫したエクスペリエンスが可能になります。IMAPはまた、メッセージを選択的に同期したり、必要に応じて後でメールサーバーから同期できるため、古いメッセージをメールクライアントから削除することで、メールクライアントのディスク容量を節約できます。
複数のデバイスでメッセージにアクセスする必要があり、クライアントデバイスのディスク容量を節約したい場合はIMAPを選択してください。メールサーバーのディスク容量を節約し、1つのクライアントデバイスからのみメッセージにアクセスし、メッセージが複数のシステムに存在しないようにしたい場合はPOPを選択してください。
</details>
<details>
<summary><b>デフォルトルートとルーティングテーブルを確認するには?</b></summary><br>
`netstat -nr`、`route -n`、または`ip route show`というコマンドを使用すると、デフォルトルートとルーティングテーブルを確認できます。
参考リソース:
- [Linuxでルート(ルーティングテーブル)を確認する方法](https://howto.lintel.in/how-to-check-routes-routing-table-in-linux/)
- [FreeBSDでデフォルトルート/ゲートウェイを設定する](https://www.cyberciti.biz/faq/freebsd-setup-default-routing-with-route-command/)
</details>
<details>
<summary><b>127.0.0.1とlocalhostの違いは何ですか?</b></summary><br>
最も可能性の高い違いは、どこかでlocalhostの実際のルックアップを実行する必要があることです。
`127.0.0.1`を使用すると、(インテリジェントな)ソフトウェアはそれを直接IPアドレスに変換して使用します。一部の`gethostbyname`の実装では、ドット形式(およびおそらく同等のIPv6形式)を検出し、ルックアップをまったく実行しません。
それ以外の場合、名前を解決する必要があります。そして、その解決にホストファイルが実際に使用される(最初に、またはまったく使用される)保証はないため、`localhost`はまったく異なるIPアドレスになる可能性があります。
つまり、一部のシステムでは、ローカルのホストファイルがバイパスされる可能性があるということです。`host.conf`ファイルはLinux(および他の多くのUnix系システム)でこれを制御します。
Unixドメインソケットを使用する場合、TCP/IPを使用するよりも(オーバーヘッドが少ないため)わずかに高速になります。WindowsはデフォルトでTCP/IPを使用しますが、Linuxはlocalhostを選択した場合はUnixドメインソケットを、`127.0.0.1`を使用した場合はTCP/IPを使用しようとします。
参考リソース:
- [127.0.0.1とlocalhostの違いは何ですか?](https://stackoverflow.com/questions/7382602/what-is-the-difference-between-127-0-0-1-and-localhost)
- [localhostと127.0.0.1](https://stackoverflow.com/questions/3715925/localhost-vs-127-0-0-1)
</details>
<details>
<summary><b><code>ping</code>コマンドではどのポートが使用されますか?</b></summary><br>
`ping`は**ICMP**、特に**ICMPエコー要求**および**ICMPエコー応答**パケットを使用します。**ICMP**に関連付けられた「ポート」はありません。ポートは、2つのIPトランスポート層プロトコルであるTCPとUDPに関連付けられています。**ICMP**、TCP、UDPは「兄弟」のようなものであり、相互に基づいているわけではなく、IP上で動作する3つの別々のプロトコルです。
**ICMP**パケットは、IPデータグラムヘッダーの「プロトコル」フィールドによって識別されます。**ICMP**はUDPまたはTCPの通信サービスのいずれも使用せず、raw IP通信サービスを使用します。これは、**ICMP**メッセージがIPデータグラムのデータフィールドに直接運ばれることを意味します。`raw`という用語は、ソフトウェアでの実装方法に由来し、**ICMP**メッセージを作成して送信するには、`raw`ソケットを開き、**ICMP**メッセージを含むバッファを構築し、メッセージを含むバッファをrawソケットに書き込みます。
**ICMP**のIPプロトコル値は1です。プロトコルフィールドはIPヘッダーの一部であり、IPデータグラムのデータ部分にあるものを識別します。
ただし、`nmap`を使用してポートが開いているかどうかを確認することもできます。```bash
nmap -p 80 example.com
```
参考資料:
- [Pingポート番号](https://networkengineering.stackexchange.com/questions/42463/ping-port-number)
- [アドレス:ポートにpingを送ることは可能ですか?](https://superuser.com/questions/769541/is-it-possible-to-ping-an-addressport)
</details>
<details>
<summary><b>サーバAがサーバBと通信できない。考えられる理由をいくつかの手順で説明してください。</b></summary><br>
サーバ間の通信問題をトラブルシューティングするには、理想的にはTCP/IPスタックに従うのが良いでしょう。
1. **アプリケーション層**: 両方のサーバでサービスが起動して実行されていますか?正しく設定されていますか(例:正しいIPと正しいポートにバインド)?アプリケーションおよびシステムログに意味のあるエラーが表示されていますか?
2. **トランスポート層**: アプリケーションが使用するポートは開いていますか(telnetを試してみましょう!)?サーバにpingを送信できますか?
3. **ネットワーク層**: ネットワーク上またはOSにファイアウォールが正しく設定されていますか?IPスタックは正しく設定されていますか(IP、ルート、DNSなど)?スイッチとルーターは動作していますか(ARPテーブルを確認!)?
4. **物理層**: サーバはネットワークに接続されていますか?パケットが失われていますか?
</details>
<details>
<summary><b>なぜサーバでホスト名が解決できないのですか?この問題を修正してください。 ***</b></summary><br>
未完成。
</details>
<details>
<summary><b>CLIを使用して(外部DNSを使って)ドメイン名を解決する方法は?IPアドレスをドメイン名に解決できますか?</b></summary><br>
IPアドレスをドメイン名に解決する例:```bash
# with host command:
host domain.com 8.8.8.8
# with dig command:
dig @9.9.9.9 google.com
# with nslookup command:
nslookup domain.com 8.8.8.8
```
IPアドレスをホスト名に(場合によっては)解決できます。IPアドレスは**PTR**レコードに関連付けられて保存されます。その後、次の操作ができます:```bash
dig A <hostname>
```
ホストのIPv4アドレスをルックアップするには、または:```bash
dig AAAA <hostname>
```
ホストのIPv6アドレスを検索するには、または:```bash
dig PTR ZZZ.YYY.XXX.WWW.in-addr.arpa.
```
IPv4アドレス `WWW.XXX.YYY.ZZZ` のホスト名を検索するには(オクテットが逆順であることに注意)、または:```bash
dig PTR b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
```
参考リソース:
- [Bashスクリプトでホスト名をIPアドレスに解決するには?](https://unix.stackexchange.com/questions/20784/how-can-i-resolve-a-hostname-to-an-ip-address-in-a-bash-script)
- [IPアドレスをドメイン名に解決する方法は?](https://superuser.com/questions/315687/how-to-resolve-ip-addresses-to-domain-names)
</details>
<details>
<summary><b><code>telnet</code>または<code>nc</code>でポート接続をテストするには?</b></summary><br>```bash
# with telnet command:
telnet code42.example.com 5432
# with nc (netcat) command:
nc -vz code42.example.com 5432
```
</details>
<details>
<summary><b>リモートでシステムを管理するために <code>telnet</code> を避けるべき理由は何ですか?</b></summary><br>
最新のオペレーティングシステムでは、デフォルトで安全でない可能性のあるサービスはすべて無効化されています。一方で、ネットワーク機器の一部のベンダーは、telnetプロトコルを使用した通信の確立を依然として許可しています。
**Telnet** は最も安全でない通信方法を使用します。ネットワーク上にデータを平文で送信するため、誰でもネットワークツールを使用してパスワードを簡単に発見できます。
**Telnet** の場合、ログイン認証情報が平文で送信されるため、ネットワーク上でスニファを実行している誰でも、**Telnet** ログインセッションを盗聴することで、デバイスを制御するために必要な情報を数秒で見つけることができます。
参考資料:
- [Telnet と安全な代替手段としての SSH](https://www.ssh.com/ssh/telnet)
- [特定のポートのIPアドレスにtelnetする方法は?](https://superuser.com/questions/339107/how-to-telnet-to-an-ip-address-on-a-specific-port)
</details>
<details>
<summary><b><code>wget</code> と <code>curl</code> の違いは何ですか?</b></summary><br>
主な違いは以下の通りです。`wget` の `curl` に対する主な強みは、再帰的にダウンロードできることです。`wget` はコマンドラインのみです。`curl` は FTP、FTPS、HTTP、HTTPS、SCP、SFTP、TFTP、TELNET、DICT、LDAP、LDAPS、FILE、POP3、IMAP、SMTP、RTMP、RTSP をサポートしています。
参考資料:
- [curl と wget の違いは何ですか?(原文)](https://unix.stackexchange.com/questions/47434/what-is-the-difference-between-curl-and-wget)
</details>
<details>
<summary><b>SSH とは何ですか?また、どのように動作しますか?</b></summary><br>
**SSH** は **Secure Shell** の略です。サーバー "A" からサーバー "B" のシェルセッションに接続できるプロトコルです。これにより、サーバー "B" を操作できます。
**SSH** 接続を確立するには、リモートマシン(サーバー A)で **SSH** デーモンと呼ばれるソフトウェアが実行されており、ユーザーのコンピュータ(サーバー B)に **SSH** クライアントが必要です。
**SSH** デーモンと **SSH** クライアントは特定のネットワークポート(デフォルトは22)で接続を待ち受け、接続要求を認証し、ユーザーが正しい認証情報を提供した場合に適切な環境を起動します。
参考資料:
- [SSH 暗号化と接続プロセスを理解する](https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process)
</details>
<details>
<summary><b>ほとんどのチュートリアルでは、パスワード認証ではなく SSH 鍵認証を使用することを推奨しています。なぜそれがより安全だと考えられているのですか?</b></summary><br>
**SSH 鍵** は SSH プロトコルにおけるアクセス資格情報です。その機能はユーザー名やパスワードと似ていますが、鍵は主に自動化プロセスや、システム管理者やパワーユーザーによるシングルサインオンの実装に使用されます。
ユーザーのパスワードを要求する代わりに、公開鍵と秘密鍵を使用した非対称暗号アルゴリズムによってクライアントの身元を確認できます。
SSH サービスが公開鍵認証のみを許可している場合、攻撃者はサーバーに保存されている公開鍵に対応する秘密鍵のコピーを必要とします。
SSH サービスがパスワードベースの認証を許可している場合、インターネットに接続された SSH サーバーは、ユーザー名とパスワードを推測しようとするボットネットにより昼夜を問わず攻撃されます。ボットネットは情報を必要とせず、一般的な名前とパスワードを試すだけで済みます。その他の問題として、これによりログが詰まってしまいます。
参考資料:
- [鍵ベース認証(公開鍵認証)](http://www.crypto-it.net/eng/tools/key-based-authentication.html)
- [SSH パスワード vs 鍵認証](https://security.stackexchange.com/questions/33381/ssh-password-vs-key-authentication)
</details>
<details>
<summary><b>パケットフィルターとは何ですか?また、どのように動作しますか?</b></summary><br>
**パケットフィルタリング** は、発信・着信パケットを監視し、送信元・宛先のインターネットプロトコル(IP)アドレス、プロトコル、ポートに基づいて通過または停止を許可することで、ネットワークアクセスを制御するファイアウォール技術です。
パケットフィルタリングは、セキュリティ要件が低い場合に適しています。多くの組織の内部(プライベート)ネットワークは高度にセグメント化されていません。組織のある部分を別の部分から隔離するために、高度に洗練されたファイアウォールは必要ありません。
ただし、実験用ネットワークやラボから本番ネットワークをある程度保護することは賢明です。パケットフィルタリングデバイスは、あるサブネットを別のサブネットから隔離するのに非常に適した手段です。
TCP/IP プロトコルスタックのネットワーク層とトランスポート層で動作し、パケットがプロトコルスタックに入るたびに検査されます。ネットワークヘッダとトランスポートヘッダは、以下の情報について詳細に検査されます。
- **プロトコル(IPヘッダ、ネットワーク層)** - IPヘッダのバイト9(バイトカウントは0から始まることに注意)はパケットのプロトコルを識別します。ほとんどのフィルタデバイスは、TCP、UDP、ICMPを区別できます。
- **送信元アドレス(IPヘッダ、ネットワーク層)** - 送信元アドレスは、パケットを作成したホストの32ビットIPアドレスです。
- **宛先アドレス(IPヘッダ、ネットワーク層)** - 宛先アドレスは、パケットの送信先ホストの32ビットIPアドレスです。
- **送信元ポート(TCPまたはUDPヘッダ、トランスポート層)** - TCPまたはUDPネットワーク接続の各エンドはポートにバインドされています。TCPポートはUDPポートとは別個のものです。1024未満のポートは予約済みであり、特定の用途が定義されています。1024以上のポートはエフェメラルポートと呼ばれ、ベンダーが自由に使用できます。「ウェルノウンポート」の一覧はRFP1700を参照してください。送信元ポートは疑似ランダムに割り当てられたエフェメラルポート番号です。したがって、送信元ポートでフィルタリングすることはあまり有用ではありません。
- **宛先ポート(TCPまたはUDPヘッダ、トランスポート層)** - 宛先ポート番号はパケットの送信先ポートを示します。宛先ホスト上の各サービスは特定のポートをリッスンします。フィルタリングされる可能性のあるウェルノウンポートには、20/TCPおよび21/TCP(FTP接続/データ)、23/TCP(telnet)、80/TCP(HTTP)、53/TCP(DNSゾーン転送)などがあります。
- **接続ステータス(TCPヘッダ、トランスポート層)** - 接続ステータスは、パケットがネットワークセッションの最初のパケットかどうかを示します。TCPヘッダのACKビットが「false」または0の場合、このパケットがセッションの最初のパケットです。ACKビットが「false」または0に設定されたパケットを拒否または破棄することで、ホストが接続を確立するのを簡単に禁止できます。
参考資料:
- [インターネットファイアウォールの構築 - パケットフィルタリング](http://web.deu.edu.tr/static/oreily/networking/firewall/ch06_01.htm)
</details>
<details>
<summary><b>リバースプロキシサーバーを使用する利点は何ですか?</b></summary><br>
**バックエンドサーバーのトポロジと特性を隠蔽する**
**リバースプロキシサーバー** は、オリジンサーバーの存在と特性を隠蔽できます。インターネットクラウドとWebサーバーの間の仲介役として機能します。特にWebホスティングサービスを使用する場合、セキュリティ上の理由から有益です。
**バックエンドサーバーの透過的なメンテナンスを可能にする**
リバースプロキシの背後で動作するサーバーに変更を加えても、エンドユーザーからは完全に透過的になります。
**負荷分散**
リバースプロキシは、ラウンドロビン、加重ラウンドロビン、最小接続数、加重最小接続数、ランダムなどの負荷分散アルゴリズムを適用して、クラスター内のサーバー間で負荷を分散します。
サーバーがダウンすると、システムは自動的に次の稼働サーバーにフェイルオーバーし、ユーザーは安全なファイル転送アクティビティを続行できます。
**SSLオフロード/終端**
着信HTTPS接続を処理し、リクエストを復号化して、暗号化されていないリクエストをWebサーバーに渡します。
**IPマスキング**
単一のIPを使用しながら、異なるURLで異なるバックエンドサーバーにルーティングします。
参考資料:
- [リバースプロキシの利点](https://dzone.com/articles/benefits-reverse-proxy)
</details>
<details>
<summary><b>ルーターとゲートウェイの違いは何ですか?デフォルトゲートウェイとは何ですか?</b></summary><br>
**ルーター** は一般的な技術機能(レイヤ3転送)またはその目的のためのハードウェアデバイスを指すのに対し、**ゲートウェイ** はローカルセグメントの機能(他の場所への接続を提供する)を指します。「_ルーターをゲートウェイとして設定する_」とも言えます。サブネット間の転送を表す別の用語としてホップがあります。
**デフォルトゲートウェイ** という用語は、LAN上のルーターのうち、LAN外のコンピューターへのトラフィックの最初の窓口となる責任を持つものを指すために使用されます。
これは単に視点の問題であり、デバイスは同じものです。
参考資料:
- [ルーターとゲートウェイの違い(原文)](https://networkengineering.stackexchange.com/questions/51426/difference-between-router-and-gateway)
</details>
<details>
<summary><b>以下のDNSレコードの機能を説明してください:SOA、PTR、A、MX、CNAME。</b></summary><br>
**DNSレコード** は基本的に、各ドメインがどのIPアドレスに関連付けられているか、および各ドメインに送信されたリクエストをどのように処理するかをDNSサーバーに伝えるマッピングファイルです。ほぼすべてのDNSレコード設定で一般的に使用される**DNSレコード**の構文には、`A`、`AAAA`、`CNAME`、`MX`、`PTR`、`NS`、`SOA`、`SRV`、`TXT`、`NAPTR` があります。
- **SOA** - Start of Authority(権限開始)
- **A** - アドレスマッピングレコード
- **AAAA** - IPv6アドレスレコード
- **CNAME** - カノニカルネームレコード
- **MX** - メール交換レコード
- **NS** - ネームサーバーレコード
- **PTR** - 逆引きポインタレコード
参考資料:
- [DNSレコードタイプの一覧](https://en.wikipedia.org/wiki/List_of_DNS_record_types)
</details>
<details>
<summary><b>なぜネットワーキングにIPv4/IPv6の代わりにMACアドレスを使用できないのですか?</b></summary><br>
**OSI** モデルは、物理的な**レイヤ2**メカニズムに基づいて、**レイヤ3**の概念であるルーティングの決定を行うことがなぜ意味をなさないかを説明しています。
現代のネットワーキングは、エンドツーエンドの通信を実現するために、多くの異なるレイヤに分割されています。ネットワークカード(MACアドレスでアドレス指定される物理アドレス)は、自身の物理ネットワーク上のピアとの通信のみを担当する必要があります。
**MAC** アドレスで実現できる通信は、マシンと物理的に接触している他のデバイスに限定されます。例えばインターネット上では、各マシンと物理的に接続されているわけではありません。そのため、物理的に接続されていないマシンと通信する必要がある場合、**TCP/IP**(**レイヤ3**の論理アドレス)メカニズムを使用します。
**IP** は、コンピューターのグループに階層的に課された任意の番号付けスキームであり、それらをグループとして論理的に区別するためのものです(これがサブネットです)。これらのグループ間でのメッセージ送信はルーティングテーブルによって行われ、ルーティングテーブル自体も複数のレベルに分割されているため、すべてのサブネットを追跡する必要はありません。
これを別のシステムのペアに関連付けるのも簡単です。あなたは州発行のID番号を持っています。そのID番号がすでにあなただけに固有であるなら、なぜ郵送先住所が必要なのでしょうか?郵送先住所が必要なのは、あなたへの通信の一意の送り先を記述する任意のシステムだからです。
一方、ネットワーク全体での**MAC**アドレスの分布はランダムであり、トポロジとはまったく無関係です。ルートのグループ化は不可能であり、すべてのルーターがトラフィックを中継するすべてのデバイスへのルートを追跡する必要があります。これは**レイヤ2**スイッチが行うことであり、一定数のホストを超えるとうまくスケールしません。
参考資料:
- [なぜネットワーキングにIPv4/IPv6の代わりにMACアドレスを使用できないのですか?(原文)](https://serverfault.com/questions/410626/why-couldnt-mac-addresses-be-used-instead-of-ipv46-for-networking)
</details>
<details>
<summary><b>最大30台のデバイスを含むネットワークに適用できる最小のIPv4サブネットマスクは何ですか?</b></summary><br>
エンドユーザー用の標準的な`/24` VLAN、ポイントツーポイントリンク用の`/30`、またはその中間であっても、最大30台のデバイスを含むサブネットは`/27`、つまりサブネットマスク`255.255.255.224`になります。
参考資料:
- [プレフィックス、ネットワーク、サブネット、ホスト番号を計算するにはどうすればよいですか?](https://networkengineering.stackexchange.com/questions/7106/how-do-you-calculate-the-prefix-network-subnet-and-host-numbers)
- [IPアドレスの後のスラッシュ - CIDR表記](https://networkengineering.stackexchange.com/questions/3697/the-slash-after-an-ip-address-cidr-notation)
- [プライベートIPv4アドレスにはなぜ3つの範囲があるのですか?](https://networkengineering.stackexchange.com/questions/32119/why-are-there-3-ranges-of-private-ipv4-addresses)
- [IP計算機](http://jodies.de/ipcalc)
</details>
<details>
<summary><b>一般的なHTTPステータスコードにはどのようなものがありますか?</b></summary><br>
- **1xx** - 情報応答 - 転送プロトコルレベルの情報を伝達します
- **2xx** - 成功 - クライアントのリクエストが正常に受け入れられたことを示します
- **3xx** - リダイレクト - クライアントがリクエストを完了するために追加のアクションを取る必要があることを示します
- **4xx** - クライアント側エラー - このカテゴリのエラーステータスコードはクライアントに責任があることを示します
- **5xx** - サーバー側エラー - サーバーがこれらのエラーステータスコードの責任を負います
参考資料:
- [HTTPステータスコード](https://httpstatuses.com/)
</details>
###### DevOpsに関する質問 (5)
<details>
<summary><b>DevOpsとは何ですか?DevOpsコミュニティの成功にとって、人々のコミュニケーション方法と導入するツールのどちらがより重要ですか? ***</b></summary><br>
**DevOps** とは、開発と運用の両方のタスクに携わる結束力のあるチーム、または非常に密接に連携する個別の運用チームと開発チームのことを指します。他の部門と協力して共通の目標を達成するための「方法」のようなものです。
</details>
<details>
<summary><b>バージョン管理とは何ですか?あなたのコミットメッセージは見栄えが良いですか?</b></summary><br>
これは、時間の経過に伴うファイルまたはファイルセットへの変更を記録し、後で特定のバージョンを呼び出せるようにするシステムです。バージョン管理システムは、チームメイトがファイルまたはファイルセットへの変更をコミットできる中央共有リポジトリで構成されます。その後、バージョン管理の用途について言及できます。
バージョン管理を使用すると、以下のことが可能です:
- ファイルを以前の状態に戻す
- プロジェクト全体を以前の状態に戻す
- 時間の経過に伴う変更を比較する
- 問題の原因となる可能性のある最後の変更者を確認する
- 誰がいつ問題を導入したかを確認する
優れたコミットメッセージの7つのルール:
- 件名と本文を空白行で区切る
- 件名行を50文字以内に制限する
- 件名行を大文字で始める
- 件名行をピリオドで終わらせない
- 件名行には命令形を使用する
- 本文を72文字で折り返す
- 本文では「どのように」ではなく「何を」「なぜ」を説明する
参考資料:
- [はじめに - バージョン管理について(原文)](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control)
</details>
<details>
<summary><b>基本的な <code>git</code> コマンドをいくつか説明してください。</b></summary><br>
- `git init` - 新しいローカルリポジトリを作成する
- `git commit -m "message"` - 変更をHEADにコミットする
- `git status` - `git add` で追加したファイルを一覧表示し、その後変更されたファイルもコミットする
- `git push origin master` - 変更をリモートリポジトリの master ブランチに送信する
</details>
<details>
<summary><b>簡単な継続的インテグレーションパイプラインを説明してください。</b></summary><br>
- リポジトリのクローン
- デプロイステージ(QA)
- テスト環境(QA)
- デプロイステージ(PROD)
</details>
<details>
<summary><b>基本的な <code>docker</code> コマンドをいくつか説明してください。</b></summary><br>
- `docker ps` - 実行中のコンテナを表示する
- `docker ps -a` - すべてのコンテナを表示する
- `docker images` - Dockerイメージを表示する
- `docker logs <container-id|container-name>` - コンテナからログを取得する
- `docker network ls` - すべてのDockerネットワークを表示する
- `docker volumes ls` - すべてのDockerボリュームを表示する
- `docker exec -it <container-id|container-name> bash` - インタラクティブシェルでコンテナ内のbashを実行する
</details>
###### サイバーセキュリティに関する質問 (1)
<details>
<summary><b>セキュリティ設定ミスとは何ですか?</b></summary><br>
**セキュリティ設定ミス** は、デバイス/アプリケーション/ネットワークが、攻撃者に悪用される可能性のある方法で設定されている場合の脆弱性です。これは、デフォルトのユーザー名/パスワードを変更しない、またはデバイスアカウントなどにあまりにも単純な設定を残すといった単純なことでも発生します。
</details>
### :diamond_shape_with_a_dot_inside: <a name="regular-sysadmin">一般システム管理者</a>
###### システムに関する質問 (60)
<details>
<summary><b>本番環境での経験について教えてください。 ***</b></summary><br>
記入予定。
</details>
<details>
<summary><b>主要なWebサーバーを実行するためにどのディストリビューションを選びますか? ***</b></summary><br>
記入予定。
</details>
<details>
<summary><b>Linuxシステムのブートプロセスをいくつかのポイントで説明してください。</b></summary><br>
**BIOS**: BIOSはBasic Input/Output Systemの略で、整合性チェックを実行し、ブートローダーを検索してロードし、実行します。
**ブートローダー**: 初期段階はオペレーティングシステムに固有ではないため、x86およびx86-64アーキテクチャのBIOSベースのブートプロセスは、マスターブートレコード(MBR)コードがリアルモードで実行され、ファーストステージブートローダーがロードされるときに開始されると考えられます。UEFIシステムでは、Linuxカーネルなどのペイロードを直接実行できます。したがって、ブートローダーは不要です。一般的なブートローダー:**GRUB**、**Syslinux/Isolinux**、**Lilo**。
**カーネル**: Linuxのカーネルは、メモリ管理、タスクスケジューリング、I/O、プロセス間通信、システム全体の制御など、すべてのオペレーティングシステムプロセスを処理します。これは2段階でロードされます。最初の段階では、カーネル(圧縮イメージファイルとして)がメモリにロードされて展開され、基本的なメモリ管理などのいくつかの基本機能が設定されます。
**Init**: システム上のすべてのプロセスの親であり、カーネルによって実行され、他のすべてのプロセスを開始する責任があります。
- `SysV init` - initの役割は、「カーネルが完全に実行されたら、すべてが正常に動作するようにすること」です。基本的にユーザースペース全体を確立し、操作します。これにはファイルシステムのチェックとマウント、必要なユーザーサービスの開始、システム起動完了時のユーザー環境への最終的な切り替えが含まれます。
- `systemd` - systemdの開発者は、Unix System Vから継承されたLinux initシステムを置き換えることを目指しました。initと同様に、systemdは他のデーモンを管理するデーモンです。systemdを含むすべてのデーモンはバックグラウンドプロセスです。Systemdは(起動時に)最初に起動するデーモンであり、(シャットダウン時に)最後に終了するデーモンです。
- `runinit` - runinitはUnix系オペレーティングシステム用のinitスキームであり、オペレーティングシステム全体でプロセスを初期化、監視、終了します。これは、Linux、Mac OS X、*BSD、Solarisオペレーティングシステムで動作するdaemontoolsプロセス監視ツールキットの再実装です。
参考資料:
- [Linuxブートプロセスの分析](https://opensource.com/article/18/1/analyzing-linux-boot-process)
- [Systemd Boot Process a Close Look in Linux](https://linoxide.com/linux-how-to/systemd-boot-process/)
</details>
<details>
<summary><b>Linuxデーモンはどのように、そしてなぜ特権を放棄するのですか?一部のデーモンが起動時にroot権限を必要とするのはなぜですか?説明してください。 ***</b></summary>
記入予定。
</details>
<details>
<summary><b>シングルコアマシンで負荷1.00が理想的でないのはなぜですか?</b></summary><br>負荷1.00の問題は、余裕がないことです。実際には、多くのシステム管理者は0.70を一つの目安としています。
「調査が必要」の経験則: 0.70 負荷平均が0.70を超えて続いている場合、状況が悪化する前に調査を開始すべきです。
「今すぐ修正」の経験則: 1.00 負荷平均が1.00を超えて続いている場合、問題を見つけてすぐに修正しましょう。そうしないと、夜中に起こされることになり、楽しいものではありません。
経験則: 5.0 負荷平均が5.00を超えている場合、深刻な問題に直面している可能性があります。マシンがハングアップしているか、大幅に速度が低下しており、これは(不可解にも)夜中やカンファレンスでプレゼンテーション中など、最も悪いタイミングで発生します。そうなる前に防ぎましょう。
参考リソース:
- [Proper way of interpreting system load on a 4 core 8 thread processor](https://serverfault.com/questions/618130/proper-way-of-interpreting-system-load-on-a-4-core-8-thread-processor)
- [Understanding Linux CPU Load - when should you be worried?](http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages)
</details>
<details>
<summary><b>実効ユーザーがrootなのに、実ユーザーIDが自分の名前のままである場合はどういう意味ですか?</b></summary><br>
**実ユーザーID**は、あなたが実際に誰であるか(プロセスを所有するユーザー)であり、**実効ユーザーID**は、オペレーティングシステムが何かを行うことを許可するかどうかを判断する際に参照するものです(ほとんどの場合、いくつかの例外があります)。
ログインすると、ログインシェルは**実ユーザーID**と**実効ユーザーID**の両方を、パスワードファイルが提供する同じ値(あなたの**実ユーザーID**)に設定します。
例えば、setuidを実行し、別のユーザー(例: **root**)として実行されるだけでなく、setuidプログラムがあなたに代わって何かを行う場合を考えます。
setuidを実行すると、プログラムはあなたの**実ID**(あなたがプロセス所有者であるため)と、ファイル所有者の実効ユーザーID(例えば**root**、setuidであるため)を持ちます。
`passwd`の場合を考えてみましょう:```bash
-rwsr-xr-x 1 root root 45396 may 25 2012 /usr/bin/passwd
```
user2がパスワードを変更したい場合、`/usr/bin/passwd` を実行します。
**RUID** は user2 になりますが、そのプロセスの **EUID** は root になります。
user2は自分のパスワードを変更するためにのみ passwd を使用できます。内部的に passwd は **RUID** をチェックし、rootでない場合、その動作は実ユーザーのパスワードに制限されるためです。
passwd の場合、プロセスが `/etc/passwd` や `/etc/shadow` に書き込む必要があるため、**EUID** が root になることが必要です。
参考リソース:
- [Real User ID、Effective User ID、Saved User IDの違い(原文)](https://stackoverflow.com/questions/30493424/what-is-the-difference-between-a-process-pid-ppid-uid-euid-gid-and-egid)
- [pid、ppid、uid、euid、gid、egidの違いは?](https://stackoverflow.com/questions/30493424/what-is-the-difference-between-a-process-pid-ppid-uid-euid-gid-and-egid)
</details>
<details>
<summary><b>開発者が大量のログファイルを生成するcronジョブを追加しました。それらが肥大化するのを防ぐにはどうすればよいですか?</b></summary><br>
ログファイルを扱う通常の方法は `logrotate` を使用することです。ただし、`/etc/logrotate.conf` に内容を追加するのではなく、独自のジョブを `/etc/logrotate.d/` に追加するべきです。そうしないと、リリースアップグレード時に設定ファイルの差分を多く確認する必要があります。
ファイルに活発に書き込みが行われている場合、切り詰め(truncate)によってできることはほとんどありません。唯一の選択肢はファイルを切り詰めることです:```bash
: >/var/log/massive-logfile
```
非常に便利です。プロセスを中断せずにファイルを切り詰めることができるためです。
役立つリソース:
- [ログローテートを使用してログファイルを管理する方法](https://www.linode.com/docs/uptime/logs/use-logrotate-to-manage-log-files/)
- [システムログ記録](https://www.ibm.com/developerworks/library/l-lpic1-108-2/index.html)
</details>
<details>
<summary><b>Linuxカーネルはシステム内のプロセスをどのように作成、管理、削除するのですか? ***</b></summary><br>
未完成。
役立つリソース:
- [Linuxプロセス](https://www.tldp.org/LDP/tlk/kernel/processes.html)
</details>
<details>
<summary><b><code>top</code>および<code>htop</code>で確認できる特定の情報について説明してください。これらのツールを使用して負荷、高いユーザー時間、メモリ不足の問題を診断する方法は? ***</b></summary><br>
未完成。
役立つリソース:
- [topを視覚的に解説](https://www.svennd.be/top-explained-visually/)
- [htopを視覚的に解説](https://codeahoy.com/2017/01/20/hhtop-explained-visually/)
- [Linuxのhtop/topで確認できるすべての項目の説明](https://peteris.rocks/blog/htop/)
</details>
<details>
<summary><b>リソースを占有しているプロセスをどのように見分けますか? </b></summary><br>
`top`は正しい数値を見ていれば、適切に機能します。
- **M** 現在の常駐メモリ使用量でソート
- **T** 合計(または累積)CPU使用率でソート
- **P** 現在のCPU使用率でソート(これがデフォルトの更新)
- **?** すべてのtopコマンドの使用法の概要を表示
これは、コンピュータのプロセスが遅く動作している問題を解決する際や、どのプロセスを強制終了/どのソフトウェアをアンインストールするかを決定する際に得られる非常に重要な情報です。
役立つリソース:
- [マシンを占有しているプロセスを見つける方法](https://superuser.com/questions/326300/how-to-find-the-processes-which-are-hogging-the-machine)
</details>
<details>
<summary><b>200台のサーバーで<code>ntpd</code>サービスをアップグレードする必要があります。これらすべてを最新バージョンにアップグレードする最善の方法は?</b></summary><br>
**Infrastructure as Code**アプローチを使用することで、いくつかの優れた方法があります。
1. **構成同期変更管理モデル**:
構成管理ツール(Ansible、Chef、Puppet、Saltstackなど)を使用して、すべてのサーバーの`ntpd`サービスを自動的に更新できます。システムを安定に保つために、サーバーのシステムパッケージは通常、セキュリティ更新のみで自動更新されます。パッケージのメジャーバージョンまたはマイナーバージョンは、サービスの設定ミスを防ぐために、構成定義内で通常バージョンロックされます。変更は、構成定義内の`ntpd`バージョンを変更することで展開されます。
このアプローチでは、インフラストラクチャ全体に変更を大量に展開する際に注意することが重要です。展開パイプラインには単体テスト、統合テスト、システムテストを含め、最終的には最初にステージング環境に展開して構成を検証する必要があります。テストが構成の正しさを証明した場合、展開は段階的なロールアウトで行い、エラーや障害が発生した場合のロールバック機能を備えるべきです。
2. **イミュータブルサーバーモデル**:
イミュータブルサーバーモデルでは、実行中のサーバーに変更を加えるのではなく、サーバー全体(またはコンテナ)を新しい更新されたイメージに置き換えます(これにより構成ドリフトが排除されます)。このアプローチでは通常、PackerやDocker(Dockerfileを使用)などのツールを使用してサーバーイメージを構築します。このイメージは、上記のオプション(1.)と同様にテストおよび展開されますが、今回はカナリアリリースなどの手法を使用し、これも段階的なロールアウトとロールバック機能を備えています。
役立つリソース:
- [Infrastructure as a Code - 第8章: サーバーの更新と変更のパターン](http://shop.oreilly.com/product/0636920039297.do)
</details>
<details>
<summary><b>Linux/Unixで<code>$PATH</code>を永続的に設定するにはどうすればよいですか?なぜこの変数はそれほど重要なのでしょうか? ***</b></summary>
未完成。
</details>
<details>
<summary><b>サーバーの起動時にコンソールにいくつかのエラーが表示されます。ブートメッセージを確認する方法と、それらはどこに保存されていますか?</b></summary><br>
コンソールには2種類のメッセージがあります。
- **カーネルによって生成されたもの**(printkを介して)
- **ユーザースペースによって生成されたもの**(通常はinitシステム)
カーネルメッセージは常に**kmsg**バッファに保存され、`dmesg`コマンドで確認できます。また、多くの場合**syslog**にコピーされます。これは、`/dev/kmsg`に書き込まれるユーザースペースメッセージにも当てはまりますが、これらはかなりまれです。
一方、ユーザースペースが派手なブートステータステキストを`/dev/console`や`/dev/tty1`に書き込む場合、それはどこにも保存されません。画面に表示されるだけで終わりです。
`dmesg`は、カーネルリングバッファに含まれるブートメッセージを確認するために使用されます。リングバッファは固定サイズのバッファで、新しいデータが追加されると最も古いデータが上書きされます。
これにより、ブートプロセスが完了した後の操作が表示されます。たとえば、カーネルに渡されたコマンドラインオプション、検出されたハードウェアコンポーネント、新しいUSBデバイスが追加されたときのイベント、NIC(ネットワークインターフェースカード)の障害やドライバがネットワーク上でリンクアクティビティが検出されなかったことを報告するなどのエラーなど、さまざまな情報が表示されます。
システムログ記録がjournalコンポーネントを介して行われている場合は、`journalctl`を使用する必要があります。これにより、カーネルおよびブートメッセージ、syslogやさまざまなサービスからのメッセージなどが表示されます。
ブートの問題やエラーが発生した場合、システム管理者は特定のコマンドとともにいくつかの重要なファイルを調査する必要があります(Linuxのバージョンによって扱いが異なります)。
- `/var/log/boot.log` - システムブートログ。システム起動中に発生したすべての内容が含まれます。
- `/var/log/messages` - グローバルなシステムメッセージを保存します。これにはシステムブート中に記録されたメッセージも含まれます。
- `/var/log/dmesg` - カーネルリングバッファ情報が含まれます。
役立つリソース:
- [ブート後のLinuxですべてのブートメッセージを表示する方法(原文)](https://superuser.com/questions/1188407/how-to-view-all-boot-messages-in-linux-after-booting)
- [/var/log/{syslog,dmesg,messages}ログファイルの違い](https://superuser.com/questions/565927/differences-in-var-log-syslog-dmesg-messages-log-files)
- [Debianシステムの起動時にスクロール表示されるメッセージを後で確認する方法](https://serverfault.com/questions/516411/all-debian-boot-messages)
</details>
<details>
<summary><b>スワップ使用率が高すぎます。この原因と、スワッピングの問題を解決する方法は?</b></summary><br>
**スワップ**領域は、使用可能なメモリが完全に利用された場合にオペレーティングシステムが使用するために割り当てられた、制限された量の物理メモリです。これは、メモリのセクションを物理ストレージとの間でスワップすることを伴うメモリ管理です。
システムがより多くのメモリリソースを必要とし、RAMがいっぱいになると、メモリ内の非アクティブなページがスワップ領域に移動されます。スワップ領域はRAMが少ないマシンに役立ちますが、RAMの代わりと見なすべきではありません。**スワップ**領域はハードドライブにあり、物理メモリよりもアクセス時間が遅くなります。
ワークロードがRAMの需要を増加させます。より多くのメモリを必要とするワークロードを実行しています。スワップ全体の使用はそれを示しています。また、`swappiness`を**1**に変更するのは賢明な判断ではないかもしれません。`swappiness`を**1**に設定しても、スワッピングが行われないことを意味するわけではありません。これはカーネルがスワッピングに関してどれだけ積極的になるかを示すだけで、スワッピングを排除するものではありません。必要であればスワッピングは発生します。
- **スワップ領域のサイズを増やす** - まず、ディスク使用量が増加します。ディスクの速度が十分でない場合、システムがスラッシングを起こし、メモリとの間でデータがスワップされるたびに速度低下が発生する可能性があります。これによりボトルネックが発生します。
- **RAMを追加する** - 本当の解決策はメモリを追加することです。RAMに代わるものはなく、十分なメモリがあればスワップは少なくなります。
スワップ領域の使用状況を監視するには:
- `cat /proc/swaps` - 合計および使用中のスワップサイズを確認
- `grep SwapTotal /proc/meminfo` - 合計スワップ領域を表示
- `free` - 空きおよび使用中のシステムメモリ(スワップも含む)の量を表示
- `vmstat` - スワッピング統計を確認
- `top`、`htop` - スワップ領域の使用状況を確認
- `atop` - システムがメモリをオーバーコミットしているかどうかを表示
- または、ワンライナーのシェルコマンドを使用して、すべてのアプリケーションが使用しているスワップ領域のサイズをキロバイト単位でリスト表示:```bash
for _fd in /proc/*/status ; do
awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $_fd
done | sort -k 2 -n -r | less
```
役立つリソース:
- [Linux ate my ram!](https://www.linuxatemyram.com/)
- [How to find out which processes are using swap space in Linux?](https://stackoverflow.com/questions/479953/how-to-find-out-which-processes-are-using-swap-space-in-linux)
- [8 Useful Commands to Monitor Swap Space Usage in Linux](https://www.tecmint.com/commands-to-monitor-swap-space-usage-in-linux/)
- [What is the danger in having a fully used SWAP in an Ubuntu server?](https://serverfault.com/questions/499301/what-is-the-danger-in-having-a-fully-used-swap-in-an-ubuntu-server)
- [How to empty swap if there is free RAM?](https://askubuntu.com/questions/1357/how-to-empty-swap-if-there-is-free-ram)
</details>
<details>
<summary><b>umaskとは?ユーザーに対して永続的に設定する方法は?</b></summary><br>
Linuxや他のUnix系オペレーティングシステムでは、新しいファイルはデフォルトのパーミッションセットで作成されます。具体的には、新しいファイルのパーミッションは、`umask`と呼ばれるパーミッション「マスク」を適用することで特定の方法で制限される場合があります。`umask`コマンドは、このマスクを設定したり、現在の値を表示したりするために使用されます。
永続的に変更する(例:`umask 02`を設定する)方法:
- `~/.profile`
- `~/.bashrc`
- `~/.zshrc`
- `~/.cshrc`
役立つリソース:
- [What is Umask and How To Setup Default umask Under Linux?](https://www.cyberciti.biz/tips/understanding-linux-unix-umask-value-usage.html)
</details>
<details>
<summary><b>次のumask値(000, 002, 022, 027, 077, 277)の違いを説明してください。</b></summary><br>
<table style="width:100%">
<tr>
<th>Umask</th>
<th>ファイルの結果</th>
<th>ディレクトリの結果</th>
</tr>
<tr>
<td>000</td>
<td>666 rw- rw- rw-</td>
<td>777 rwx rwx rwx</td>
</tr>
<tr>
<td>002</td>
<td>664 rw- rw- r--</td>
<td>775 rwx rwx r-x</td>
</tr>
<tr>
<td>022</td>
<td>644 rw- r-- r--</td>
<td>755 rwx r-x r-x</td>
</tr>
<tr>
<td>027</td>
<td>640 rw- r-- ---</td>
<td>750 rwx r-x ---</td>
</tr>
<tr>
<td>077</td>
<td>600 rw---- ---</td>
<td>700 rwx --- ---</td>
</tr>
<tr>
<td>277</td>
<td>400 r-- --- ---</td>
<td>500 r-x --- ---</td>
</tr>
</table>
役立つリソース:
- [What is Umask and How To Setup Default umask Under Linux?](https://www.cyberciti.biz/tips/understanding-linux-unix-umask-value-usage.html)
</details>
<details>
<summary><b>シンボリックリンクとハードリンクの違いは何ですか?</b></summary><br>
ファイルシステムの下では、ファイルはinode(あるいは複数のinodeかは定かではない)によって表されます。
- ファイルシステム内のファイルは、基本的にinodeへのリンクです。
- ハードリンクは、同じ基盤となるinodeへのリンクを持つ別のファイルを作成するだけです。
ファイルを削除すると、基盤となるinodeへのリンクが1つ削除されます。inodeへのリンクがすべて削除された場合にのみ、inodeは削除(または削除可能/上書き可能)されます。
- シンボリックリンクは、ファイルシステム内の別の名前へのリンクです。
ハードリンクが作成されると、リンクはinodeに対して行われます。元のファイルを削除、名前変更、または移動しても、ハードリンクは基盤となるinodeにリンクしているため影響を受けません。inode上のデータへの変更は、そのinodeを参照するすべてのファイルに反映されます。
注:ハードリンクは同じファイルシステム内でのみ有効です。シンボリックリンクは、単に別のファイルの名前であるため、ファイルシステムをまたぐことができます。
違い:
- **ハードリンク**はディレクトリに対して作成できません。ハードリンクはファイルに対してのみ作成できます。
- **ソフトリンク**(シンボリックリンクまたはシムリンクとも呼ばれる)はディレクトリにリンクできます。
役立つリソース:
- [What is the difference between a hard link and a symbolic link?](https://medium.com/@wendymayorgasegura/what-is-the-difference-between-a-hard-link-and-a-symbolic-link-8c0493041b62)
</details>
<details>
<summary><b>スティッキービットはどのように機能しますか?<code>SUID/GUID</code>と同じですか?</b></summary><br>
これはおそらく、人々がよく間違えることについて私が最も苛立つことの1つです。**SUID/GUID**ビットと**スティッキービット**はまったく別のものです。
`man chmod`を実行すると、**SUID**と**スティッキービット**について読むことができます。
**SUID/GUID**
上記のmanページが言おうとしているのは、ユーザーオクタルの`rwxrwxrwx`(最初のrwxグループ)とグループオクタル(2番目のrwxグループ)においてxビットが占める位置が、xが`s`になる追加の状態を取ることができるということです。これが発生すると、このファイル(シェルスクリプトではなくプログラムの場合)は、実行時にファイルの所有者またはグループのパーミッションで実行されます。
つまり、ファイルがrootによって所有されていて**SUID**ビットがオンになっている場合、プログラムはrootとして実行されます。通常のユーザーとして実行しても同様です。**GUID**ビットについても同じことが言えます。
例:
**suid/guidなし** - ビット`rwxr-xr-x`のみが設定されています。```bash
ls -lt b.pl
-rwxr-xr-x 1 root root 179 Jan 9 01:01 b.pl
```
**suid & ユーザーの実行ビット有効 (小文字のs)** - ビット `rwsr-x-r-x` が設定されています。```bash
chmod u+s b.pl
ls -lt b.pl
-rwsr-xr-x 1 root root 179 Jan 9 01:01 b.pl
```
**suid有効かつ実行ビット無効(大文字S)** - ビット `rwSr-xr-x` が設定されています。```bash
chmod u-x b.pl
ls -lt b.pl
-rwSr-xr-x 1 root root 179 Jan 9 01:01 b.pl
```
**guid & グループの実行可能ビットが有効 (小文字 s)** - ビット `rwxr-sr-x` が設定されています。```bash
chmod g+s b.pl
ls -lt b.pl
-rwxr-sr-x 1 root root 179 Jan 9 01:01 b.pl
```
**GUID有効 & 実行ビット無効 (大文字のS)** - ビット `rwxr-Sr-x` が設定されています。```bash
chmod g-x b.pl
ls -lt b.pl
-rwxr-Sr-x 1 root root 179 Jan 9 01:01 b.pl
```
**スティッキービット**
一方、スティッキービットは `t` で示されます。例えば `/tmp` ディレクトリ:```bash
ls -l /|grep tmp
drwxrwxrwt. 168 root root 28672 Jun 14 08:36 tmp
```
このビットは、実際の意味を考えると、常に「制限付き削除ビット」と呼ばれるべきでした。このモードビットが有効になると、ディレクトリ内でユーザーが削除できるのは、自分が所有者であるファイルとディレクトリのみになります。
便利なリソース:
- [スティッキービットはどのように機能しますか?(原文)](https://unix.stackexchange.com/questions/79395/how-does-the-sticky-bit-work)
</details>
<details>
<summary><b>コマンドの前に <code>LC_ALL=C</code> を付けると何が起こりますか?どのような場合に役立ちますか?</b></summary><br>
`LC_ALL` は、他のすべてのローカライゼーション設定を上書きする環境変数です。これにより、すべての `LC_` タイプの変数が一度に指定されたロケールに設定されます。
コマンドの前に `LC_ALL=C` を設定する主な理由は、単純に英語の出力を得るためです(コマンドで使用されるロケールを一般的に変更します)。
一方、`LC_ALL=C` を使用してコマンド実行速度を向上させることも重要です(例:`grep` や `fgrep`)。`LC_ALL=C` ロケールを使用すると、パフォーマンスが向上し、コマンド実行時間が短縮されます。
例えば、`LC_ALL=en_US.utf8` に設定すると、システムは `/usr/lib/locale` ディレクトリから複数のファイルを開きます。`LC_ALL=C` の場合は、最小限のオープンおよび読み取り操作が実行されます。
セッションのすべての通常の(元の)ロケール設定を復元したい場合:```bash
LC_ALL=
```
もし `LC_ALL` が機能しない場合は、`LANG` を試してみてください(それでも機能しない場合は、`LANGUAGE` を試してみてください):```bash
LANG=C date +%A
Monday
```
役立つリソース:
- [LC_ALL=C は何をするのか? (原文)](https://unix.stackexchange.com/questions/87745/what-does-lc-all-c-do)
- [grep検索をLC_ALL=Cで高速化する](https://www.inmotionhosting.com/support/website/ssh/speed-up-grep-searches-with-lc-all)
</details>
<details>
<summary><b>ウェブアプリケーションの高可用性を実現するには? ***</b></summary>
未完成。
</details>
<details>
<summary><b>新しいサーバーを設定しています。その手順の一つとして、アプリケーションディレクトリのパーミッションを設定します。どのような手順を踏み、どのようなミスを避けるべきですか?</b></summary><br>
**1) 主な要件 - これを覚えておくこと**
- アプリのファイルシステムにアクセスできるユーザー
- Webサーバー(例:Apache)やアプリサーバー(例:uwsgi)のパーミッション
- **uploads**、**cache**、およびメインアプリディレクトリ(例:`/var/www/app01/html`)などの特定のディレクトリのパーミッション
- ユーザーに対する正しい `umask` 値と **suid**/**sgid**(特定の状況のみ)
- 将来作成されるすべてのファイルとディレクトリのパーミッション
- cronジョブとスクリプトのパーミッション
**2) アプリケーションディレクトリ**
`/var/www` は各ウェブサイト(アプリの分離)のためのディレクトリを含んでいます。例:`/var/www/app01`、`/var/www/app02````bash
mkdir /var/www/{app01,app02}
```
**3) アプリケーションの所有者とグループ**
各アプリケーションには指定された **所有者**(例:**u01-prod**、**u02-prod**)と **グループ**(例:**g01-prod**、**g02-prod**)があり、これらがウェブサイトのディレクトリ内のすべてのファイルとディレクトリの所有者として設定されています:```bash
chown -R u01-prod:g01-prod /var/www/app01
chown -R u02-prod:g02-prod /var/www/app02
```
**4) 開発者の所有者とグループ**
ウェブサイトを管理するすべてのユーザーは自身のグループを持ち、アプリケーショングループに所属しています:```bash
id alice
uid=2000(alice) gid=4000(alice) groups=8000(g01-prod)
id bob
uid=2001(bob) gid=4001(bob) groups=8000(g01-prod),8001(g02-prod)
```
そのため、**alice** ユーザは `/var/www/app01` に対する標準権限を持ち、**bob** ユーザは `/var/www/app01` と `/var/www/app02` に対する標準権限を持ちます。
**5) ウェブサーバの所有者とグループ**
ウェブサーバによって書き込まれる必要があるファイルやディレクトリには、それぞれ所有者が設定されています。ウェブサーバが Apache の場合、デフォルトの所有者/グループは **apache:apache** または **www-data:www-data** であり、Nginx の場合は **nginx:nginx** になります。これらの設定は変更しないでください。
アプリケーションが **uwsgi** や **php-fpm** のようなアプリケーションサーバと連携する場合、特定の設定ファイルで適切なユーザとグループを設定する必要があります(例: **app01** の場合は **u01-prod:g01-prod** になります)。
**6) パーミッション**
**Access Control Lists** を使用して適切にパーミッションを設定します:```bash
# For web server
setfacl -Rdm "g:apache:rwx" /var/www/app01
setfacl -Rm "g:apache:rwx" /var/www/app01
# For developers
setfacl -Rdm "g:g01-prod:rwx" /var/www/app01
setfacl -Rm "g:g01-prod:rwx" /var/www/app01
```
**SELinux** を使用する場合は、security context について覚えておいてください:```bash
chcon -R system_u:object_r:httpd_sys_content_t /var/www/app01
```
**7) セキュリティ上の誤り**
- ファイルやディレクトリの所有者が **root**
- ウェブサイトディレクトリ内のファイルを **root** が決して実行しない、またその中にファイルを作成すべきでない
- 777 のような広すぎるパーミッションにより、一部の重要なファイルが誰でも書き込み・読み取り可能になっている
- メンテナンススクリプトやその他の重要なファイルを suid root で作成しない
サイトを動かすコードを構成するファイルをサイト自体が変更できるようにすると、誰かがサーバーを乗っ取るのがずっと容易になります。
ファイルアップロードツールは、ユーザーが任意の名前と任意の内容のファイルをアップロードすることを許可します。これにより、ユーザーはメールリレー用のPHPスクリプトをサイトにアップロードし、それを好きな場所に配置して、サーバーを迷惑な商用メールを転送するマシンに変えることができます。このスクリプトは、データベース内のすべてのメールアドレスやその他の個人情報を読み取るためにも使用される可能性があります。
悪意のあるユーザーが任意の名前のファイルをアップロードできるが内容を制御できない場合でも、`index.php`(または他の重要なファイル)を上書きしてサイトを壊すファイルを簡単にアップロードできます。
参考リソース:
- [WWWフォルダにLinuxのパーミッションを設定する方法](https://serverfault.com/questions/124800/how-to-setup-linux-permissions-for-the-www-folder)
- [Linuxウェブサーバーのウェブサイトファイル/フォルダにはどのようなパーミッションを設定すべきか](https://serverfault.com/questions/357108/what-permissions-should-my-website-files-folders-have-on-a-linux-webserver)
- [setgidプログラムのセキュリティ上の落とし穴](https://www.agwa.name/blog/post/security_pitfalls_of_setgid_programs)
</details>
<details>
<summary><b>ランレベル3から <code>telinit 1</code> を実行した場合、initはどのような手順を踏むか?最終的な結果はどうなるか?<code>telinit 6</code> を <code>reboot</code> コマンドの代わりに使用した場合、サーバーは再起動されるか?***</b></summary><br>
未完成。
参考リソース:
- [“telinit 6”を“reboot”コマンドの代わりに使ってコンピュータを再起動すると、どのような違いがあるか?](https://unix.stackexchange.com/questions/434560/what-differences-it-will-make-if-i-use-telinit-6-instead-of-reboot-command)
</details>
<details>
<summary><b>rootパスワードを忘れてしまった!BSDではどうすればいいか?シングルユーザーモードで起動する目的は何か?</b></summary><br>
システムを再起動し、`Boot:` プロンプトで `boot -s` と入力して **シングルユーザーモード** に入ります。
使用するシェルを尋ねられたら `Enter` キーを押すと、`#` プロンプトが表示されます。
`mount -urw /` と入力してルートファイルシステムを読み書き可能で再マウントし、次に `mount -a` を実行してすべてのファイルシステムを再マウントします。
`passwd root` を実行してrootパスワードを変更し、`exit` を実行して起動を続行します。
**シングルユーザーモード**では、基本的にrootアクセスでログインし、ほぼすべての変更が可能です。例えば、破損したマスターデータベースやシステムデータベースを復元する場合、またはサーバー設定オプション(パスワード回復など)を変更する場合にシングルユーザーモードを使用することがあります。
参考リソース:
- [FreeBSDのrootパスワードのリセットまたは復旧方法](https://www.cyberciti.biz/tips/howto-freebsd-reset-recover-root-password.html)
- [シングルユーザーモードの定義](http://www.linfo.org/single_user_mode.html)
</details>
<details>
<summary><b>テキストエディタを起動せずにテキストファイルを変更するにはどうすればよいか?</b></summary><br>
例えば:<br>```bash
# cat >filename ... - overwrite file
# cat >>filename ... - append to file
cat > filename << __EOF__
data
__EOF__
```
</details>
<details>
<summary><b>カーネルパラメータを変更する方法は?調整が必要なカーネルオプションは? ***</b></summary><br>
Unix系でカーネルパラメータを設定するには、まず `/etc/sysctl.conf` ファイルを編集し、変更を加えたらファイルを保存して `sysctl -p` コマンドを実行します。このコマンドでマシンを再起動せずに変更を永続的に適用できます。
便利なリソース:
- [カーネルランタイムパラメータを永続的および非永続的に変更する方法](https://www.tecmint.com/change-modify-linux-kernel-runtime-parameters/)
</details>
<details>
<summary><b><code>/proc</code> ファイルシステムについて説明してください。</b></summary><br>
`/proc` はカーネル、ハードウェア、実行中のプロセスに関する詳細情報を提供する仮想ファイルシステムです。
`/proc` は仮想ファイルを含むため、仮想ファイルシステムと呼ばれます。これらの仮想ファイルには独自の特性があります。そのほとんどはサイズが0バイトとして表示されます。
`/proc/interrupts`、`/proc/meminfo`、`/proc/mounts`、`/proc/partitions` などの仮想ファイルは、システムのハードウェアの最新の状態を提供します。その他: `/proc/filesystems` ファイルや `/proc/sys/` ディレクトリは、システム設定情報とインターフェースを提供します。
便利なリソース:
- [Linuxファイルシステム階層 - /proc](https://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html)
</details>
<details>
<summary><b>データバックアップのプロセスを説明してください。バックアップはどのくらいの頻度でテストすべきですか? ***</b></summary><br>
未完成。
</details>
<details>
<summary><b>ext3/ext4 の3種類のジャーナリングについて説明してください。</b></summary><br>
**ext3/ext4** ファイルシステムでは3種類のジャーナリングが使用できます:
- **Journal** - メタデータとコンテンツがジャーナルに保存される
- **Ordered** - メタデータのみがジャーナルに保存される。コンテンツをディスクに書き込んだ後にのみメタデータがジャーナリングされる。これがデフォルト
- **Writeback** - メタデータのみがジャーナルに保存される。コンテンツがディスクに書き込まれる前または後にメタデータがジャーナリングされる可能性がある
</details>
<details>
<summary><b>inode とは何ですか?ファイルの inode 番号を見つける方法と、その利用方法を教えてください。</b></summary><br>
**inode** は、Linux やその他の Unix 系オペレーティングシステムのファイルシステム上のデータ構造であり、ファイル名と実際のデータを除くファイルに関するすべての情報を保存します。データ構造とは、データを効率的に使用できるように保存する方法です。
Unix ファイルはディスクの2つの異なる部分(データブロックと inode)に保存されます。スーパーブロックやその他の難解な情報には触れません。データブロックにはファイルの「内容」が含まれます。ファイルに関する情報は別の場所、つまり inode に保存されます。
ファイルの inode 番号は、`ls` コマンドに `-i` オプションを付けることで簡単に見つけることができます。`ls` コマンドはデフォルトでカレントディレクトリ(ユーザーが現在作業しているディレクトリ)内のオブジェクト(ファイル、リンク、ディレクトリ)を一覧表示します。例えば、次のコマンドはカレントディレクトリ内の各オブジェクトの名前と inode 番号を表示します:```bash
ls -i
```
`df's` の `-i` オプションは、各ファイルシステムの利用可能な容量ではなく、inodeに関する情報を提供するよう指示します。具体的には、マウントされた各ファイルシステムについて、inodeの総数、空きinode数、使用中inode数、およびinode使用率を返すようdfに指示します。このオプションは、出力を読みやすくするために、以下のように `-h` オプションと一緒に使用できます。```bash
df -hi
```
**inode によるファイルの検索**
inode がわかっている場合、find コマンドを使って見つけることができます:```bash
find . -inum 435304 -print
```
**奇妙な名前のファイルの削除**
ファイル名に奇妙な文字が含まれるファイルが作成されることがあります。Unix ファイルシステムでは、null (ASCII 000) または "/" を除く任意の文字をファイル名の一部として使用できます。他のすべての文字は許可されています。
ユーザーは、ディレクトリやファイルを確認しにくくする文字を含むファイルを作成できます。末尾にスペースを付けたディレクトリ ".. " を作成したり、以下のコマンドを使用して名前にバックスペースが含まれるファイルを作成したりできます。```bash
touch `printf "aa\bb"`
```
では、`ls` コマンドを使用するとどうなるでしょうか:```bash
ls
aa?b
ls | grep 'a'
ab
```
`ls`が結果を端末に送るとき、ファイル名に表示不能文字を示すために"**?**"を配置することに注意してください。
`rm -i *`を使用してこのファイルを削除できます。削除前に各ファイルについて確認が求められます。しかし、inode番号がわかれば、`find`を使用してファイルを削除することもできます。```bash
ls -i
435304 aa?b
find . -inum 435304 -delete
```
参考資料:
- [UNIX/Linux inodeの基礎を例で理解する](https://www.thegeekstuff.com/2012/01/linux-inodes/)
- [POSIXで定義されているinodeとは何か?](https://unix.stackexchange.com/questions/387087/what-is-an-inode-as-defined-by-posix/387093)
</details>
<details>
<summary><b><code>ls -l</code> でファイル属性が疑問符として表示される。その意味と、未使用の「ゾンビ」ファイルを削除するためにどのような手順を踏むか?</b></summary><br>
この問題は解決がより難しいかもしれません。なぜなら、いくつかの手順が必要になることがあるからです。時には `test/file: Permission denied`、`test/file: No such file or directory`、`test/file: Input/output error` が発生します。
これは、ユーザーがファイルに対して `stat()` を実行できない(実行権限が必要)が、ディレクトリエントリを読み取ることはできる(ディレクトリに対する読み取り権限が必要)場合に発生します。つまり、ディレクトリ内のファイル一覧は取得できるが、ファイルを読み取ることができないため、ファイルに関する情報を得られません。読み取り権限はあるが実行権限がないディレクトリがある場合、この現象が確認されます。
| 章の種類 | 質問数 | 簡単な説明 |
|---|
| はじめに | ||
| 🔸 簡単な質問 | 14 問 | リラックスした楽しく簡単な質問で、すべてを始めるのに最適です。 |
| 一般知識 | ||
| 🔸 ジュニアシステム管理者 | 65 問 | 基本的な知識に基づいた、かなり簡単でストレートな質問です。 |
| 🔸 レギュラーシステム管理者 | 94 問 | 十分な知識があることを前提とした中級レベルの質問です。 |
| 🔸 シニアシステム管理者 | 99 問 | 難しい質問と謎かけです。優れた管理者になりたいなら試してみてください。 |
| 秘密の知識 | ||
| 🔸 グルシステム管理者 | 12 問 | グルシステム管理者を知るための非常に深い質問です。 |
CTRL + U、CTRL + E などの編集用キーボードショートカット!* - 最後のコマンドのすべての引数!! - 最後のコマンド全体!ssh - ssh で始まる最後のコマンド役立つリソース:
または```bash grep -e "string1" -e "string2" filename
役立つリソース:
- [grepとは何か、そしてその使い方は?(原文)](https://kb.iu.edu/d/afiy)
</details>
<details>
<summary><b>ファイル内容表示コマンドとその説明について説明してください。</b></summary><br>
- `head`:ファイルの先頭を確認する。
- `tail`:ファイルの末尾を確認する。headコマンドの逆。
- `cat`:ファイルの表示、作成、連結に使用する。
- `more`:ターミナルウィンドウにテキストをページャ形式で表示する。
- `less`:テキストを逆方向に表示でき、一行単位の移動も可能。
役立つリソース:
- [シェルプロンプトからテキストファイルを表示する](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Step_by_Step_Guide/s1-viewingtext-terminal.html)
</details>
<details>
<summary><b>SIGHUP、SIGINT、SIGKILL、SIGTERMのPOSIXシグナルについて説明してください。</b></summary><br>
- **SIGHUP** - 制御端末が閉じられたときにプロセスに送信される。元々はシリアル回線の切断(ハングアップ)をプロセスに通知するために設計された。多くのデーモンはこのシグナルを受信しても終了せず、設定ファイルを再読み込みし、ログファイルを再オープンする。
- **SIGINT** - ユーザーがプロセスを中断したいときに、制御端末からプロセスに送信される。通常は`Ctrl+C`で送信されるが、一部のシステムでは「delete」文字や「break」キーも使用可能。
- **SIGKILL** - プロセスを即座に終了(kill)させるために送信される。**SIGTERM**や**SIGINT**とは異なり、このシグナルは捕捉も無視もできず、受信プロセスは終了時にクリーンアップ処理を実行できない。
- **SIGTERM** - プロセスに終了を要求するために送信される。**SIGKILL**とは異なり、プロセスはこのシグナルを捕捉、解釈、または無視できる。これにより、プロセスは適切にリソースを解放し、状態を保存して正常終了できる。**SIGINT**は**SIGTERM**とほぼ同一である。
役立つリソース:
- [POSIXシグナル](https://dsa.cs.tsinghua.edu.cn/oj/static/unix_signal.html)
- [Unixシグナルプログラミング入門](http://titania.ctie.monash.edu.au/signals/)
</details>
<details>
<summary><b><code>kill</code>コマンドは何をするのですか?</b></summary><br>
UnixおよびUnix系オペレーティングシステムでは、`kill`はプロセスにシグナルを送信するために使用されるコマンドです。デフォルトでは終了シグナルが送信され、プロセスに終了を要求します。しかし、`kill`という名前はやや誤解を招くもので、送信されるシグナルはプロセスの強制終了とは無関係の場合もあります。
役立つリソース:
- [Linuxでの「kill」コマンドを使いこなす](https://www.maketecheasier.com/kill-command-in-linux/)
</details>
<details>
<summary><b><code>rm</code>と<code>rm -rf</code>の違いは何ですか?</b></summary><br>
`rm`は指定されたファイルのみを削除します(ディレクトリは削除しません)。`-rf`オプションを使用すると、以下の通りです:
- `-r`, `-R`, `--recursive`:ディレクトリの内容(隠しファイルやサブディレクトリを含む)を再帰的に削除します
- `-f`, `--force`:存在しないファイルを無視し、プロンプトを表示しません
役立つリソース:
- [`rm -r`と`rm -f`の違いは何ですか?](https://superuser.com/questions/1126206/what-is-the-difference-between-rm-r-and-rm-f)
</details>
<details>
<summary><b><code>grep</code>を再帰的に使用するには?いくつかの例を使って説明してください。***</b></summary>
未完成。
</details>
<details>
<summary><b><code>archive.tgz</code>が約30GBあります。その内容を一覧表示し、1つのファイルだけを抽出するにはどうすればよいですか?</b></summary><br>
</details>```bash
# list of content
tar tf archive.tgz
# extract file
tar xf archive.tgz filename
便利なリソース: