Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

    View Slide

  2. 本研修の⽬的
    • Linux での開発・運⽤作業のための基礎知識の習得
    • 具体例を通して知識の活⽤⽅法のイメージをつかむ
    • 気軽に Linux について質問できる⼈を覚える
    講義時間が⻑いので、後半はどんなレベルの質問でも良いので
    個別にお話できるようにしようと思います(デモはオンデマンド)

    View Slide

  3. ファイルシステム階層
    • 基本は標準階層 (FHS) に従っている
    • ルート / を起点としたディレクトリ階層
    • ファイルシステムはマウントポイントにマウント
    • データを保存するファイル以外の特殊なものも存在

    View Slide

  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 環境

    View Slide

  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

    View Slide

  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を使⽤してファイルシステム操作した場合も同様)

    View Slide

  7. ユーザやグループ、パーミッションなどについて
    基本的なことは省略します
    各種サービス実⾏⽤に作られた(ログインユーザではない)ユーザについて、なぜ
    root 等で実⾏せずにそうするのか、セキュリティ上の観点から考えると良いです
    /etc/passwd ファイルで nologin とあるものからいくつか調べるなど
    (昨年の講義資料もあるので後で個別フォローします)

    View Slide

  8. エディタによるファイル編集
    • vi , vim, emacs, …
    • 開発環境ではどれを愛⽤しても良いです
    • 本番環境に好きなものがインストール可能とは限らない
    簡単な編集操作はどれでもできるように

    View Slide

  9. ページャによるファイル閲覧
    • less, more, lv, …
    • ターミナル上で画⾯に収まらない出⼒を上⼿く⾒られる
    • プログラムの出⼒やログなどの閲覧に便利
    $ tree / | less スペースで次のページ
    b で前に戻る
    q で終了
    誤操作から⾃分を守るためにも不必要にエディタを
    書き込み可能なモードで使わないこと

    View Slide

  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)
    ... [略]

    View Slide

  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)
    ... [略]

    View Slide

  12. プロセス、スレッド
    • プロセスは実⾏しているプログラム(つまりインスタンス)
    • ⾃分のアドレス空間を持つ
    • ライブラリを含めプログラムをマップして参照
    • スレッドは実⾏コンテキスト
    • プロセスのアドレス空間を複数コンテキストで共有
    • Linux カーネルは上記以外でほぼプロセスと同⼀視
    実⾏コンテキストが分かりにくければ CPU のコア上でタスクスケジューリングして
    実⾏できる単位とイメージしてください(レジスタに実⾏中の命令の番地とかの
    コンテキストが格納されていて、スケジューリングの際はそれらが退避されて別の
    実⾏コンテキストがロードされます)

    View Slide

  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/

    View Slide

  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

    View Slide

  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
    … [略]

    View Slide

  16. デモ
    top より⾼機能な htop コマンドで ap サーバを観察

    View Slide

  17. コマンド実⾏とジョブ
    • ジョブはシェル上でのひとまとまりの処理の実⾏単位
    • 処理を担うプロセスはプロセスグループとしてまとめられる
    • シグナルなどによる統⼀管理が可能
    • ジョブ実⾏のコントロール︓
    • foreground 実⾏
    • background 実⾏
    • suspend
    読んで欲しい︓
    Control groups, part 1: On the history of process grouping
    https://lwn.net/Articles/603762/

    View Slide

  18. ジョブ管理の例
    $ yes
    y
    y
    … [略]
    y
    ^Z
    [1]+ Stopped yes
    $
    $ jobs
    [1]+ Stopped yes
    $
    $ fg
    y
    … [略]
    y
    y^C
    $

    View Slide

  19. パイプ
    • プロセス間での通信を可能にするチャネル
    • 通信チャネルはバイトストリーム
    • Pipe とファイルシステム上で名前を持つ FIFO
    • cmd1 | cmd2 で cmd1 の出⼒が cmd2 の⼊⼒に
    参考資料︓man 7 pipe
    $ echo "pakeman" | sed -e "s/a/o/g"
    pokemon
    $
    シェル上でパイプでつながれたコマンドの処理(プロセス)が
    ジョブのプロセスグループとして連携動作している

    View Slide

  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.
    $

    View Slide

  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 -

    View Slide

  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 -
    独⾃にプログラム内に複雑な律速制御を実装しなくてもパイプで
    既存コマンドを組み合わせて低コストで⽬的達成

    View Slide

  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
    $
    外的要因による想定外の異常終了まで考慮した⼿順作成を

    View Slide

  24. シグナルによるプロセス管理
    • 実⾏中のプロセスに外からシグナルを送れる
    • プロセスは各シグナルに対し決められた挙動を⽰す
    $ yes > /dev/null
    Terminated
    $ yes > /dev/null
    Killed
    $
    $ pgrep yes
    13894
    $ kill -SIGTERM 13894
    $ pgrep yes
    13896
    $ kill -SIGKILL 13896
    $
    殺されたプロセスの終了ステータスの違いを調べても⾯⽩いかも

    View Slide

  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.
    ... [略]
    活⽤頻度が⾼いシグナルを
    みんなで議論しましょう︕

    View Slide

  26. サービス
    • システム起動などに合わせて⾃動起動させたりできる
    • プログラム本体とは別に設定や制御⽅法を記述できる
    • 16.04 移⾏の Ubuntu では Systemd のサービス

    View Slide

  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
    $

    View Slide

  28. systemctl コマンドの使い⽅
    • 状態確認︓systemctl status <サービス>
    • 起動︓systemctl start <サービス>
    • 停⽌︓systemctl stop <サービス>

    View Slide

  29. 今後何か質問したくなったら
    SRE に Linux に詳しい⼈が多いので積極的に
    メンションして質問してみてください

    View Slide