$30 off During Our Annual Pro Sale. View Details »

2019-03 Linux

2019-03 Linux

Cybozu
PRO

May 28, 2019
Tweet

More Decks by Cybozu

Other Decks in Technology

Transcript

  1. Linux 運⽤本部 吉川 開発運⽤研修2019 2019-05-28

  2. 本研修の⽬的 • Linux での開発・運⽤作業のための基礎知識の習得 • 具体例を通して知識の活⽤⽅法のイメージをつかむ • 気軽に Linux について質問できる⼈を覚える

    講義時間が⻑いので、後半はどんなレベルの質問でも良いので 個別にお話できるようにしようと思います(デモはオンデマンド)
  3. ファイルシステム階層 • 基本は標準階層 (FHS) に従っている • ルート / を起点としたディレクトリ階層 •

    ファイルシステムはマウントポイントにマウント • データを保存するファイル以外の特殊なものも存在
  4. $ tree -L 1 / / |-- bin |-- boot

    |-- dev |-- etc |-- home |-- initrd.img -> boot/initrd.img-4.4.0-142-generic |-- initrd.img.old -> boot/initrd.img-4.4.0-141-generic |-- lib |-- lib64 |-- media |-- mnt |-- opt |-- proc |-- root |-- run |-- sbin |-- snap |-- srv |-- sys |-- tmp |-- usr |-- var |-- vmlinuz -> boot/vmlinuz-4.4.0-142-generic `-- vmlinuz.old -> boot/vmlinuz-4.4.0-141-generic 20 directories, 4 files $ http://www.pathname.com/fhs/ より Directory Description bin Essential command binaries boot Static files of the boot loader dev Device files etc Host-specific system configuration lib Essential shared libraries and kernel modules media Mount point for removeable media mnt Mount point for mounting a filesystem temporarily opt Add-on application software packages sbin Essential system binaries srv Data for services provided by this system tmp Temporary files usr Secondary hierarchy var Variable data ⼿元の仮想マシン上の Ubuntu 16.04 環境
  5. マウントされているファイルシステムの例 db-kintone サーバの例︓ $ mount | grep -e ext -e

    btrfs /dev/vda3 on / type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/) /dev/vda1 on /boot type ext2 (rw,relatime,sync,block_validity,barrier,user_xattr,acl) /dev/md127 on /var/forest type ext4 (rw,nodev,noexec,noatime,nobarrier,stripe=128,data=ordered,_netdev) $ /var/forest はアプリのデータ保存⽤に決めた場所 ext2, ext4, btrfs は Linux のサポートするファイルシステムの種類で、 ディスク上の領域がその形式にフォーマットされてマウントされている / var forest boot … ext4
  6. ファイルやディレクトリの基本操作 $ mkdir mywork $ cd mywork/ $ touch myfile

    $ echo hello > myfile $ cat myfile hello $ rm myfile $ cd .. $ rmdir mywork/ $ $ strace mkdir mywork 2>&1 | grep mywork execve("/bin/mkdir", ["mkdir", "mywork"], [/* 24 vars */]) = 0 mkdir("mywork", 0777) = 0 $ $ strace touch myfile 2>&1 | grep myfile execve("/usr/bin/touch", ["touch", "myfile"], [/* 24 vars */]) = 0 open("myfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 $ コマンド実⾏に対してファイルシステムに対応する処理をさせる ためのシステムコールが実⾏されている(プログラミング⾔語 のAPIを使⽤してファイルシステム操作した場合も同様)
  7. ユーザやグループ、パーミッションなどについて 基本的なことは省略します 各種サービス実⾏⽤に作られた(ログインユーザではない)ユーザについて、なぜ root 等で実⾏せずにそうするのか、セキュリティ上の観点から考えると良いです /etc/passwd ファイルで nologin とあるものからいくつか調べるなど (昨年の講義資料もあるので後で個別フォローします)

  8. エディタによるファイル編集 • vi , vim, emacs, … • 開発環境ではどれを愛⽤しても良いです •

    本番環境に好きなものがインストール可能とは限らない 簡単な編集操作はどれでもできるように
  9. ページャによるファイル閲覧 • less, more, lv, … • ターミナル上で画⾯に収まらない出⼒を上⼿く⾒られる • プログラムの出⼒やログなどの閲覧に便利

    $ tree / | less スペースで次のページ b で前に戻る q で終了 誤操作から⾃分を守るためにも不必要にエディタを 書き込み可能なモードで使わないこと
  10. Linux カーネルがエクスポートする疑似ファイル︓proc $ cat /proc/meminfo | head MemTotal: 22037764 kB

    MemFree: 142584 kB MemAvailable: 1892344 kB Buffers: 36 kB Cached: 1222544 kB SwapCached: 5372 kB Active: 665352 kB Inactive: 645468 kB Active(anon): 40520 kB Inactive(anon): 52444 kB $ 静的な情報だけでなく動的に変わるメモリ使⽤状況 なども read 時にカーネルが計算して返してくれる # echo 1 > /proc/sys/vm/drop_caches 書き込むことでカーネルに特定の処理を指⽰ $ mount | grep proc proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) ... [略]
  11. Linux カーネルがエクスポートする疑似ファイル︓sysfs 「LXCコンテナが⽤いるNUMA nodeを分離する」(過去に実施したタスクより抜粋) cat /sys/fs/cgroup/cpu/lxc/$TARGET/cpuacct.usage_percpu cat /sys/fs/cgroup/memory/lxc/$TARGET/memory.numa_stat CPULIST=$(cat /sys/devices/system/node/node$NUMA_NODE_NUM/cpulist)

    環境に依存しない汎⽤的な⼿順やプログラムの作成に便利なことが多い (開発環境と運⽤環境の差分を吸収するテクニック) $ mount | grep sys sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) ... [略]
  12. プロセス、スレッド • プロセスは実⾏しているプログラム(つまりインスタンス) • ⾃分のアドレス空間を持つ • ライブラリを含めプログラムをマップして参照 • スレッドは実⾏コンテキスト •

    プロセスのアドレス空間を複数コンテキストで共有 • Linux カーネルは上記以外でほぼプロセスと同⼀視 実⾏コンテキストが分かりにくければ CPU のコア上でタスクスケジューリングして 実⾏できる単位とイメージしてください(レジスタに実⾏中の命令の番地とかの コンテキストが格納されていて、スケジューリングの際はそれらが退避されて別の 実⾏コンテキストがロードされます)
  13. プロセスのアドレス空間の例 $ yes > /dev/null $ pgrep yes 13670 $

    less /proc/13670/smaps … 簡単な図︓ lwn: Reorganizing the address space https://lwn.net/Articles/91829/ 少し古いけれど⼀読すると良いもの︓ https://www.kernel.org/doc/gorman/html/understand/
  14. 00400000-00407000 r-xp 00000000 00:14 135411 /usr/bin/yes Size: 28 kB Rss:

    28 kB Pss: 28 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 28 kB Private_Dirty: 0 kB Referenced: 28 kB Anonymous: 0 kB AnonHugePages: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB VmFlags: rd ex mr mw me dw sd 02522000-02543000 rw-p 00000000 00:00 0 [heap] Size: 132 kB Rss: 4 kB Pss: 4 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 4 kB Referenced: 4 kB Anonymous: 4 kB AnonHugePages: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB VmFlags: rd wr mr mw me ac sd 7f6b008c9000-7f6b00a89000 r-xp 00000000 00:14 686021 /lib/x86_64-linux-gnu/libc-2.23.so Size: 1792 kB Rss: 988 kB Pss: 33 kB Shared_Clean: 988 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 0 kB Referenced: 988 kB Anonymous: 0 kB AnonHugePages: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB VmFlags: rd ex mr mw me sd
  15. システムで動作するプロセスの確認⽅法 • ps, top コマンドなど • オプションは覚えきれないので適当によく使う組み合わせを $ ps -e

    PID TTY TIME CMD 1 ? 00:01:11 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:07 ksoftirqd/0 5 ? 00:00:00 kworker/0:0H … [略]
  16. デモ top より⾼機能な htop コマンドで ap サーバを観察

  17. コマンド実⾏とジョブ • ジョブはシェル上でのひとまとまりの処理の実⾏単位 • 処理を担うプロセスはプロセスグループとしてまとめられる • シグナルなどによる統⼀管理が可能 • ジョブ実⾏のコントロール︓ •

    foreground 実⾏ • background 実⾏ • suspend 読んで欲しい︓ Control groups, part 1: On the history of process grouping https://lwn.net/Articles/603762/
  18. ジョブ管理の例 $ yes y y … [略] y ^Z [1]+

    Stopped yes $ $ jobs [1]+ Stopped yes $ $ fg y … [略] y y^C $
  19. パイプ • プロセス間での通信を可能にするチャネル • 通信チャネルはバイトストリーム • Pipe とファイルシステム上で名前を持つ FIFO •

    cmd1 | cmd2 で cmd1 の出⼒が cmd2 の⼊⼒に 参考資料︓man 7 pipe $ echo "pakeman" | sed -e "s/a/o/g" pokemon $ シェル上でパイプでつながれたコマンドの処理(プロセス)が ジョブのプロセスグループとして連携動作している
  20. FIFO の使⽤例 参考資料︓man 7 pipe $ mkfifo mypipe $ ls

    -l mypipe prw-rw-r-- 1 takuya takuya 0 May 23 17:24 mypipe $ echo "Pass this sentence into the named pipe." > mypipe $ $ cat < mypipe Pass this sentence into the named pipe. $
  21. パイプの応⽤例︓アーカイブ展開の律速 • ネットワーク越しにストリームで圧縮アーカイブを受信 • アーカイブを展開してオフィスを動かすサーバに配置すると きに書き込みが集中して運⽤中のサービスに悪影響 【旧】 bin/untar –x –remove-symlink

    –C cXXXXX/varaha/cb5 –z –f – 【新】 zcat | cstream -t 10000000 | bin/untar -x --remove-symlink -C cXXXXX/varaha/cb5 -f -
  22. パイプの応⽤例︓アーカイブ展開の律速 • 解凍は zcat コマンドで実施 • 結果をパイプして cstream で律速 •

    律速されたものをパイプして tar でアーカイブ展開 【旧】 bin/untar –x –remove-symlink –C cXXXXX/varaha/cb5 –z –f – 【新】 zcat | cstream -t 10000000 | bin/untar -x --remove-symlink -C cXXXXX/varaha/cb5 -f - 独⾃にプログラム内に複雑な律速制御を実装しなくてもパイプで 既存コマンドを組み合わせて低コストで⽬的達成
  23. 終了ステータス • プロセスは実⾏元の親プロセスに終了ステータスを返す • コマンド実⾏後に $? で exit code 確認可能

    $ mkdir mydir $ cd mydir/ $ echo $? 0 $ cd no_such_dir -bash: cd: no_such_dir: No such file or directory $ echo $? 1 $ 外的要因による想定外の異常終了まで考慮した⼿順作成を
  24. シグナルによるプロセス管理 • 実⾏中のプロセスに外からシグナルを送れる • プロセスは各シグナルに対し決められた挙動を⽰す $ yes > /dev/null Terminated

    $ yes > /dev/null Killed $ $ pgrep yes 13894 $ kill -SIGTERM 13894 $ pgrep yes 13896 $ kill -SIGKILL 13896 $ 殺されたプロセスの終了ステータスの違いを調べても⾯⽩いかも
  25. $ man 7 signal ... [略] First the signals described

    in the original POSIX.1-1990 standard. Signal Value Action Comment ---------------------------------------------------------------------- SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling process SIGINT 2 Term Interrupt from keyboard SIGQUIT 3 Core Quit from keyboard SIGILL 4 Core Illegal Instruction SIGABRT 6 Core Abort signal from abort(3) SIGFPE 8 Core Floating point exception SIGKILL 9 Term Kill signal SIGSEGV 11 Core Invalid memory reference SIGPIPE 13 Term Broken pipe: write to pipe with no readers SIGALRM 14 Term Timer signal from alarm(2) SIGTERM 15 Term Termination signal SIGUSR1 30,10,16 Term User-defined signal 1 SIGUSR2 31,12,17 Term User-defined signal 2 SIGCHLD 20,17,18 Ign Child stopped or terminated SIGCONT 19,18,25 Cont Continue if stopped SIGSTOP 17,19,23 Stop Stop process SIGTSTP 18,20,24 Stop Stop typed at terminal SIGTTIN 21,21,26 Stop Terminal input for background process SIGTTOU 22,22,27 Stop Terminal output for background process The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored. ... [略] 活⽤頻度が⾼いシグナルを みんなで議論しましょう︕
  26. サービス • システム起動などに合わせて⾃動起動させたりできる • プログラム本体とは別に設定や制御⽅法を記述できる • 16.04 移⾏の Ubuntu では

    Systemd のサービス
  27. サービスの例 systemctl status logshipper.service • logshipper.service - logshipper Loaded: loaded

    (/lib/systemd/system/logshipper.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/logshipper.service.d └─override.conf Active: active (running) since Mon 2019-05-27 08:24:35 UTC; 20h ago Process: 29625 ExecStartPre=/usr/local/forest/sbin/generate-logshipper-config (code=exited, status=0/SUCCESS) Main PID: 29631 (logshipper) CGroup: /system.slice/logshipper.service └─29631 /opt/cybozu/logshipper/bin/logshipper /etc/opt/cybozu/logshipper/logshipper.toml ... [略] $ ls /sys/fs/cgroup/systemd/system.slice/logshipper.service/ cgroup.clone_children cgroup.procs notify_on_release tasks $ $ ls /sys/fs/cgroup/systemd/system.slice/logshipper.service/ cgroup.clone_children cgroup.procs notify_on_release tasks $
  28. systemctl コマンドの使い⽅ • 状態確認︓systemctl status <サービス> • 起動︓systemctl start <サービス>

    • 停⽌︓systemctl stop <サービス>
  29. 今後何か質問したくなったら SRE に Linux に詳しい⼈が多いので積極的に メンションして質問してみてください