かべぎわブログ

ブログです

改めてLinuxの主要ディレクトリについてまとめてみる

いろいろとわすれがちというかなんというかなのでLinuxのディレクトリ構成についてまとめてみた。
ディストリビューションによってちがうとはおもうんだけれどだいたい以下のような感じなんじゃないか。

Linuxの主要ディレクトリ

/bin

lscatcpなどの一般ユーザが利用できる基本コマンドが格納されているディレクトリ

/sbin

shutdownhaltなどの管理者が利用するコマンドが格納されているディレクトリ

/boot

LinuxカーネルなどのOSの起動に必要なファイルが配置されているディレクトリ
ブートログもここに格納されている。

/dev

デバイスファイルが格納されているディレクトリ
例えばSCSIタイプのディスクである/dev/sdaや、/dev/cpuなどがある。
/dev/null/dev/randomなどのスペシャルファイルもここに格納されている。

/etc

OSやアプリケーションなどのさまざまな設定ファイルが格納されるディレクトリ
/etc/hosts/etc/passwd/などの基本的なものから、追加したアプリケーションの設定ファイルもだいたいここに格納される。

/home

一般ユーザのホームディレクトリが格納されるディレクトリ
たとえばwawawaというユーザがいたとすると/home/wawawaがwawawaユーザのホームディレクトリになる。
ちなみにrootユーザは/rootがホームディレクトリになる。

/lib

共有ライブラリがが格納されているディレクトリ
/bin/sbinのコマンドを実行するのに利用される。
ここには基本的に32bit用のライブラリが格納される。
64bit用のライブラリは/lib64に格納される。

/proc

プロセスに関する情報が格納されるディレクトリ
/proc/5384などの数字のディレクトリはプロセス番号を意味する。
プロセスのステータスを確認する際などに利用される。
/proc/cpuinfo/proc/meminfoなどからCPUやメモリのステータスを確認することもできる。

/tmp

一時的に利用するファイルを格納するディレクトリ
メモリ上にデータが展開されているため、サーバを再起動するとここの中身は消えてしまう。

/usr

各ユーザが共通して利用するプログラムやソースが格納されているディレクトリ

/var

ログやキャッシュなどシステムが吐き出すものが格納されているディレクトリ
稼動ログが格納される/var/log/や、アプリケーションが一時ファイルとしてスプールを格納する/var/spool/などが配下にあります。
メールキューやプロセスのロックファイルなどもここにあります。

新しいLinuxの教科書

新しいLinuxの教科書

boto3のclientとresourceのちがい

概要

boto3におけるclientとresourceのちがいについて雑に調べたのでまとめる。

client

  • 低レベルのサービスアクセスAPI
  • 呼び出すたびにターゲットとなるリソースを明示的に指定する必要がある
  • そのため抽象化するには不向きかも
  • レスポンスがJSON形式

resource

  • 高レベルのオブジェクト指向API
  • オブジェクト指向なプログラミングで扱いやすい
  • すべてのAWSサービスでこのresourceが用意されているわけではない

おわりに

雑まとめ

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

シェルスクリプトでFizzBuzzをつくる

概要

なんだかんだで一度もやったことがなかったのでシェルスクリプトでFizz Buzzをつくってみました。

スクリプト

おわりに

ワイン飲みながら所要時間6分くらい
なかなかなのでは?

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

Ansibleのwin_fileでファイルやフォルダを作成/削除する

概要

Ansibleのwin_fileモジュールを利用して、Windows上にファイルやフォルダを作ったり、それを削除してみたいと思います。

ファイルを作成する

以下のようなかんじでファイルを作成することができます。
ファイルが存在しない場合は空ファイルが作成されます。

- hosts: windows
  gather_facts: false
  tasks:
    - name: Touch a file (creates if not present, updates modification time if present)
      win_file:
        path: F:\test\wawawa.txt
        state: touch

ファイルを削除する

pathに指定したファイルを削除します。
ファイルが存在しない場合でもfailedになりません。
存在する場合のみ削除が行われます。

- hosts: windows
  gather_facts: false
  tasks:
    - name: Remove a file, if present
      win_file:
        path: F:\test\wawawa.txt
        state: absent

フォルダを作成する

pathに指定したフォルダを作成してくれます。
存在しないものをすべて作成してくれます。
mkdir -pと同じ動きと考えるとわかりやすいです。

- hosts: windows
  gather_facts: false
  tasks:
    - name: Create directory structure
      win_file:
        path: F:\test\wawawa\sasasa
        state: directory

フォルダを削除する

pathに指定したフォルダを削除します。
たとえば以下の例ならsasasaフォルダだけを削除します。
pathのフォルダを存在しなくてもfailedにはなりません。

- hosts: windows
  gather_facts: false
  tasks:
    - name: Remove directory structure
      win_file:
        path: F:\test\wawawa\sasasa
        state: absent

おわりに

基本的にこれの内容
https://docs.ansible.com/ansible/latest/modules/win_file_module.html

あとstate: fileの使いみちがわからぬ

インフラCI実践ガイド Ansible/GitLabを使ったインフラ改善サイクルの実現

インフラCI実践ガイド Ansible/GitLabを使ったインフラ改善サイクルの実現

rsyncでサーバ間の同期を鍵認証で行う

概要

rsyncコマンドをつかって鍵認証でログインする2台のサーバの同期をしてみます。

コマンド

鍵認証のサーバ間でrsyncを利用する際は-eオプションのあとに、sshコマンドを記述します。

以下はリモートからローカルに同期をとるときのコマンド

$  rsync -av -e 'ssh -i ~/.ssh/wawawa-key.pem' ec2-user@172.22.1.1:/home/ec2-user/remote /home/ec2-user/local


以下はローカルからリモートへ同期をとるときのコマンド
-eオプションはリモートサーバの記載の直前に書く必要があります。

$  rsync -av  /home/ec2-user/local -e 'ssh -i ~/.ssh/wawawa-key.pem' ec2-user@172.22.1.1:/home/ec2-user/remote

おわりに

同期できます。

[試して理解]Linuxのしくみ ?実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ?実験と図解で学ぶOSとハードウェアの基礎知識

haltとかrebootとかはsystemctlのシンボリックリンクだった

概要

haltとかrebootとかpoweroffとかそういう起動/停止/再起動系のコマンドはsystemctlのシンボリックリンクだった。

こんなかんじ

$ ls -l `which halt`
lrwxrwxrwx 1 root root 16  1月 16 18:45 /usr/sbin/halt -> ../bin/systemctl

$ ls -l `which reboot`
lrwxrwxrwx 1 root root 16  1月 16 18:45 /usr/sbin/reboot -> ../bin/systemctl

$ ls -l `which poweroff`
lrwxrwxrwx 1 root root 16  1月 16 18:45 /usr/sbin/poweroff -> ../bin/systemctl

まとめ

だからどうってわけじゃないんだけれどsudo systemctl rebootとか書いたほうが上級者感がでてかっこいいとおもった。

CentOS7で作るネットワークサーバ構築ガイド (Network server construction gu)

CentOS7で作るネットワークサーバ構築ガイド (Network server construction gu)

systemctlでよくつかうオプションまとめ

概要

なんか意外と忘れがちなsystemctlコマンドのよくつかいそうなオプションをまとめてみる。

サービスの起動

起動しても標準出力にはなにもでない。

$ sudo systemctl start wawawa.service

サービスの停止

停止しても標準出力にはなにもでない。

$ sudo systemctl stop wawawa.service

サービスの再起動

再起動しても標準出力にはなにもでない。

$ sudo systemctl restart wawawa.service

サービスのリロード

再起動とリロードの違いは設定ファイルを再読込するかしないか。
リロードの場合は再読込が行われる(reloadに対応していれば)

$ sudo systemctl reload wawawa.service

自動起動の有効化

$ sudo systemctl enable wawawa.sevice

自動起動の無効化

$ sudo systemctl diasble wawawa.service

自動起動が有効か確認する

有効であればenabled
無効であればdiasbaledが出力される。

$ systemctl is-enabled wawawa.service
enabled

ユニットがアクティブかどうか確認する

アクティブであればactive
ノンアクティブであればfailedが出力される

$ systemctl is-active wawawa.service
active

サービスの強制終了

$ sudo systemctl kill wawawa.service

サービスにシグナルを送信する

シグナルはすきなやつを指定してあげて。

$ sudo systemctl kill wawawa.service --signal 9

ユニットの設定の詳細を確認する

$ systemctl show wawawa.service
Type=notify
Restart=no
NotifyAccess=main
~~~省略~~~

ユニットの起動状態を確認する

$ systemctl status wawawa.service
● wawawa.service - The wawawa Server
   Loaded: loaded (/usr/lib/systemd/system/wawawa.service; disabled; vendor preset: disabled)
   Active: active (running) since 土 2018-06-02 14:12:05 UTC; 19min ago
~~~省略~~~

全ユニットをリスト表示する

--typeオプションをつけることで結果を絞ることもできます。
たとえば--type serviceとすればサービスだけ出力されます。

$ systemctl list-units

systemdをリロードする

新規にユニットファイルを作ったときや、/etc/systemd/system/配下のファイルをいじったときに利用する。

$ sudo systemctl daemon-reload

標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド

標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド

  • 作者: 有限会社ナレッジデザイン大竹龍史,市来秀男,山本道子,山崎佳子
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2017/03/22
  • メディア: 単行本
  • この商品を含むブログを見る

Lambda(Python)でAMIとそれに紐付いたスナップショットの世代管理をする

概要

Lambda(Python) を利用してAMIとそれに紐付いているスナップショットの世代管理をしてみようと思います。

スクリプト例

ちょっとした説明

タグにauto_backupと書いてあるAMIの世代管理をしてくれます。
上の方の変数generationに指定した数だけAMIを保持して、それを超過する分は古いものから削除していきます。

おわりに

CloudWatchScheduleとかでまわせば自動でやってくれるよ

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

systemdのユニットの種類についてまとめる

概要

systemdのユニットの種類について勉強し直したのでまとめメモ。

そもそもsystemdとは?

  • Linuxの起動システムで、UpstartやSysVinitの代替として開発された。
  • 2014年にRHEL7/CentOS7に採用された。
  • 2015年にDebian/Ubuntuに採用された。
  • systemdはユニットと呼ばれる単位でシステムを起動する。
  • システムの起動時にユニットを並列で処理することで起動速度が向上する。

ユニットの種類まとめ

拡張子 説明
.service プロセスの起動/停止/再起動などを定義する
.device デバイスの情報が定義される(udevで自動的に生成される)
.target 複数のユニットをまとめるユニット
.socket ソケットの監視設定を定義する(xinetdの代替として利用できる)
.path 指定されたパスを監視して、ファイルが作成されると指定されたサービスを起動する
.mount 指定したファイルシステムをマウントする(fstabによっても自動生成される)
.automount オートマウントの処理を定義する(fstabによっても自動生成される)
.timer 時間指定で処理を実行できる(cronの代わりにもなる)
.swap 指定されたスワップ領域を有効化する(fstabによっても自動生成される)

おわりに

おわりd

CentOS7システム管理ガイドsystemd/NetworkManager/Firewalld徹底攻略

CentOS7システム管理ガイドsystemd/NetworkManager/Firewalld徹底攻略

$RANDOMの精度があまりよくないという話をきいたのでしらべてみる

概要

$RANDOMは乱数としてはそんなに精度が高くないみたいなはなしを聞いたような聞かなかったようなきがしたので雑に調べてみる。

調べ方

  1. echo ${RANDOM}を無限ループでぶん回す
  2. 1億行くらいになったら止める
  3. ばらつきを集計する

1. echo ${RANDOM}を無限ループでぶん回す

だいたいこんなかんじでぶんまわす。

while true
do
    echo ${RANDOM} >> ./random.txt
done

2. 1億行くらいになったら止める

やりすぎた。

$ wc -l random.txt
110424165 random.txt

ちなみにファイルサイズ的にはこんくらい

$ ls -lh random.txt 
-rw-rw-r-- 1 ec2-user ec2-user 597M  6月  1 06:07 random.txt

3. ばらつきを集計する

sortしてuniqしてawkでごにょごにょ

$ sort -n < sample-3.txt | uniq -c | awk '{a+=$1; print $2, $1}'

こんなかんじでどの値が何回出力されたかがわかるようになる。

0 3400
1 3398
2 3352
3 3479
4 3306
5 3391
6 3376
7 3450
8 3376
9 3323

結果

グラフでだすとこんなかんじ f:id:kabegiwakun:20180601154052p:plain

出現回数ランキングでいくとこんなかんじ (2カラム目が出現回数)

おおいランキング

$ cat result.txt | sort -nk 2 -r | head
14330 3614
18986 3580
16599 3575
15505 3575
23779 3570
3823 3564
29794 3564
12101 3564
27530 3563
19883 3563

すくないランキング

$ cat result.txt | sort -nk 2 | head
22708 3126
24616 3153
10652 3154
1871 3158
24720 3164
4305 3169
16935 3173
1124 3174
24263 3175
12221 3176

その差は488

$ echo "3614 - 3126" | bc
488

まとめ

なるほどわからん

新しいシェルプログラミングの教科書

新しいシェルプログラミングの教科書

シェルスクリプト上で乱数を扱う方法まとめ3選

概要

シェルスクリプトを書いていて、乱数が使いたいなーと思ったときにつかえるコマンドをご紹介します。

${RANDOM}をつかう

bashのシェル変数である${RANDOM}を利用します。
この変数は参照されるたびに0~32767の値を返します。
手っ取り早いですが、あまり乱数の精度としては高くないという欠点があります。

$ echo ${RANDOM}
15332

/dev/randomまたは/dev/urandomをつかう

これらの疑似デバイスを利用することでより精度の高い乱数を生成することができます。
デバイスドライバや環境によるノイズを利用して真の乱数性を得ることができます(よくわかっていない)

実行する際は以下のようにodコマンドを利用し読み出す必要があります。

$ od -An -tu2 -N2 /dev/random
53488                                    
$ od -An -tu2 -N2 /dev/urandom
33190                             

(/dev/random/dev/urandomの違いについてはむずかしいので省略します 。)

jotコマンドをつかう

このコマンドはseqなどと同様に数列を生成するのに長けているコマンドですが、-rオプションをつけることで乱数を生成することができます。
また、乱数の範囲を設定することも可能です。

jot -r データ数 下限値 上限値で指定します。

$ jot -r 5 7 15
8
10
14
9
8

おわりに

ひさしぶりにまじめに書いた。

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

Pythonのshutilのcopytreeでファイルを再帰的にコピーする

概要

Pythonのshutilcopytreeを利用してファイルを再帰的にコピーしてみようと思います。

コード例

shutil.copytree('コピーもと', 'コピーさき')
です。

実行してみる

forudaBBBがないことを確認

$ ls -l forudaAAA/ forudaBBB/
ls: forudaBBB/ にアクセスできません: No such file or directory
forudaAAA/:
合計 4
-rw-rw-r-- 1 ec2-user ec2-user 7  5月 30 11:18 moto.txt

copytreeを実行

$ ./shutil_copytree.py 

ファイルがコピーできました!!!

$ ls -l forudaAAA/ forudaBBB/
forudaAAA/:
合計 4
-rw-rw-r-- 1 ec2-user ec2-user 7  5月 30 11:18 moto.txt

forudaBBB/:
合計 4
-rw-rw-r-- 1 ec2-user ec2-user 7  5月 30 11:18 moto.txt```

おわりに

再帰コピーは大事。

入門 Python 3

入門 Python 3

Pythonのshutilのcopyfileでファイルをコピーする

概要

Pythonのshutilcopyfileを利用してファイルをコピーしてみようと思います。

コード例

shutil.copyfile('コピーもと', 'コピーさき')
です。

実行してみる

saki.txtなんてものがないことを確認(moto.txtはある)

$ ls -l moto.txt saki.txt
ls: saki.txt にアクセスできません: No such file or directory
-rw-rw-r-- 1 ec2-user ec2-user 7  5月 30 10:48 moto.txt

copyfileを実行

$ ./shutil_copyfile.py 

ファイルがコピーできました!!!

$ ls -l moto.txt saki.txt
-rw-rw-r-- 1 ec2-user ec2-user 7  5月 30 10:48 moto.txt
-rw-rw-r-- 1 ec2-user ec2-user 7  5月 30 10:51 saki.txt

おわりに

コピーは大事。

入門 Python 3

入門 Python 3

Pythonのpathlibのmkdir()でディレクトリを作成する

概要

Pythonのpathlibmkdir()をつかってディレクトリを作成してみます。

コード例

実行してみる

ディレクトリができた!!!

$ ls -ld /home/ec2-user/tsukuri
ls: /home/ec2-user/tsukuri にアクセスできません: No such file or directory


$ ./pathlib_mkdir.py

[ec2-user@wawawa_server blog_python]$ ls -ld /home/ec2-user/tsukuri
drwxrwxr-x 2 ec2-user ec2-user 6  5月 30 10:27 /home/ec2-user/tsukuri

おわりに

フォルダができた!!!

入門 Python 3

入門 Python 3

Pythonのpathlibで相対パスと絶対パスを取得する

概要

Pythonのpathlibモジュールを利用して、相対パスと絶対パスを取得してみたいと思います。

コード例

実行してみる

こんなかんじで相対パスと絶対パスが出力されていることがわかります。

$ ./blog_python/path.py 
blog_python/path.py
/home/ec2-user/blog_python/path.py

おわりに

べた書きはやめよう

入門 Python 3

入門 Python 3