name: overview class: title, smokescreen, shelf, no-footer # インフラ小咄<br>lsとcatコマンドで探ってみる <div class=footnote> コマンドに慣れるため2つの基本コマンドだけでサーバの中を探検してみます。 このサーバって物理?仮想?もlsとcatだけで、かなり分かるよね? </div> --- name: overview class: title, smokescreen, shelf, no-footer # lsコマンド<br>〜たんけんぼくのUnix〜 <div class=footnote> lsコマンドは、その名のとおりファイルを<B>LiSt</B>(リストアップ)するコマンドです </div> --- class: compact # /の下を見てみよう (普通のサーバ) `ls /`を実行してみると次のように表示されます。 ``` bin docker initrd.img lib64 mnt pub sbin sys var vol boot etc initrd.img.old lost+found opt root snap tmp vmlinuz dev home lib media proc run srv usr vmlinuz.old ``` - `/`は一番上の階層(Windowsで言うところの`C:\`相当)です。 この英単語の省略形は一体なに?というのは慣れるしかありません:-)が、 重要なところから見てみましょう。 - 昔から**`etc`**ディレクトリ(etc=エトセトラ、Windowsではフォルダ)以下に設定ファイル群を置く習わしです。 また、 `dev`以下にはデバイスの情報、 `proc`以下にはプロセスファイルシステムというOSの情報がファイルとして見えるという特殊なファイル群があります。 このあたりをつついて、サーバが物理か?仮想か?のアタリをつけてみましょう --- class: compact # /devの下を見てみると? (普通のサーバ) `ls /dev`すると、たくさん(この例では160個)。 これが普通にインストールした状態のサーバ。 これだけでは物理か仮想(完全or準仮想化)かは明瞭でないけれどコンテナとは違う ``` autofs hugepages pts tty1 tty28 tty46 tty7 vcsa2 block initctl random tty10 tty29 tty47 tty8 vcsa3 bsg input rfkill tty11 tty3 tty48 tty9 vcsa4 btrfs-control ipmi0 rtc tty12 tty30 tty49 ttyS0 vcsa5 bus kmsg rtc0 tty13 tty31 tty5 ttyS1 vcsa6 cdrom kvm sda tty14 tty32 tty50 ttyS2 vcsa7 char log sda1 tty15 tty33 tty51 ttyS3 vcsu console loop-control sda2 tty16 tty34 tty52 uhid vcsu1 ... 略 ... fb0 null stderr tty23 tty41 tty6 vcs5 vga_arbiter fd port stdin tty24 tty42 tty60 vcs6 vhci full ppp stdout tty25 tty43 tty61 vcs7 vhost-net ... 略 ... ``` --- class: compact # /devの下を見てみると? (コンテナ) `ls /dev`すると、コンテナの場合すごく表示されるものが少ないのが分かるね (これはdebian:11.1公式イメージの例)。 これはコンテナが**制限された環境**を作り出すためのものだから少ないのが当然という話 ``` onsole fd mqueue ptmx random stderr stdout urandom core full null pts shm stdin tty zero ``` --- class: compact # 物理?仮想?コンテナ? - コンテナぽいかどうかは分かるようになりましたね? もっとも、 プロンプトに長い英数字(下図の158e3451d2fc)が出ていると**コンテナっぽい**です (確証にはならない) ``` [例: コンテナにログインしたところ] Linux 158e3451d2fc 4.19.0-18-amd64 #1 SMP Debian 4.19.208-1 (2021-09-29) x86_64 The programs included with the Debian GNU/Linux system are free software; ... 省略 ... Last login: Wed Jan 12 21:05:45 2022 from 118.19.153.189 username@158e3451d2fc:~$ ``` - 物理か仮想かは区別できるか?というところですが... lsコマンドでファイル名だけみていても難しいので、 catコマンドでファイルの中身を見てみましょう - 問題は、どのファイルを見れば分かるか?ですね --- name: overview class: title, smokescreen, shelf, no-footer # catコマンド <div class=footnote> catは猫ではなく<B>concatenate</B>(連結)という単語から来ています。 cat file1 file2 file3 ...を実行すると出力はファイル群が連結されたものになります。 「cat ファイル」で一つのファイルを表示するのは、その特別な場合ということですね </div> --- class: compact # OSバージョンを調べよう `cat /etc/os-release`を実行すると次のようにOSの情報が表示されます。 はい、いま実行している環境は Debian 10 なんですね ``` PRETTY_NAME="Debian GNU/Linux 10 (buster)" NAME="Debian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" ``` (注: **Linux 一族では表示されますが、Unix 共通ではありません**) --- class: compact # ハードウエア情報を知りたい - OSのバージョン情報ではサーバの実体がよくわかりません。 動いているサーバのハードウエア情報が知りたいものです - **/proc**以下にはカーネルの情報が見られる擬似的なファイル群があります。 これを見るとハードウエアについていろいろ分かるはずです。 - `ls /proc`すると、絶望するほど、たくさんファイルが表示されます。どうしよう ... ``` 1 1305 1734 1887 2065 235 36 577 787 execdomains schedstat 10 1309 1742 189 2066 2364 360 579 788 fb self 1070 131 1746 1890 2095 2365 37 581 789 filesystems slabinfo 1071 132 1750 1893 21 24 38 582 790 fs softirqs ... 以下24行省略 ... ``` --- class: compact # (ファイル名が分からない時は)ワイルドカードを使おう - 豆知識として何にでもマッチする`*`という特別な文字があります。 - 何を探せばいいのか分からなくて闇雲に探すとき、これ便利 - ハードウエアといえば、まずはCPUでしょう。 きっとCPUとかcpuとかいうファイル名でなにかあるんじゃないか? (と推測をはたらかせるのです)。そして、えいやっと実行です ``` ls /proc/*CPU* /proc/*cpu* ``` を実行すると、はいファイル名にcpuがあるものをみつけました。 CPUはないみたいけど(<- 1行目のエラー) ``` ls: cannot access '/proc/*CPU*': No such file or directory /proc/cpuinfo ``` --- class: compact # /proc/cpuinfoでCPUがなにかを見つけよう - `cat /proc/cpuinfo`すると、これもたくさん出力されます。 けれど、今時のみなさんは、ターミナルの画面を遡ってみるとかできますよね? さかのぼっていくと、こういうCPUの型番が見つけられます ``` [物理サーバ上] model name : Intel(R) Core(TM) i5-7260U CPU @ 2.20GHz ``` どうやら物理的なCPUが見えているようなので物理サーバのようです。 一方、ここが QEMU となっていたら、仮想マシンの上です ``` [仮想サーバ上] model name : QEMU Virtual CPU version 2.5+ ``` --- class: compact # まとめ - ls、cat、そして**ワイルドカード(`*`)**を使うだけでも、いろいろ調べられました - Unix上で生活している人(我々)は、このような毎日を送っています - 少し頭をひねって推測したりしますが、 それらを組み合わせているだけです。 - メニューの一覧から探せないんですかね?と言われると、ん〜 古典的なUnixは、そういう素人向けのOSではありません。 最近の Unix には、そういうGUIがついていて、 だれでも使えますよ〜という営業をしていますが、それはそれとして、 **インフラ部門にとって大事なのは、 クラウドで少し凝ったことをしようとすれば、 すぐに、この操作法が必要になってくるという事実です**。 たとえばDockerfileのカスタマイズはUnixコマンド操作そのものです - だから慣れましょう。いや、むしろ古典的なUnixの操作法(CLI)に慣れれば、 同僚がメニューを探しまわっている間に、 あなたは10倍速で仕事を片付けられるようになるでしょう **(<- Unixの営業でした:-)** --- name: overview class: title, smokescreen, shelf, no-footer # コラム<br>歴史から学ぶ --- class: img-right,compact # Unixコマンド (歴史から話したいひとたちであった:-) <div class=footnote> (脚注) 遠隔といってもコンソールケーブルでの接続です(<- 説明が難しい...)。 他の低価格なGUIできるUnix端末からTCP/IPでサーバ機へリモート接続もしました </div> ![](/images/unix/dmesg.png) - Unixは開発者たちが自分たちで使いやすいように作ってきたOSです。 今でこそ最初からGUI操作できて当たり前のような雰囲気ですが、 1980年代なかばくらいまではコマンド操作(CUI)が普通でした。 80年代半ば以降GUIも普及してきましたが、 安くなったとはいえUnixマシンは百万円単位の買い物なので、 複数人で一台のマシンを共有していました。 だから、GUIを使えるのはコンピュータの前に陣取った一だけ:-)で、 その他の人は遠隔で使ったものです (どうやったら今の人に実感してもらえるのかなぁ?) --- class: col-2,compact # Unixコマンドって何個くらいあるの? <div class=footnote> (脚注) ちなみに、自分のDebian 10で数えたら3652個となり、めまい... </div> - う〜ん... **使えるとなまら便利**というものは数十個かなぁ? e.g. ファイルを探すとか、ソート・計算・成績をつけるとか... - 定番のコマンドだけ使えるだけでも随分べんりだよ〜 (ぱぱっと組合せを考えらられるようになれば) **GUIより仕事10倍速まちがいなし** - Unix上での生活で普段よく使うコマンド〜システム管理のものまでいろいろあるので、 どこからどこまで数えるかで随分かわります。 またOS標準配布物に加えてサードパーティ製コマンドを追加すればさらに増えます <wbr> - 例: 現在時刻 ``` % date Tue Jan 1 12:34:56 JST 2022 ``` - 例: OSの情報を表示 ``` % cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 10 (buster)" NAME="Debian GNU/Linux" VERSION_ID="10" ... 省略 ... ``` --- class: compact # Unixらしい使い方 <div class=footnote> (脚注) 実際、こうやって成績をつけてます:-) コマンドでいろいろ操作して、よさそうな理屈を探します。 いい感じになったら、その文字列をコピー&ペーストしてスクリプト(ファイル)に保存します。 これで毎回おなじ理屈で成績がつけられるね! <B>成績 as a Code</B>:-) </div> - サーバの操作では、ここまで必要でないので軽く紹介するだけ(そのうちね) <br> 例: ちょっと、すべての課題の点数を足して成績順で表示してみたい ``` % cd 授業/os-2021/ % cat 出席.csv 中間.csv 最終課題.csv | awk '{sum[$1] += $2}' | sort -n -k 2 ``` - catはファイルを表示し、sortは文字どおりでソートするコマンド(**1コマンド1機能**) - awk(**プログラミング言語AWK**)は少し凝ったことをしたい時に必須です。 ここではハッシュテーブル(キーは学籍番号)で成績を積算するために使っています - `|`(**パイプ**,縦棒,ぼっこ)は**左から右にデータの流れをつなぐ特別な呪文**で、 **Unix環境を特徴づけている呪文**です - **どのファイルも「学籍番号 空白 点数」**というフォーマットです(**重要**)