スーパーユーザーなら知っておくべきLinuxシステムの仕組み

2022年3月16日


インプレス


著者:Brian Ward
訳者:柴田芳樹


推薦の言葉
日本語版によせて
謝辞
まえがき

第1章 Linux システムの全体像
1.1 Linuxシステムにおける抽象化のレベルとレイヤ
1.2 ハードウェア:メインメモリの理解
1.3 カーネル
1.3.1 プロセス管理
1.3.2 メモリ管理
1.3.3 デバイスドライバとデバイス管理
1.3.4 システムコールとサポート
1.4 ユーザー空間
1.5 ユーザー
1.6 今後の展望

第2章 基本コマンドとディレクトリ階層
2.1 ボーンシェル(BourneShell):/bin/sh シェルを使う
2.2.1 シェルウィンドウ
2.2.2 cat
2.2.3 標準入力と標準出力
2.3 基本レベルのコマンド
2.3.1 ls
2.3.2 cp
2.3.3 mv
2.3.4 touch
2.3.5 rm
2.3.6 echo
2.4 ディレクトリ操作
2.4.1 cd
2.4.2 mkdir
2.4.3 rmdir
2.4.4 シェルグロブ(ワイルドカード)
2.5 中級レベルのコマンド
2.5.1 grep
2.5.2 less
2.5.3 pwd
2.5.4 diff
2.5.5 file
2.5.6 findとlocate
2.5.7 headとtail
2.5.8 sort
2.6 パスワードとシェルの変更
2.7 ドットファイル
2.8 環境変数とシェル変数
2.9 コマンドパス
2.10 特殊文字
2.11 コマンドラインの編集
2.12 テキストエディタ
2.13 オンラインヘルプ
2.14 シェルの入出力
2.14.1標準エラー
2.14.2 標準入力のリダイレクト
2.15 エラーメッセージの理解
2.15.1 Unixエラーメッセージの構造
2.15.2 一般的なエラー
2.16 プロセスの一覧表示と操作
2.16.1 psコマンドのオプション
2.16.2 プロセスの終了
2.16.3ジョブ制御
2.16.4 バックグラウンドプロセス
2.17 ファイルのモードとパーミッション
2.17.1 パーミッションの変更
2.17.2 シンボリックリンクの操作
2.18 ファイルのアーカイブと圧縮
2.18.1 gzip
2.18.2 tar
2.18.3 圧縮アーカイブ(.tar.gz)
2.18.4 zcat
2.18.5 その他の圧縮ユーティリティ
2.19 Linuxディレクトリ階層の概要
2.19.1 ルートの他のサブディレクトリ
2.19.2 /usrディレクトリ
2.19.3 カーネルの場所
2.20 スーパーユーザーとしてコマンドを実行
2.20.1 sudo
2.20.2 /etc/sudoers
2.20.3 sudoのログ
2.21 今後の展望

第3章 デバイス
3.1 デバイスファイル
3.2 sysfsデバイスパス
3.3 ddとデバイス
3.4 デバイス名の概要
3.4.1 ハードディスク:/dev/sd*
3.4.2 仮想ディスク:/dev/xvd*、/dev/vd*
3.4.3 不揮発性メモリデバイス:/dev/nvme*
3.4.4 デバイスマッパー:/dev/dm-*、/dev/mapper/*
3.4.5 CDドライブとDVDドライブ:/dev/sr*
3.4.6 PATAハードディスク:/dev/hd*
3.4.7 ターミナル:/dev/tty*、/dev/pts/*、/dev/tty
3.4.8 シリアルポート:/dev/ttyS*、/dev/ttyUSB*、/dev/ttyACM*
3.4.9 パラレルポート:/dev/lp0と/dev/lp1
3.4.10 オーディオデバイス:/dev/snd/*、/dev/dsp、/dev/audio など
3.4.11 デバイスファイルの作成
3.5 udev
3.5.1 devtmpfs
3.5.2 udevdの動作と設定
3.5.3 udevadm
3.5.4 デバイス監視
3.6 詳細:SCSIとLinuxカーネル
3.6.1 USBストレージとSCSI
3.6.2 SCSIとATA
3.6.3 汎用SCSIデバイス
3.6.4 一つのデバイスに対する複数のアクセス方法

第4章 ディスクとファイルシステム
4.1 ディスクデバイスの分割
4.1.1 パーティションテーブルの表示
4.1.2 パーティションテーブルの変更
4.1.3 パーティションテーブルの作成
4.1.4 ディスクとパーティションの形状を知る
4.1.5 ソリッドステートディスクからの読み込み
4.2 ファイルシステム
4.2.1 ファイルシステム種別
4.2.2 ファイルシステムの作成
4.2.3 ファイルシステムのマウント
4.2.4 ファイルシステムのUUID
4.2.5 ディスクバッファリング、キャッシング、ファイルシステム
4.2.6 ファイルシステムのマウントオプション
4.2.7 ファイルシステムの再マウント
4.2.8 /etc/fstabファイルシステムテーブル
4.2.9 /etc/fstabの代替
4.2.10 ファイルシステムの容量
4.2.11 ファイルシステムの検査と修復
4.2.12 特殊目的のファイルシステム
4.3 スワップ領域
4.3.1 ディスクパーティションをスワップ領域として使う
4.3.2 ファイルをスワップ領域として使う
4.3.3 必要なスワップ量を決める
4.4 論理ボリュームマネージャ
4.4.1 LVMの操作
4.4.2 LVMの実装
4.5 今後の展望:ディスクとユーザー空間
4.6 従来のファイルシステムの内部
4.6.1 iノードの詳細とリンクカウント
4.6.2 ブロック割り当て
4.6.3 ユーザー空間でのファイルシステムの操作
第5章 Linuxカーネルの起動の仕組み
5.1 起動メッセージ
5.2 カーネルの初期化と起動オプション
5.3 カーネルのパラメータ
5.4 ブートローダ
5.4.1 ブートローダの処理
5.4.2 ブートローダの概要
5.5 GRUBの紹介
5.5.1 GRUBコマンドラインによるデバイスとパーティションの探索
5.5.2 GRUBの設定
5.5.3 GRUBのインストール
5.6 UEFIセキュアブートの問題
5.7 他のオペレーティングシステムのチェインロード
5.8 ブートローダの詳細
5.8.1 MBR起動
5.8.2 UEFI起動
5.8.3 GRUBの仕組み

第6章 ユーザー空間の開始の仕組み
6.1 initの概要
6.2 initの特定
6.3 systemd
6.3.1 ユニットとユニット種別
6.3.2 起動とユニットの依存関係グラフ
6.3.3 systemdの設定
6.3.4 systemdの操作
6.3.5 systemdのプロセス追跡と同期
6.3.6 systemdの依存関係
6.3.7 systemdのオンデマンドとリソース並列起動
6.3.8 systemd補助コンポーネント
6.4 System Vのランレベル
6.5 System V init
6.5.1 System V init:起動コマンドのシーケンス
6.5.2 System V initのリンクファーム
6.5.3 run-parts
6.5.4 System V initの制御
6.5.5 systemdのSystem V互換性
6.6 システムのシャットダウン
6.7 初期RAMファイルシステム
6.8 緊急起動とシングルユーザーモード
6.9 今後の展望

第7章 システム設定:ロギング、システム時間、バッチジョブ、ユーザー
7.1 システムロギング
7.1.1 ログ設定の確認
7.1.2 ログの検索と監視
7.1.3 ログファイルのローテーション
7.1.4 ジャーナルの保守
7.1.5 システムロギングの詳細
7.2 /etcの構造
7.3 ユーザー管理ファイル
7.3.1 /etc/passwdファイル
7.3.2 特殊なユーザー
7.3.3 /etc/shadowファイル
7.3.4 ユーザーとパスワードの操作
7.3.5 グループでの作業
7.4 gettyとlogin
7.5 時刻の設定
7.5.1 カーネルの時刻表現とタイムゾーン
7.5.2 ネットワークタイム
7.6 cronとタイマーユニットによる繰り返しタスクのスケジューリング
7.6.1 crontabファイルのインストール
7.6.2 システムcrontabファイル
7.6.3 タイマーユニット
7.6.4 cronとタイマーユニットの比較
7.7 atでスケジューリングしたタスクを一度だけ実行
7.7.1 タイマーユニットで同等なもの
7.8 通常ユーザーとして動作するタイマーユニット
7.9 ユーザーアクセスの話題
7.9.1 ユーザーIDとユーザー切り替え
7.9.2 プロセスの所有者、実効UID、実UID、保存UID
7.9.3 ユーザーの識別、認証、権限付与
7.9.4 ユーザー情報を得るためのライブラリの利用
7.10 プラグイン可能認証モジュール
7.10.1 PAM設定
7.10.2 PAM設定構文のヒント
7.10.3 PAMとパスワード
7.11 今後の展望

第8章 プロセスと資源利用の詳細
8.1 プロセスの追跡
8.2 lsofで開いているファイルの検索
8.2.1 lsof出力の読み方
8.2.2 lsofを使う
8.3 プログラム実行とシステムコールのトレース
8.3.1 strace
8.3.2 ltrace
8.4 スレッド
8.4.1 シングルスレッドとマルチスレッドのプロセス
8.4.2 スレッドの表示
8.5 資源監視の概要
8.5.1 CPU時間の計測
8.5.2 プロセスの優先順位の調整
8.5.3 ロードアベレージによるCPU性能の測定
8.5.4 メモリ状態の監視
8.5.5 vmstatによるCPUとメモリの性能監視
8.5.6 I/O監視
8.5.7 pidstatによるプロセスごとの監視
8.6 コントロールグループ(cgroup)
8.6.1 cgroupの各バージョンの違い
8.6.2 cgroupの表示
8.6.3 cgroupの操作と作成
8.6.4 資源使用状況の表示
8.7 その他の話題

第9章 ネットワークとその設定の理解
9.1 ネットワークの基礎
9.2 パケット
9.3 ネットワークレイヤ
9.4 インターネットレイヤ
9.4.1 IPアドレスの表示
9.4.2 サブネット
9.4.3 一般的なサブネットマスクとCIDR表記
9.5 ルートとカーネルのルーティングテーブル
9.6 デフォルトゲートウェイ
9.7 IPv6アドレスとネットワーク
9.7.1 システムのIPv6設定の表示
9.7.2 デュアル・スタック・ネットワークの設定
9.8 ICMPとDNSの基本ツール
9.8.1 ping
9.8.2 DNSとホスト
9.9 物理レイヤとイーサネット
9.10 カーネル・ネットワーク・インタフェースの理解
9.11 ネットワークインタフェースの設定方法
9.11.1 手作業でのインタフェース設定
9.11.2 経路を手作業で追加および削除
9.12 自動起動ネットワーク設定
9.13 手作業と自動起動ネットワーク設定の問題点
9.14 ネットワーク設定マネージャ
9.14.1 NetworkManagerの操作
9.14.2 NetworkManagerとのやり取り
9.14.3 NetworkManagerの設定
9.15 ホスト名の解決
9.15.1 /etc/hosts
9.15.2 resolv.conf
9.15.3 キャッシュとゼロコンフィギュレーションDNS
9.15.4 /etc/nsswitch.conf
9.16 localhost
9.17 トランスポートレイヤ:TCP、UDP、サービス
9.17.1 TCPポートとコネクション
9.17.2 UDP
9.18 再訪:簡単なローカルネットワーク
9.19 DHCPの理解
9.19.1 LinuxDHCPクライアント
9.19.2 LinuxDHCPサーバ
9.20 IPv6ネットワークの自動設定
9.21 ルーターとしてのLinuxの設定
9.22 プライベートネットワーク(IPv4)
9.23 ネットワークアドレス変換(IPマスカレード)
9.24 ルーターとLinux
9.25 ファイアウォール
9.25.1 Linuxファイアウォールの基礎
9.25.2 ファイアウォール規則の設定
9.25.3 ファイアウォール戦略
9.26 イーサネット、IP、ARP、NDP
9.27 無線イーサネット
9.27.1 iw
9.27.2 無線セキュリティ
9.28 まとめ

第10章 ネットワークのアプリケーションとサービス
10.1 サービスの基本
10.2 詳しく調べる
10.3 ネットワークサーバ
10.3.1 セキュアシェル
10.3.2 sshdサーバ
10.3.3 fail2ban
10.3.4 SSHクライアント
10.4 systemd以前のネットワーク接続サーバ:inetd/xinetd
10.5 診断ツール
10.5.1 lsof
10.5.2 tcpdump
10.5.3 netcat
10.5.4 ポートスキャン
10.6 リモート・プロシージャ・コール
10.7 ネットワークセキュリティ
10.7.1 典型的な脆弱性
10.7.2 セキュリティ関連資料
10.8 今後の展望
10.9 ネットワークソケット
10.10 Unixドメインソケット

第11章 シェルスクリプトの概要
11.1 シェルスクリプトの基本
11.1.1 シェルスクリプトの限界
11.2 クォートとリテラル
11.2.1 リテラル
11.2.2 シングルクォート
11.2.3 ダブルクォート
11.2.4 リテラルのシングルクォート
11.3 特殊変数
11.3.1 個別の引数:$1、$2など
11.3.2 引数の数:$#
11.3.3 すべての引数:$@
11.3.4 スクリプト名:$0
11.3.5 プロセスID:$$
11.3.6 終了コード:$?
11.4 終了コード
11.5 条件文
11.5.1 パラメータのリストが空の場合の対処法
11.5.2 その他のテスト用コマンド
11.5.3 elif
11.5.4 論理構文
11.5.5 テスト条件
11.5.6 case
11.6 ループ
11.6.1 forループ
11.6.2 whileループ
11.7 コマンド置換
11.8 一時的なファイルの管理
11.9 ヒアドキュメント
11.10 重要なシェルスクリプトのユーティリティ
11.10.1 basename
11.10.2 awk
11.10.3 sed
11.10.4 xargs
11.10.5 expr
11.10.6 exec
11.11 サブシェル
11.12 スクリプトに他のファイルを取り込む
11.13 ユーザー入力の読み込み
11.14 シェルスクリプトを使うとき(使わないとき)

第12章 ネットワークでのファイル転送と共有
12.1 素早いコピー
12.2 rsync
12.2.1 rsyncを始める
12.2.2 ディレクトリ構造の正確なコピー
12.2.3 末尾のスラッシュの利用
12.2.4 ファイルとディレクトリの除外
12.2.5 転送の確認、保護の追加、冗長モードの使用
12.2.6 データの圧縮
12.2.7 帯域幅の制限
12.2.8 自分のコンピュータへのファイル転送
12.2.9 その他のrsyncの話題
12.3 ファイル共有の概要
12.3.1 ファイル共有の利用状況と性能
12.3.2 ファイル共有のセキュリティ
12.4 Sambaによるファイル共有
12.4.1サーバ設定
12.4.2 サーバのアクセス制御
12.4.3パスワード
12.4.4 手作業によるサーバの起動
12.4.5 診断とログファイル
12.4.6 ファイル共有の設定
12.4.7 ホームディレクトリ
12.4.8 プリンタの共有
12.4.9 Sambaクライアント
12.5 SSHFS
12.6 NFS
12.7 クラウドストレージ
12.8 ネットワークファイル共有の現状

第13章 ユーザー環境
13.1 スタートアップファイルの作成ガイドライン
13.2 スタートアップファイルを変更するとき
13.3 シェルのスタートアップファイルの要素
13.3.1 コマンドパス
13.3.2 マニュアルページのパス
13.3.3プロンプト
13.3.4エイリアス
13.3.5 パーミッションマスク
13.4 スタートアップファイルの順序と例
13.4.1 bashシェル
13.4.2 tcshシェル
13.5 デフォルトのユーザー設定
13.5.1 シェルのデフォルト
13.5.2 エディタ
13.5.3 ページャ
13.6 スタートアップファイルの落とし穴
13.7 さらなるスタートアップの話題

第14章 Linux デスクトップと印刷の概要
14.1 デスクトップのコンポーネント
14.1.1 フレームバッファ
14.1.2 Xウィンドウシステム
14.1.3 Wayland
14.1.4 ウィンドウマネージャ
14.1.5 ツールキット
14.1.6 デスクトップ環境
14.1.7 アプリケーション
14.2 WaylandとXのどちらを使っているのか
14.3 Waylandを知る
14.3.1 コンポジット型ウィンドウマネージャ
14.3.2 libinput
14.3.3 WaylandでのX互換性
14.4 Xウィンドウシステムを知る
14.4.1 ディスプレイマネージャ
14.4.2 ネットワーク透過性
14.4.3 Xクライアントの探求方法
14.4.4 Xイベント
14.4.5 X入力と環境設定
14.5 D-Bus
14.5.1 システムとセッションのインスタンス
14.5.2 D-Busメッセージの監視
14.6 印刷
14.6.1 CUPS
14.6.2 フォーマット変換とプリントフィルタ
14.7 その他のデスクトップに関する話題

最15章 開発ツール
15.1 Cコンパイラ
15.1.1 複数のソースファイルをコンパイル
15.1.2 ライブラリをリンクする
15.1.3 共有ライブラリの利用
15.1.4 ヘッダー(インクルード)ファイルとディレクトリの扱い
15.2 make
15.2.1 Makefileのサンプル
15.2.2 組み込みルール
15.2.3 最終的なプログラムのビルド
15.2.4 依存関係の更新
15.2.5 コマンドラインの引数とオプション
15.2.6 標準マクロと変数
15.2.7 標準的なターゲット
15.2.8 Makefileの構成
15.3 LexとYacc
15.4 スクリプト言語
15.4.1 Python
15.4.2Perl
15.4.3 他のスクリプト言語
15.5 Java
15.6 今後の展望:パッケージのコンパイル

第16章 Cソースコードからのソフトウェアのコンパイル
16.1 ソフトウェアのビルドシステム
16.2 Cソースパッケージの展開
16.3 GNUautoconf
16.3.1 autoconfの例
16.3.2 パッケージングツールを使ったインストール
16.3.3 configureスクリプトのオプション
16.3.4 環境変数
16.3.5 autoconfのターゲット
16.3.6 autoconfのログファイル
16.3.7 pkg-config
16.4 インストールの実践
16.4.1 インストールする場所
16.5 パッチを適用
16.6 コンパイルとインストールのトラブル解決
16.6.1 具体的なエラー
16.7 今後の展望

第17章 仮想化技術
17.1 仮想マシン
17.1.1 ハイパーバイザ
17.1.2 仮想マシン内のハードウェア
17.1.3 仮想マシンの一般的な使い方
17.1.4 仮想マシンの問題点
17.2 コンテナ
17.2.1 Docker、Podman、および権限
17.2.2 Dockerの例
17.2.3 LXC
17.2.4 Kubernetes
17.2.5 コンテナの落とし穴
17.3 ランタイムに基づく仮想化

参考文献
訳者あとがき
索引

書籍目次技術書籍

Posted by shi-n