#
ドキュメント

Document

自分のための備忘録です。

Linuxの基礎

プロセス

  • プログラムはプロセスとしてメモリ上に展開される

    • コマンド(cdなど)からアプリケーション(Apacheなど)にいたるまでプロセスの単位で実行
  • プロセスはOSによって管理され並列処理される

  • プロセスは親子関係を持つ

  • プロセスは既存プロセスをコピーして作成する(作成したプロセスはコピー元プロセスの子プロセスになる)

    • 既存プロセスからプロセスを作成することをforkすると呼ぶ
  • forkしたプロセスの中身を入れ替えるこexecすると呼ぶ

  • プロセスは木構造になっており、ルートプロセスは最初に起動するプログラム(initまたはsystemd)になる

lsのプロセス処理

  1. カレントシェルのプロセスをforkする
  2. forkして作成した子プロセスの中身をlsコマンドにexecする

ルートプロセスの確認

$ ps auxf | less
or
$ ps aux --sort -pid

# ....
root         1  0.0  0.5 125524  5488 ?        Ss    3月26   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 # <--- pid 1はsystemd
root      1668  0.0  2.6  66124 26532 ?        Ss    3月26   0:03 /usr/lib/systemd/systemd-journald
root      1693  0.0  0.2 118808  2164 ?        Ss    3月26   0:00 /usr/sbin/lvmetad -f
# ...

ジョブ

シェルが管理している、「シェルを実行する作業単位」のことです。

http://www.code-magagine.com/?p=3372

ps/jobs

https://teratail.com/questions/27174

シグナル

「シグナル」はプロセスとプロセスの間で通信を行う際に使用される“信号”のことで、シグナルを受け取ったプロセスは“何らかの動作”を行います。

https://www.atmarkit.co.jp/ait/articles/1708/04/news015.html

[CTRL]+[C]は「SIGINT」というシグナルを行うキー操作、[CTRL]+[Z]は「SIGTSTP」というシグナルを行うキー操作です。

https://www.atmarkit.co.jp/ait/articles/1708/04/news015.html

プロセスによる面もあるが、通常CTRL + CのSIGINTは「プロセスの終了とコアダンプ出力」、CTRL + Zはプロセスの一時停止。

フォアグラウンドジョブ/バックグラウンドジョブ

ジョブにはフォアグラウンドジョブ/バックグラウンドジョブの2種類がある。

フォアグランドジョブ

  • 通常のジョブ
  • シグナルを送れる(Ctrl + C SIGINTやCtrl + Z SIGTSTPなど)
  • 1つのジョブが終わるまでシェルに入力できない
# フォアグランドのジョブを一時停止(Ctrl + z)してバックグランド実行
# 新たにフォアグランドでジョブを実行

$ sleep 100
// フォアグランドで実行されているので入力をsleep 100のジョブが終了するまで受け付けない
^Z // Ctrl + zで一時停止
[1]+  Stopped                 sleep 100
$ bg 1  // バックグランドジョブに変更
[1]+ sleep 100 &
$ jobs
[1]+  Running                 sleep 100 &
$ sleep 50
// フォアグランドで実行されているので入力をsleep 50のジョブが終了するまで受け付けない

バックグラウンドジョブ

コマンドの最後に&付与

  • シェルの画面外で動作させるジョブ
  • Ctrl + Zで停止しているジョブをbgコマンドで実行すればバックグラウンドジョブとして実行可能

rel. http://www.code-magagine.com/?p=3372

$ sleep 60 &
[1] 1275
 $ sleep 80 &
[2] 1316
 $ jobs
[1]-  Running                 sleep 60 &    // [1]はjobid
[2]+  Running                 sleep 80 &
$ fg 1
sleep 60   // sleep 60をフォアグランドで実行 Ctrl + CでSIGINTを送信できるので停止できる

ジョブが実行中でも、次のコマンドを実行することができます。

仮想コンソール

tty(TeleTypeWriter)

Macではtty000から順番に番号を振られます。
最大数は確認していませんが。

すべての仮想コンソールを確認

$ who

shiroshi console  Aug  5 12:39    # 起動時のログインユーザー?
shiroshi ttys001  Aug  5 14:02 
shiroshi ttys002  Aug  5 14:07  

現在操作している仮想コンソールの表示

$ tty
ttys002

パーミッション

新Linux/Unix 入門(p125)

以下の表は「新Linux/Unix 入門」(p125)から引用

ファイルのパーミッション

機能 説明
r 読み出し許可 -> ファイル読み込み可能
w 書き込み許可 -> ファイル書き込み可能
x 実行許可 -> ファイル実行可能

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

機能 説明
r ディレクトリリストを表示できる(具体的にはlsできる)
読み込み許可というより「表示許可」と考えると良い(rだけではdはできない)
w ディレクトリ内のファイルを削除したりサブディレクトリを作成できる
また新規ファイルの作成などができる
書き込み許可というより「作成削除許可」と考えると良い
x cdコマンドでディレクトリに移動できる。また内部をサーチできる
これが不許可のときは、そのディレクトリ以下を見ることができない
実行許可というより「検索許可」と考えると良い。

パーミッションの例

ファイルのパーミッションは理解しやすいですがディレクトリのパーミッションは誤解しやすい点があるのでいくつか例を記載します。

例1

sample
    |-- sub 100

sub100なので、sample$ ls su2を実行できません。

$ ls sub
ls: sub: Permission denied

例2

説明を単純にするため所有者以外の権限は全て不許可へ設定します。

$ mkdir mydir
$ chmod 700 mydir
$ ls -al | grep mydir

drwx------   2 shiroshi  staff   68  8  5 13:17 mydir

ファイルを作成します。

$cat > mydir/file.txt
aaa
ctrl + D

ディレクトリのパーミションの読み書きを不許可(100)にします。

$ chmod 100 mydir
$ ls -al | grep mydir

d--x------   3 shiroshi  staff  102  8  5 13:22 mydir

ディレクトリのパーミションは、ファイルのパーミションとは独立しているので、mydirに作成したファイルは読み書き可能です。

書き込み

$ echo 'bbb' >> mydir/file.txt             # >> は追記

読み込み

$ less mydir/file.xtx

aaa
bbb

一方ディレクトリの読み書きを不許可にしたので下記操作はパーミッションエラーが発生します。
ディレクトリの書き込みが不許可のため新規ファイル(およびサブディレクトリ)は作成できません。

$ cat > mydir/new.txt

-bash: mydir/new.txt: Permission denied
$ ls -al mydir

ls: : Permission denied

次にディレクトリの読み書きを許可し実行を不許可にします。 mydir以下の内容は検索できなくなるので下記コマンドはパーミッションエラーとなります。

$ cd mydir

cd: mydir: Permission denied
$ cat > mydir/file.txt

-bash: mydir/file.txt: Permission denied

$ less mydir/file.txt

mydir/file.txt: Permission denied

読み込みが許可されているのでlsコマンドは使用できます。

$ ls -al mydir | grep mydir

drw-------   3 shiroshi  staff  102  8  5 13:22 mydir

書き込みが許可されていてもmydir以下の内容がわからないので実際は新規作成はできません。

$ cat > mydir/file2.txt

-bash: mydir/file2.txt: Permission denied

パーミッションマスク値の設定

現在のマスク値確認

$ umask

0022

マスク値設定

$ umask 222
  • 新規ファイルは444で作成されます。
  • 新規ディレクトリは555で作成されます。

UNIXはファイルを作成するとき、仮パーミッション0666と、設定されたマスクの否定値をアンド計算してパーミッションを決定しています。またディレクトリを作成するときは 仮パーミッション0777と、設定されたマスクの否定値をアンド計算してパーミッションを決定しています。

「新UNIX/Linux入門」(p123)

ユーザー

ユーザーを追加

$ sudo useradd foo

fooユーザーを作成すると同時にfooグループが作成されてfooユーザーのプライマリーグループとなります。

パスワードを設定

# ユーザー foo のパスワードを変更。
$ sudo passwd foo
新しいパスワード:

suコマンド

$su - foo

sudo/su - root

sudoを実行可能なユーザー/コマンド情報は/etc/sudoersで定義します。 (/etc/sudoersを編集するvisudoコマンドがあります。)

sudoで必要なパスワードは、現在のユーザーのパスワードです。rootユーザーのパスワードではありません。
したがってrootユーザーのパスワードを一般のユーザーへ知らせる必要はありません。 (/etc/sudoersの定義によりパスワード入力なしでsudoできるユーザーも可能です。)

一方 suでrootユーザーへ変更するときはrootのパスワードが必要になります。

ユーザー関連ファイル

ユーザー/グループ関連のファイルは/etcにあります。

  • /etc/passwd ユーザー情報
  • /etc/group グループ情報
  • /etc/sudoers sudoとユーザーを関連付ける情報

etc/passwd

第1フィールド: ユーザ名(ログイン名)
 第2フィールド: (暗号化パスワード)
 第3フィールド: ユーザ番号(UID)
 第4フィールド: グループ番号(GID)
 第5フィールド: コメントフィールド(名前など)
 第6フィールド: ホームディレクトリーのパス
 第7フィールド: ログイン・シェル

2.2 パスワードファイル /etc/passwd の構造

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
lxd:x:105:65534::/var/lib/lxd/:/bin/false
uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
mysql:x:111:116:MySQL Server,,,:/nonexistent:/bin/false

uidを取得

現在のユーザー

$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(lxd),114(netdev)
$ id root
uid=0(root) gid=0(root) groups=0(root)
$ sudo id
# rootによってidを実行したことになる
uid=0(root) gid=0(root) groups=0(root)

グループ

グループを追加

$ sudo groupadd mygroup

グループへメンバーを追加

# fooユーザーをmygroupへ追加
$ sudo gpasswd -a foo mygroup

グループからメンバーを削除

$ sudo gpasswd -d foo mygroup

グループを確認

$ groups foo

グループ一覧

less /etc/group

root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,ubuntu
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:ubuntu
fax:x:21:
voice:x:22:
cdrom:x:24:ubuntu
floppy:x:25:ubuntu
tape:x:26:
sudo:x:27:ubuntu
audio:x:29:ubuntu
dip:x:30:ubuntu
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:ubuntu
sasl:x:45:
plugdev:x:46:ubuntu
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
systemd-journal:x:101:
systemd-network:x:102:
systemd-resolve:x:103:
input:x:104:
crontab:x:105:
syslog:x:106:
messagebus:x:107:
lxd:x:108:ubuntu
mlocate:x:109:
uuidd:x:110:
ssh:x:111:
landscape:x:112:
admin:x:113:
netdev:x:114:ubuntu
ubuntu:x:1000:www-data
ssl-cert:x:115:
mysql:x:116:

マウント

現在のマウントを確認します。

$ mount

またディスク容量を調べるdf(Disk Free)コマンドは空容量だけでなくでマウント位置情報を調べることができます。

ファイルシステムの構築(フォーマット)はmkfsコマンドを使用します。

$ mkfs -t タイプ名 デバイス名
// 例
$ sudo mkfs -t ext4 /dev/xvdf

※ Linuxのファイルシステムは、ほぼext4

/etc/fstabファイルで決められたマウントを自動で行うことができます。

またAmazon LinuxではEBS(Amazon Elastic Block Store ブロックデバイス)を表示する下記コマンドが使えます。

$ lsblk

    NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0   8G  0 disk 
    └─xvda1 202:1    0   8G  0 part /

マウント(mount

mountdfやAWSのlsblkで調べたデバイス名をLinuxファイルシステムにマウントするには下記コマンドを使用します。

mount [-t ファイルシステムタイプ] デバイス名 マウントポイント名

アンマウント(unmount

umount デバイス名またはマウントポイント名

マウント例) デバイス名/dev/xvdg、マウントポイント/data

  1. デバイスにファイルシステム構築
  2. デバイスをマウント

/dev/xvdgはデバイスが挿入されたときにLinuxにより自動で命名されます。

/dev/xvdgデバイスにext4ファイルシステムを構築します。

$ sudo mkfs -t ext4 /dev/xvdf

マウントポイント(ディレクトリ)を作成します。

$ sudo mkdir /data
$ sudo chown ubuntu /data  
$ sudo chgrp ubuntu /data  
$ sudo chmod 755 /data

マウントします。

$ sudo mount -t ext4 /dev/xvdf /data

システムブート時に常にマウントするよう/etc/fstabファイルを編集します。
fstab(file system table)ファイルへ/dev/xvdfを追加します。

Amazon Linux

/dev/xvdf   /data   ext4    defaults,nofail 0 2

Ubuntu

/dev/xvdf   /data   ext4    defaults,nofail,nobootwait 0 2

Amazon Linuxではnobootwaitを付けるとマウントできませんでした。

リンク

シンボリックリンク

オリジナルのシンボリックリンクlink.txtを作成

$ ln -s original.txt symlink.txt

ハードリンク

$ ln original.txt hardlink.txt

realdirディレクトリのシンボリックリンクcurrentディレクトを作成します。

$ mkdir realdir
$ echo "This is file1" > realdir/test1.txt
$ echo "This is file2" > realdir/test2.txt

realdirディレクトリのシンボリックリンクcurrentディレクトリを作成。

$ ln -s realdir current
$ ll
lrwxr-xr-x   1 shiroshi  staff     7B  8 23 19:11 current -> realdir
drwxr-xr-x   4 shiroshi  staff   136B  8 23 19:11 realdir

シンボリックリンクを編集すると実体も編集されます。

起動

service {{service_name}} start `systemctl start {{service_name}}'