Unix 基礎

85
Unix 基礎 最終更新日: Feb. 27, 2014 <[email protected]>

Transcript of Unix 基礎

Page 1: Unix 基礎

Unix 基礎

最終更新日: Feb. 27, 2014

<[email protected]>

Page 2: Unix 基礎

2

本スライドについて

• 目的:

– Unix の概念や、一般ユーザとして利用するうえで最低限身につけておくべき知識について解説する

–各コマンドの網羅的な紹介はしない

• 対象者:

– Unix / Linux 初心者

Page 3: Unix 基礎

3

本スライド中の各表記について

• プロンプト

– root で実行するコマンドのプロンプトは # で示す

–一般ユーザの場合は $ で示す

• 省略可能な引数は [] で囲う

# command

$ command

$ command arg1 [arg2]

Page 4: Unix 基礎

4

本スライドの注意点

• 紹介する方法がすべての環境で通用するとは限らない

– OS やシェルによっては使用できない場合がある

Page 5: Unix 基礎

5

UNIX OS

Page 6: Unix 基礎

6

OS (Operating System)

• ハードウェアとソフトウェアのやりとりを管理するアプリケーション

– メモリ、CPU、入出力

• 例:

– BSD, Linux, Windows, Mac OS X, Android, etc.

Page 7: Unix 基礎

7

Unix

• OS の一つ

• 1969年、AT&T (アメリカの最大手の電話会社) のベル研究所で開発を開始

• マルチタスク

–複数のプログラムがあたかも同時に動いているかのように見える

• マルチユーザ

– 1台のコンピュータを複数のユーザが利用できる

Page 8: Unix 基礎

8

ディストリビューション

• OS が流通する形態

• OS = カーネル + ソフトウェア

• BSD

– FreeBSD, OpenBSD, NetBSD, …

• Linux

– Ubuntu, Redhat, CentOS, …

Page 9: Unix 基礎

9

スーパーユーザと一般ユーザ

• スーパーユーザ (root)

–システムの管理者

• 一般ユーザ

– root 以外のユーザ

Page 10: Unix 基礎

10

グループ

• ユーザの集合

• 全てのユーザは、

– 1つのプライマリグループに必ず所属する

– 0以上のセカンダリグループに所属できる

• 所属するグループは、id コマンドで確認できる

id [user]

Page 11: Unix 基礎

11

マニュアル

Page 12: Unix 基礎

12

マニュアル

• UNIX には膨大なマニュアルが用意されている

第 1 章 汎用コマンド

第 2 章 システムコール

第 3 章 ライブラリ関数

第 4 章 デバイスとドライバ

第 5 章 ファイル形式

第 6 章 ゲーム

第 7 章 その他

第 8 章 システム管理コマンド

第 9 章 カーネル

Page 13: Unix 基礎

13

マニュアル

• man で表示

–例:

man [section] name

$ man manman(1) man(1)

NAMEman - format and display the on-line manual pages

SYNOPSISman [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file][-M pathlist] [-P pager] [-B browser] [-H htmlpager] [-S section_list][section] name ...

Page 14: Unix 基礎

14

カーネルとシェル

Page 15: Unix 基礎

15

カーネル

• UNIX OS の核となるプログラム

• アプリケーションのための機能を提供する

–プロセス間通信、システムコールなど

アプリケーション

OSカーネル

CPU メモリ デバイス

Page 16: Unix 基礎

16

シェル

• カーネルとユーザとの橋渡しをするアプリケーション

–ユーザと対話し、入力を解釈してカーネルに渡し、コマンドを実行する

• 2つの機能:

–ユーザインタフェース機能

–シェルプログラミング機能

Page 17: Unix 基礎

17

いろいろなシェル

sh(Bourneシェル)

どの UNIX にも必ず入っている。対話機能は弱い。

bash shの機能を強化したもの。ヒストリ機能など。Linux の標準シェル。

csh BSD 用に開発されたシェル。プログラミング機能が C言語に似ている。

tcsh cshの機能を強化したもの。コマンド補完機能など。

zsh 新しく登場したシェル。様々な独自機能が追加されている。

Page 18: Unix 基礎

18

シェルの環境設定

• ログインシェルの設定ファイル

–ログイン時に次の順序で設定ファイルが実行される(Bourne シェルの場合)

1. /etc/profile

2. ~/.profile

• 一時的なシェルの設定ファイル

–一時的にシェルを起動 (コマンドラインで sh と実行) したときは、次のファイルが実行される

• ~/.shrc

• これらのファイルに設定を書けば良い

Page 19: Unix 基礎

19

シェルの変更

• ログインシェルの変更

– chshコマンドを使う

• 一時的にシェルを変更

–シェル名をコマンドとして実行する

• 例:

chsh –s newshell [user]

$ bash

Page 20: Unix 基礎

20

シェルスクリプト

• UNIXコマンドを羅列したスクリプト

–バッチ処理などで使われる

• ファイル1行目の #! からはじまる記述をシェバン(shebang) という

–スクリプトを読み込むインタプリタを指定する

–例:

#!/bin/sh

Page 21: Unix 基礎

21

環境変数

• システムの属性を格納している変数

• 例:

• 値を取得するときは先頭に $ を付ける

PWD カレントディレクトリ

TERM 端末の種類

HOME ホームディレクトリ

LANG 言語設定

PATH コマンドサーチパス

SHELL 使用中のシェル

Page 22: Unix 基礎

22

コマンドサーチパス ($PATH)

• シェルがコマンドを探索するディレクトリのリスト

– コロン (:) 区切りで記述

–例:

– これらのディレクトリ内にあるプログラムなら、絶対パスで指定しなくても、プログラム名だけで実行できる

$ echo $PATH/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/sho/bin

Page 23: Unix 基礎

23

POSIX (Portable Operating System Interface)

• UNIX の標準的なインターフェースを定めた規格

–移植性の高いソフトウェアの開発を目的として、IEEE が策定した

–各 OS やシェルの独自拡張により、スクリプトなどを別環境に移動すると動作しないことがある

–各環境間での最低限の互換性を確保する

–内容は多岐に渡る

• システムコール、標準ライブラリ、OS コマンド、正規表現など

Page 24: Unix 基礎

24

端末

Page 25: Unix 基礎

25

端末 (Terminal)

• キーボードとディスプレイが1セットになった装置

–かつては、1台のホストコンピュータに端末を接続して共用するのが主流だった

Host Computer

Terminal

Keyboard

Display

Terminal

Keyboard

Display

Terminal

Keyboard

Display

Terminal

Keyboard

Display

Program

Program

Page 26: Unix 基礎

26

端末 (Terminal)

• 端末エミュレータ

–端末をエミューレートするソフトウェア

–エミュレートされた端末を仮想端末という

• telnet や SSH もその一種Server

TerminalEmulator

Client

Virtual Terminal

Keyboard

Display

Page 27: Unix 基礎

27

端末 (Terminal)

• 現在使用している端末名を確認するには ttyコマンドを使う

• すべての端末を表示するにはw コマンドを使う

tty

w

Page 28: Unix 基礎

28

ファイルとディレクトリ

Page 29: Unix 基礎

29

ファイルシステム

• OS の機能の一つ

• 主に補助記憶装置 (HDD など) に格納されたデータを管理する

Page 30: Unix 基礎

30

ファイル

• データを格納するための論理的な単位

• 1人のユーザに所有され、1つのグループに属する

–そのグループに、所有者が必ずしも属しているとは限らない

Page 31: Unix 基礎

31

ディレクトリ

• ファイルを整理、管理するための木構造

• 木の根をルートディレクトリと言う

• 特別な意味を持つ記号:

–階層はスラッシュ (/) で区切って表記する

–先頭のスラッシュはルートディレクトリを表す

–先頭のチルダ (~) はホームディレクトリを表す

– ドット (.) のみはカレントディレクトリを表す

– 2つのドット (..) のみは1つ上のディレクトリを表す

Page 32: Unix 基礎

32

ディレクトリ

• mv, cpには注意

– source, target 名末尾のスラッシュ (/) の有無で動作が変わる場合がある

• ディレクトリ自体か、中身だけか

– target ディレクトリが存在するか否かでも動作が変わる

cp –R source/ target/mv source/ target/

Page 33: Unix 基礎

33

inode (あいのーど)

• ファイルシステムで使われているデータ構造

• ファイル、ディレクトリなどのオブジェクトに関する各種情報が格納される

inode番号 ファイルの長さ デバイス ID 所有者のユーザ ID グループ ID パーミッション

各種タイムスタンプ• 更新時刻 (mtime)• 属性変更時刻 (ctime)• 参照時刻 (atime)

参照カウント (その inodeを指すハードリンクの数)

Page 34: Unix 基礎

34

inodeとファイル名

• ディレクトリには以下の情報のみを格納

1. そのディレクトリにあるファイルのリスト

2. 対応する inode番号

• inode番号は lsの –iオプションで確認できる

ディレクトリ

File_A.txt

inode番号

ファイル実体

inode番号ファイル実体

inode番号

ファイル実体

inode番号

File_A.txt

inode番号

File_A.txt

inode番号

Page 35: Unix 基礎

35

リンク

• ファイルやディレクトリに別名を付けること

–例:

ln [–s] source_file target_file

$ touch hoge$ ln –s hoge fuga$ ls -l | tail +2lrwxr-xr-x 1 sho staff 4 12 20 15:41 fuga -> hoge-rw-r--r-- 1 sho staff 0 12 20 15:41 hoge

Page 36: Unix 基礎

36

シンボリックリンクとハードリンク

• シンボリックリンク

– ファイル名へのポインタ

• ハードリンク

– inode番号へのポインタ

ファイル実体

inode番号File_A.txt

File_B.txt

ファイル実体

inode番号File_A.txt

File_B.txt

inode番号inode番号

inode番号

Page 37: Unix 基礎

37

パーミッション

Page 38: Unix 基礎

38

パーミッション (属性)

• ファイル、ディレクトリごとに定義されるアクセス許可情報

• 所有者 (User)、グループのメンバ (Group)、その他のユーザ (Other) ごとに権限を設定する

– o は other。owner ではないので注意。

r (Read) 読出し権

w (Write) 書込み権

x (eXecute) 実行権

Page 39: Unix 基礎

39

パーミッション (属性)

• 各権限ごとに 1bit、計 9bit で表す

• 3bit ごとに区切り、8進数で表現されることがある

–例) rw-r--r-- = 110 100 100 = 644

• 所有者は読み書きができる

• グループのメンバは読み込みができる

• その他のユーザは読み込みができる

r w xr w x r w x

所有者 (u) グループ (g) その他 (o)

Page 40: Unix 基礎

40

パーミッションの変更

• chmodを使う

–例:

• 上3つは相対的な指定

• 下2つは絶対的な指定

chmod mode file

$ chmod g+w file1 # group に書込み権を付与$ chmod go-rwx file1 # group と other の全権限を解除$ chmod +x file1 # 全ユーザに実行権を付与$ chmod o=r file1 # other の権限を r-- に変更$ chmod 755 file1 # 755 (rwxr-xr-x) に変更

Page 41: Unix 基礎

41

ディレクトリのパーミッション

• ファイルのパーミッションとは意味が異なる

–変更方法は同じく chmod

r (Read) ディレクトリ内のファイルリストを表示できる。

w (Write) ディレクトリ内で・ファイル、サブディレクトリの新規作成・ファイル、サブディレクトリの削除ができる。

x (eXecute) cd でそのディレクトリに移動できる。

Page 42: Unix 基礎

42

SUID (Set User ID) bit

• この bit がセットされた実行ファイルは、(実行者ではなく) 所有者の権限で動作する

• 一般ユーザが root 権限でプログラムを実行したりできる

–例:

• SGID というのもある

$ ls -l /usr/bin/passwd-rwsr-xr-x 1 root root 30768 Feb 22 2012 /usr/bin/passwd

Page 43: Unix 基礎

43

Sticky bit

• この bit がセットされたディレクトリ配下では、ファイルやディレクトリの所有者 (と root) だけが、リネームや削除を行える

–例:

$ ls -ld /tmpdrwxrwxrwt 2 root root 4096 Feb 27 10:05 /tmp

Page 44: Unix 基礎

44

コマンドラインの操作

Page 45: Unix 基礎

45

コマンド置換

• コマンドの実行結果を別のコマンドの一部として使える機能

–例:

$ echo "It's" `date +'%Y-%m-%d'`.It's 2013-12-20.$ echo "It's" $(date +'%Y-%m-%d').It's 2013-12-20.

`command`$(command) # こっちだと入れ子にできる

Page 46: Unix 基礎

46

入力補完機能

• コマンドやファイル名の入力をシェルが補完 (自動入力) してくれる機能

–入力途中で [Tab] キーを押す

–例:

–複数候補がある場合、リストが表示される

$ ifc

$ ifconfig

Page 47: Unix 基礎

47

ワイルドカード

• 複数のファイル名やディレクトリ名を指定する際に使う特殊記号 (メタ文字)

* 任意の文字列

? 任意の1文字

[〜] [ ] 内の任意の1文字

[!〜] [ ] 内にない任意の1文字

{〜,〜,…} { } 内の任意の文字列(カンマで区切る)

Page 48: Unix 基礎

48

ワイルドカード

• 例:

$ lscar cart cat com court dog

$ ls c*tcart cat court

$ ls c[ao]?car cat com

$ ls c{art,at}cart cat

Page 49: Unix 基礎

49

メタ文字の無効化

• 直前にバックスラッシュ (¥) を付けてエスケープする

–例:

※環境によっては円マークに見える場合がある

• シングルクオートで囲う

–例:

$ touch hoge¥*fuga$ lshoge*fuga

$ touch 'hoge$fuga'

Page 50: Unix 基礎

50

シングルクオートとダブルクオート

• スペースなどを含む文字列はクオートで囲う

–ダブルクオートだと、変数やコマンド置換が展開される

–シングルクオートでは展開されない

$ echo "hoge `date`"hoge Tue Jan 21 18:21:55 JST 2014

$ echo 'hoge `date`'hoge `date`

Page 51: Unix 基礎

51

ヒストリ

• 以前入力したコマンドを参照する機能

• 使用方法:

– カーソルキー (↑, ↓)

– history コマンド

– Ctrl+R <検索するキーワード>

• 例:

$ Ctrl+Rbck-i-search: ping

Page 52: Unix 基礎

52

エイリアス

• コマンドに別名を付けられる機能

–引数も含められる

–例:

$ alias ll='ls –l'$ alias llll='ls -l'$ ll # ls –l と等価(略)

alias name # 現在の設定を表示alias name='value'

Page 53: Unix 基礎

53

エイリアス

• 解除は unaliasコマンドを使う

• 既にあるコマンドの上書きもできる

• 元のコマンドを実行するには、コマンドの前にバックスラッシュ (¥) を付ける

unalias name

¥name

Page 54: Unix 基礎

54

標準入力と標準出力、標準エラー出力

• 通常、プログラムは端末 (キーボードとディスプレイ) からデータを入出力する

• リダイレクションを使うと、入出力先をファイルなどに切り替えられる

標準入力 (stdin) キーボードからの入力

標準出力 (stdout) ディスプレイへの出力

標準エラー出力 (stderr) ディスプレイへの出力

Page 55: Unix 基礎

55

リダイレクト

コマンド < ファイル ファイルから標準入力に入力

コマンド > ファイル 標準出力をファイルに書出し (上書き)

コマンド >> ファイル 標準出力をファイルに書出し (追記)

コマンド >& ファイル標準出力と標準エラー出力をファイルに書出し (上書き)

コマンド >>& ファイル 〃 (追記)

コマンド 2> ファイル 標準エラー出力をファイルに書出し

Page 56: Unix 基礎

56

リダイレクト

• 例:

$ echo Hello > hoge.txt # 書出し$ cat hoge.txtHello$ echo World >> hoge.txt # 追記$ cat hoge.txtHelloWorld

$ echo Hello &> /dev/null$

Page 57: Unix 基礎

57

/dev/null

• 何もしないデバイス

–書き込まれたデータは捨てられる

–読み込むと常に EOF (End Of File) が返される

• ここにリダイレクトすることで出力を破棄できる

–例:

$ program > /dev/null

$ program 2> /dev/null

$ program &> /dev/null

Page 58: Unix 基礎

58

パイプ (|)

• プログラム間で入出力をつなぐ仕組み

–あるプログラムの標準出力を、あるプログラムの標準入力に接続する

–例:

cmd1 | cmd2

$ find . -type f | wc -l6

Page 59: Unix 基礎

59

何でもかんでもつながない

• なるべく少ないプロセス数で済ませる

–例:

×

×

$ cat hoge.txt | grep fuga

$ grep fuga hoge.txt

$ grep fuga hoge.txt | wc -l

$ grep –c hoge.txt fuga

Page 60: Unix 基礎

60

連続実行

• セミコロン (;) で区切ることで、複数のコマンドを連続実行できる

–例:

cmd1 ; cmd2

$ echo hello ; datehelloFri Dec 20 20:06:52 JST 2013

Page 61: Unix 基礎

61

条件付きで連続実行

• cmd1 が正常終了したら cmd2 を実行する

• cmd1 が異常終了したら cmd2 を実行する

• “正常終了” って?

– コマンドの exit status が 0 だったとき

cmd1 && cmd2

cmd1 || cmd2

Page 62: Unix 基礎

62

終了ステータス (exit status, return code)

• コマンドの実行が成功したかどうかを表す数値

–正常終了なら 0

–異常終了なら 1 以上

• 自分でスクリプトを書くときも意識しよう

–例

if (system("which git") != 0) {print STDERR "command not found¥n";exit 1;

}

Page 63: Unix 基礎

63

終了ステータス (exit status, return code)

• 直前に実行したコマンドの終了ステータスは、特殊な変数 $? に格納される

–例:

$ mkdir hoge$ echo $?0 # 直前の mkdir は成功

$ mkdir hogemkdir: hoge: File exists$ echo $?1 # 直前の mkdir は失敗

Page 64: Unix 基礎

64

アーカイブと圧縮

Page 65: Unix 基礎

65

アーカイブ

• 多数のファイルを一つのファイルにまとめること

• tar (Tape ARchives)

–アーカイブのフォーマット

–所有者、グループ、パーミッション、最終更新日時、ディレクトリ構造なども含められる

–同時に gzipなどで圧縮を行なうことが多い

Page 66: Unix 基礎

66

圧縮

• データの内容を保ったまま容量を減らすこと

• 可逆圧縮:

–情報が失われない

– bitmap, ZIP, etc.

• 非可逆圧縮:

–圧縮、展開したデータが、元のデータと完全には一致しない

– JPEG, MPEG, etc.

Page 67: Unix 基礎

67

ジョブとプロセス

Page 68: Unix 基礎

68

ジョブ

• シェルが管理するプログラムの実行単位

–端末ごとに管理される

–それを実行したシェル以外からは参照できない

• 実行中のジョブは jobs コマンドで確認できる

jobs

Page 69: Unix 基礎

69

ジョブの中断と再開

• SIGTSTP シグナルを送る (Ctrl-Z) と、フォアグラウンド (現在実行中) のジョブが中断される

• fgコマンドで再開する

–例:

$ less hoge^Z # Ctrl-Z を入力zsh: suspended less hoge # 中断$ jobs[1] + suspended less hoge$ fg # 再開

Page 70: Unix 基礎

70

バックグラウンドジョブ

• 裏で実行されているジョブ (次のジョブを実行可)

• 起動方法:

– コマンドのうしろに & を付けて起動する

–中断したジョブを bgコマンドで再開する

• ログアウト時には破棄 (SIGHUP) される

– これを防ぐには nohup コマンドを使う

command &

nohup command &

Page 71: Unix 基礎

71

プロセス

• プロセス

– OS が管理するプログラムの実行単位

–実行中のプロセスは psコマンドで確認できる

–例:

ps

$ psPID TT STAT TIME COMMAND

77869 0 Ss 0:00.02 bash79178 0 R+ 0:00.00 ps

Page 72: Unix 基礎

72

ジョブとプロセス

• 1ジョブ = 1プロセスとは限らず、1つのジョブに複数のプロセスが属する場合がある

–例:

$ ps auxww | grep root | wc -l

ジョブ

プロセス プロセス プロセス

Page 73: Unix 基礎

73

ジョブとプロセス

• 1コマンドで複数のプロセスが起動することもある

–例: man コマンドを中断したときの様子

$ psPID TTY TIME CMD

12609 ttys003 0:00.21 /bin/zsh12965 ttys003 0:00.00 man man12966 ttys003 0:00.00 sh -c (cd '/usr/share/man'… 12967 ttys003 0:00.00 sh -c (cd '/usr/share/man'…12971 ttys003 0:00.00 sh -c (cd '/usr/share/man'… 12973 ttys003 0:00.00 /usr/bin/less -is

Page 74: Unix 基礎

74

シグナル

• プロセスに非同期イベントの発生を伝える仕組み

• 発生させるには:

–端末で Ctrl-C (SIGINT)や Ctrl-Z (SIGTSTP) などを押下

– kill コマンドを使用

• 受け取ったシグナルをどう処理するかは、プロセス (プログラム) 側の任意

–ただし SIGKILL など、一部受け取れないものもある

Page 75: Unix 基礎

75

その他

Page 76: Unix 基礎

76

cron

• コマンドを自動的に定時実行する仕組み

• crontabコマンドで管理する

• 設定ファイルの書式:

–例:月〜金曜、2時間おきに program1 を実行

分 時 日 月 曜日 実行するコマンド

0 */2 * 1-5 /path/to/program1

Page 77: Unix 基礎

77

SSH (Secure SHell)

• 安全に遠隔ホストのシェルを利用する仕組み

• 鍵認証を使えばパスワードの入力を省略できる

– クライアントで鍵のペア (秘密鍵、公開鍵) を生成

• ssh-keygenコマンド

–公開鍵をホストに配置

• ~/.ssh/authorized_keys

Page 78: Unix 基礎

78

練習問題

Page 79: Unix 基礎

79

練習問題

1. 現在のユーザ名を表示せよ。

2. man で id コマンドの –g オプションの意味を調べよ。

3. コマンドサーチパスの先頭にカレントディレクトリ(.) を追加すると、どのようなことが起きるか説明

せよ。また、それを設定するとどのような危険が考えられるか。

4. ルートディレクトリ自身 (中のファイルではなく) のinode番号を確認せよ。

Page 80: Unix 基礎

80

練習問題

5. 適当なファイルを用意してシンボリックリンクとハードリンクを設定し、主に以下の点に着目して、2つのリンクの違いを検証せよ。

– コピーしたとき

– 削除したとき

6. パーミッション rwx---r-x を8進数で表わせ。

7. group のパーミッションが other より小さいとき(604 や 705 など) の動作を説明せよ。

Page 81: Unix 基礎

81

練習問題

8. 中身が空 (0byte) のファイル empty.txtを作成する方法を、できるだけたくさん挙げよ。

9. シェル変数 NOW に現在の時刻を格納せよ。時刻のフォーマットは次のようにすること。

10.次の名前で空のファイルを作成せよ。

11.ルートディレクトリにあるディレクトリの数を表示せよ。

hoge$fuga

2013-12-24T12:43:52

Page 82: Unix 基礎

82

練習問題

12.以下の記述について、コマンドが成功したときに"OK!" と表示するように変更せよ。成功時と失敗時の動作の違いを確認すること。

13.top コマンドを実行して中断し、そのときのジョブ

の状態を確認せよ。また、そのジョブを再開せずに破棄せよ。

$ mkdir test1

Page 83: Unix 基礎

83

練習問題

14.shebang 行の記述に関して、以下の2つの違いを

説明せよ。また、後者はどのような利用シーンが考えられるか。

15.適当なファイルを作成し、タイムスタンプを「2013年12月25日19時00分」に変更せよ。さらにそのファイルのmtime と ctimeを確認せよ。

#!/usr/bin/perl#!/usr/bin/env perl

Page 84: Unix 基礎

84

参考書籍

• 新Linux/UNIX入門第3版, 林晴比古著

– http://www.amazon.co.jp/dp/4797369841

Page 85: Unix 基礎

85

おわり