Linux-LPIC201-要点整理

LPIC-level1を先週取得したので、続けてlevel2を受験する。そのため試験範囲の要点を下記にまとめる。

# 1. キャパシティプランニング
## リソース使用率
- top
 - 総合的に見れる
- vmstat
 - メモリ/仮想メモリの状態
 - vmstat 5 3 (5秒毎に３回出力)
 - r -> 実行待ちプロセス数
 - b -> 割り込み不可プロセス数(0が好ましい)
 - wa -> cpuのIO待ち時間
 - buff/cache -> バッファキャッシュ/ページキャッシュ(多くても問題ない)
- iostat
- iotop 
 - topっぽくI/Oを見る プロセス毎のIO情報
- sar
 - system activity report -> システム統計のレポート、多機能
 - `sar -b -f /var/log/sa/saXX` -> XX日のレポートを表示
- sadf
 - different format -> sadcのログをCSV, TSV, XMLなどで出力(trと組み合わせるなど)
- uptime
- w
 - ログイン中ユーザー、プロセスがわかる
- ps
- pstree
- lsof
 -  プロセス、ポートの状態
- free
 - メモリとスワップ
 - freeが少なくてもcacheが大きければ問題ない
 - /proc/meminfo -> 詳細なメモリ情報
- df
 - ファイルシステム毎、ディスクの使用量が分かりやすい
- netstat
- ss
 - netstatの代替で、ほぼ同じ
- netserver
 - サーバー側
- netperf
 - クライアント側
- iptraf
 - トラフィックをモニター

## リソース監視ツール(覚えられません)
- collected
- Nagios
- MRTG
 - Traffic Grapherなのでトラフィックをグラフ化してくれる
- Cacti
- Icinga2

## その他リソース管理に関して
- 特定のパーティションにIO集中でボトルネック -> そこだけ高速なストレージに変えてみる
- カーネルの再構築/カーネルパラメータを調整する
- `swapon -s` -> スワップについて確認してみる(/proc/swaps)

# 2. Linuxカーネル
## バージョン
- 4.9-rc1 -> rcはRelease Candidate(開発版)
- バージョンの確認方法　①`uname -r` ②/proc/versionファイル ③Makefileを見る

## カーネルイメージ

## カーネルモジュール
- カーネルから一部機能を切り離しモジュール化(.ko) -> カーネルがコンパクトになり起動時間やメモリを節約
- lsmod
 - /proc/modulesと同じ
- modinfo
- insmod
- rmmod
- modprobe
 - 依存関係を解決しながらロード/アンロードしてくれる
 - `depmod` -> modules.depファイル（モジュール１.ko: モジュール２.ko モジュール3.ko）
 - 前処理やエイリアス付けたい -> /etc/modprobe.conf or /etc/modprove.d/ファイルで設定しておく
 - ex. `alias eth0 r7257`
 - kmod -> カーネルの機能で、モジュールが必要になったら自動でロードしてくれる

## カーネルのコンパイル
- ソースコード -> /usr/srcらへん
- バージョンアップの方法 -> ①`cp /boot/congig...x86-64 .config` (前設定ファイルを.configにコピー) 
  -> ②`make oldconfig`
- カーネルの設定 -> `make menuconfig`
- コンパイル -> `make`
- カーネルモジュールとカーネルのインストール -> `make modules_install` -> `make install`
- /bootにイメージができてるのでデフォルトのカーネルにしておく
- DKMS -> Dynamic Kernel Module Support(サードパーティのカーネルモジュールを自動的にビルドしてくれる)
- `make clean` `make mrproper`

## カーネルパラメータ(/proc/sys/)
- `sysctl [-w] net.ipv4.ip_forward=1`(再起動で消える) / /etc/sysctl.confに書く(永続)

## 初期RAMディスク
- initrd / initramfs(cpioアーカイブ + 圧縮)
- 初期RAMディスクの作成 -> `mkinitrd` / `mkinitramfs`
- 最新のCentOS -> `dracut`コマンドでinitramfsが/boot以下に作成できる

## カーネルの管理と問題解決
- lsdev
- lspci
 - `lspci -s 2:0` -> 2番バス、０番スロット
- lsusb
- ブロックデバイス -> b/ブロック単位/ランダムアクセス/HDD, RAMディスク, RAIDボリュームなど
- キャラクターデバイス -> c/キャラクタ単位/ランダム不可/キーボード, マウス, 端末など
- カーネルが認識しているデバイスが見たい -> /proc/devices
- udev/sysfs -> /etc/udev/rules.d/60-raw.rulesなど
- sysfsがどのようにデバイスを扱っているか -> `udevadm info`で確認(識別に使う)
- rulesファイルの識別キー=値にマッチ -> 指定したルールでデバイスファイルが作成される
-  デバイスの検知をモニタリング -> `udevadm monitor`

# 3.システムの起動
## 起動プロセス
- BIOS/UEFI
- ->MBR(ブートローダの一部 + パーティションテーブル)/GPT
- ->MBRのブートローダが二段階目のブートローダを起動
- ->指定されたパーティションからカーネルをロード
- -> ルートパーティションのマウント、/sbin/initの起動

## SysVinit
- initが /etc/inittab を読み込む
- -> /etc/rc[0-6].d/S85httpdなど
- -> ログインプロセス起動して終了
- chkconfig
- update-rc.d
- insserv

## systemd 
- Unit(service/device/mount/swap/target) = 処理単位
- 最初に /etc/systemd/system/defalt.target Unitが処理される
- -> /lib/systemd/system/XX.targetへのシンボリックリンクになっている
- 稼働しているサービスの確認 -> `systemctl list-units --type=○○`
- /etc/systemd/system/multi-user.target.wants/Unit設定ファイル達(postfix.serviceなど)
- journalctl
 - /var/run/log/journal -> 再起動で消失 -> /etc/systemd/jornald.confでpersistent設定

## ブートローダ
### GRUB
- `grub-install`
- /boot/grub/menu.lst
- root (hd0,0) -> /dev/sda1のこと
- 対話式シェル -> `grub`

### GRUB2
- `grub２-install`
- /etc/default/grub -> `grub(2)-mkconfig` -> /boot/grub/grub.cfg
- 対話式シェル -> `grub2`

### 起動オプション(起動時に[e]キー)
- ルートファイルシステムの指定 -> `linux   /boot/vimlinuz-.4.4.0 ro root=/dec/sda1`
- 起動オプションの確認 -> /proc/cmdline

### システムの回復
- インストールCD/DVD-ROMからレスキューモードで起動
- rpmコマンドなどルートディレクトリを指定しないといけなくなる -> `chroot`でルートディレクトリの変更
- GRUBの設定ファイルを直す -> `grub(2)-mkconfig`

## その他ブートローダ
- SYSLINUX
 - USBメモリやCD-ROMからのブート
- PXEブート
 - ネットワークブート
 - TFTP/DHCP/HTTP/NFS

# 4.ファイルシステム
## 操作
- /etc/fstab
 - UUIDの確認 -> `blkid`
 - マウントオプション
 - noatime -> iノードのアクセス時刻を更新しない = 高速化
 - auto
 - suid
 - user
 - users
 - defaults -> async/auto/dev/exec/nouser/rw/suid
- カーネルがサポートしているファイルシステムは? -> /proc/filesystems
- どのファイルシステムがマウントされてるか -> /etc/mtab = /proc/mounts
- `mount` / `umount`
- 再マウント -> `mount -o remount /data`
- `sync` -> メモリ上のディスクバッファ領域にあるデータをディスクに書き込む
- ファイルにスワップ領域を作る手順↓
 - `dd if=/dev/zero of=/tmp/swapfile bs=1M count=500`
 - `mkswap /tmp/swapfile` 
 - `swapon /tmp/swapfile`
- スワップ領域の確認 -> `swapon -s` または `cat /proc/swaps`

## 作成
### ext

### XFS

### Btrfs
- btrfsの使用状況の確認 -> `btrfs filesystem df /mnt`
- btrfsでスナップショット -> `btrfs subvolume snapshot A B`


### CD/DVD

### 暗号化ファイルシステム

## 保守
- スーパーブロックのバックアップから修復 -> `e2fsck -b 8193 /dev/sda2`

# 5.高度なストレージ管理
## RAID
- `mdadm`
- 状態 -> /proc/mdstat
- 設定 -> /etc/mdadm.conf
- [_U]
- RAIDの構築 -> `mdadm --create /dev/md0 --level 5 --raid-devices 3 A B C`


## LVM

### 作成
- パーティションの準備(`parted`) -> 物理ボリューム作成(pvcreate) -> ボリュームグループ作成(vgcreate) -> 論理ボリューム作成(lvcreate) -> ファイルシステム作成(mkfs) -> マウント(mount)

### 管理(reduce/remove注意)
- pvdisplay
- pvscan
- vgextend
- pvmove
- vgreduce
- pvremove
- vgdisplay
- lvdisplay
- lvextend -> e2fsck -> resize2fs(extファイルシステムの場合)
- xfs_growfs
- lvremove
- スナップショット(`lvcreate -s`) -> バックアップ(`dump 0uf`)
- 変更があるとスナップショット領域が膨らんでいく

## ハードディスク管理
- `hdparm`(IDE) / `sdparm`(SATA/SCSI/USB)


### SSD
- 磁気ディスクではなくフラッシュメモリに記録
- 削除時は実際にデータを消すのではなくフラグつけるだけ -> パフォーマンス低下 -> `fstrim -v /`

### iSCSI
- internet + SCSI
- イニシエータ -> ターゲット


# 6.ネットワーク
- ifconfig
- arp
- ping
- traceroute
- tcpdump
- netstat
 - `netstat -l` -> linteningのソケットのみ表示
 - `netstat -i` -> インターフェースごとに表示
- ss
- nc
 - `nc -vz ipアドレス 1-1000` -> 1-1000の範囲をポートスキャン
- ip [link/addr/route/neigh] [show/add]
- route [add/del]
- iwconfig
- iw dev
- iwlist
- nmcli/nmtui
- mtr = my trace route -> 操作


# 7.システムメンテナンス
## ソースからソフトウェアインストールをする
- patch -p0
- patch -p1
- -Rオプション
- 手順
 - ソースコードアーカイブを入手・展開(1.tar  2.gunzip ; tar  3.gzip -dc | tar)
 - (patchファイルがあれば適用)
 - ./configure でMakefile作成
 - `make` でコンパイル
 - `sudo make install` でインストール (all/install/clean)
 - /usr/local/bin に配置される

## バックアップ
- 種類
 - 完全
 - 差分(フルバックアップと最新の差分バックアップがあれば復元できる)
 - 増分
 
- ローカルへのバックアップ
 - tar
 - cpio
 - dd
 - dump/restore
 - mt -> ex. `mt -f /dev/st0 fsf 5` -> テープを現在位置から5つ先のデータまで早送り
 
- リモートへのバックアップ
 - `rsync -auvz --delete -e ssh dir username@hostname:/backupdir`

## ユーザーへの通知
- /etc/motd 
- /etc/issue 
- /etc/issue.net
- `wall`

# 番外編.virtualbox
## ネットワーク
- 設定をNAT->ブリッジにしておく
- ifup インターフェース名
- ping で通信してみる