20201128のLinuxに関する記事は10件です。

Linux(centos)でファイル容量を追加する(OCI)

やりたいこと

ルートボリュームを拡張して容量を増やしたい。
OCI上で作成したcentosのカスタムイメージのブートボリュームサイズが74Gあるはずなのに、ルートに27Gしか割り当てられていない。
20201128-234443.jpg

# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   27G   21G  5.7G  79% /  <-ルートの容量少ない
devtmpfs                 7.7G     0  7.7G   0% /dev
tmpfs                    7.7G  666M  7.0G   9% /dev/shm
tmpfs                    7.7G  9.3M  7.7G   1% /run
tmpfs                    7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/sda1                497M  377M  121M  76% /boot
tmpfs                    1.6G     0  1.6G   0% /run/user/1001
tmpfs                    1.6G  8.0K  1.6G   1% /run/user/42
tmpfs                    1.6G     0  1.6G   0% /run/user/0

lsblkで確認すると、ルートボリュームはちゃんと74Gある。
これをsda2のパーテーションのcentos-rootの論理ボリュームに割り当てられればいいはず。

# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   74G  0 disk
|-sda1            8:1    0  500M  0 part /boot
`-sda2            8:2    0 29.5G  0 part
  |-centos-root 253:0    0 26.5G  0 lvm  /  <-この論理ボリュームのサイズを変更したい
  `-centos-swap 253:1    0    3G  0 lvm  [SWAP]

手順

  1. パーテーションの拡張
  2. 物理ボリュームの拡張
  3. ボリュームグループの拡張
  4. 論理ボリュームの拡張

パーテーションの拡張

まず、sda2のパーテーションを拡張する。
パーテーションの拡張にはgrowpartコマンドを使う。インストールされていなければ以下のコマンドでインストールする。

yum install cloud-utils-growpart

拡張したいのがsda2なので、以下のようにする。

growpart /dev/sda 2

パーテーションが拡張されていることを確認

lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   74G  0 disk
|-sda1            8:1    0  500M  0 part /boot
`-sda2            8:2    0 73.5G  0 part
  |-centos-root 253:0    0 26.5G  0 lvm  /
  `-centos-swap 253:1    0    3G  0 lvm  [SWAP]

物理ボリュームの拡張

今の状態だと、以下のように物理ボリュームがもとの29Gのままなので、拡張したパーテーションに合わせてリサイズする。

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               29.51 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              7554
  Free PE               10
  Allocated PE          7544
  PV UUID               NmQczi-IDdX-u2ur-R2rS-kRqC-3Rqh-RgaM02

パーテーションのリサイズ

# pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

74Gに拡張されていることを確認

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               <73.51 GiB / not usable 1.98 MiB  <-増えた
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              18818
  Free PE               11274  <-増えた
  Allocated PE          7544
  PV UUID               NmQczi-IDdX-u2ur-R2rS-kRqC-3Rqh-RgaM02

ボリュームグループの拡張

最終的に論理ボリュームのサイズを変更したいわけだが、論理ボリュームを拡張するためには属しているボリュームグループのサイズに余裕がなければいけない。

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/centos/swap
  LV Name                swap
  VG Name                centos
  LV UUID                lIVi2W-P3rg-OAYO-e9bC-o5yJ-j4js-tBo1DY
  LV Write Access        read/write
  LV Creation host, time master-cent-7, 2017-03-15 11:42:42 +0900
  LV Status              available
  # open                 2
  LV Size                3.00 GiB
  Current LE             768
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos  <-所属しているボリュームグループ
  LV UUID                OB6yWT-sVMJ-VBBz-2zJs-3fAM-BHg2-PThXeX
  LV Write Access        read/write
  LV Creation host, time master-cent-7, 2017-03-15 11:42:42 +0900
  LV Status              available
  # open                 1
  LV Size                <26.47 GiB <-最終的にはこれを増やしたい
  Current LE             6776
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

ボリュームグループは物理ボリュームの拡張をすると勝手に増えているはず。

# vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <73.51 GiB   <-ちゃんと74G近くまで容量がある
  PE Size               4.00 MiB
  Total PE              18818
  Alloc PE / Size       7544 / <29.47 GiB
  Free  PE / Size       11274 / <44.04 GiB
  VG UUID               FcpCT9-veHG-wGYW-iiu0-OumY-nROp-sPTHIm

論理ボリュームの拡張

lvextendで容量を増やす。+40Gは追加する容量のサイズを指定する。

# lvextend -L +40G /dev/centos/root
  Size of logical volume centos/root changed from <26.47 GiB (6776 extents) to <66.47 GiB (17016 extents).
  Logical volume centos/root successfully resized.

lvdisplayで正しく追加されていることを確認

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/centos/swap
  LV Name                swap
  VG Name                centos
  LV UUID                lIVi2W-P3rg-OAYO-e9bC-o5yJ-j4js-tBo1DY
  LV Write Access        read/write
  LV Creation host, time master-cent-7, 2017-03-15 11:42:42 +0900
  LV Status              available
  # open                 2
  LV Size                3.00 GiB
  Current LE             768
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos
  LV UUID                OB6yWT-sVMJ-VBBz-2zJs-3fAM-BHg2-PThXeX
  LV Write Access        read/write
  LV Creation host, time master-cent-7, 2017-03-15 11:42:42 +0900
  LV Status              available
  # open                 1
  LV Size                <66.47 GiB   <-増えている
  Current LE             17016
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

ファイルシステムの拡張

xfs_growfsでファイルシステムを拡張する。

# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=1734656 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=6938624, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=3388, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 6938624 to 17424384

これで期待通りルートの容量が増えた。

# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   67G   21G   46G  32% /       <-期待通り増えている
devtmpfs                 7.7G     0  7.7G   0% /dev
tmpfs                    7.7G  666M  7.0G   9% /dev/shm
tmpfs                    7.7G  9.2M  7.7G   1% /run
tmpfs                    7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/sda1                497M  377M  121M  76% /boot
tmpfs                    1.6G     0  1.6G   0% /run/user/1001
tmpfs                    1.6G   12K  1.6G   1% /run/user/42
tmpfs                    1.6G     0  1.6G   0% /run/user/0
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

非ツイッター民が黒い画面からツイートしてみた件について

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SUIDを使って、読み取り権限のないファイルを読み込みたい

やりたいこと

Linux上で、あるユーザにプログラムを実行させたい。プログラムでは別のファイルを読み込む必要があるのだが、読み込むファイルの内容は実行ユーザには見せずに秘密にしたい。そんな都合の良い事って一体できるのかしら。

今回試してみる例

  • 登場するユーザ
    • mario : 各ファイルの所有者
    • koopa : 実行ファイルを実行するユーザ。秘密ファイルにはアクセスさせたくない

実行ファイルと秘密にしたいファイルが、以下のように格納されているとする。

.
├── load_secret  # 実行ファイル。秘密にしたいファイルをReadする
└── secret
    └── file.txt # 秘密にしたいファイル

secret/ディレクトリは以下のようなパーミッションになっており、marioしかアクセスできない。

# ls -l | grep " secret"
drwxr-x--- 1 mario mario     4096 Nov 28 12:48 secret

実行ファイルにSUID(またはSGID)を付与すれば可能

とりあえずは結論。
実行ファイルのパーミッションが以下の状態になればOK。これをSUID(Set User ID)という。

# ls -l | grep " load_"
-rwsr-xr-x 1 mario mario 14832832 Nov 28 12:48 load_secret

ポイントは、ファイル所有者の実行権限が「s」となっているところ。このシンボルがついている場合、どのユーザが実行しても必ずファイルの所有者(本例ではmario)の権限で実行される。そのため、例えば以下のようにkoopaになって実行しても、直接はアクセスできないsecret/file.txtを読み取ることができる。

# su koopa
$ ./load_secret
(secret/file.txtを読み取り、プログラムは無事に終了する)

パーミッションの「s」は例えば、chmodコマンドで以下のようにすれば付与可能

# ls -l | grep " load_"
-rwxr-xr-x 1 mario mario 14832832 Nov 28 12:48 load_secret
# chmod u+s load_secret
# ls -l | grep " load_"
-rwsr-xr-x 1 mario mario 14832832 Nov 28 12:48 load_secret

参考までに、「s」はグループに対しても付与可能。これをSGID(Set Group ID)という。
SGIDの場合は、任意のユーザがグループ権限でファイルを実行する設定となる。

# ls -l | grep " load_"
-rwxr-xr-x 1 mario mario 14832832 Nov 28 12:48 load_secret
# chmod g+s load_secret
# ls -l | grep " load_"
-rwxr-sr-x 1 mario mario 14832832 Nov 28 12:48 load_secret

動作確認

本当にできるのか実際に試してみる。
まず、secret/file.txtの中身は以下。

secret/file.txt
Wa-hoo!
Oh yeah!
Mario time!

続いてload_secretだが、今回は下記のようなPythonでコードを書いてバイナリを作ることにする。(バージョンは3系を利用)

load_secret.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

if __name__ == '__main__':
  with open("./secret/file.txt", "r") as f:
    file_str = f.read()
    print(file_str) # ファイルの中身表示(秘密だから実際はやらないだろうが…)

Pythonスクリプトのバイナリ化は「pyinstaller」というのでできるらしいのでこれを利用する。

pyinstallerをインストールして、バイナリファイルを作成
※便宜上、プロンプトの()内に現在のユーザ名を記載

$(mario) pip install pyinstaller
$(mario) pyinstaller load_secret.py --onefile

バイナリファイルは./dist配下にできるので、カレントにコピー

$(mario) cp ./dist/load_secret .

SUIDの権限を付与

$(mario) chmod u+s load_secret
$(mario) ls -l | grep " load_"
-rwsr-xr-x 1 mario mario 14832832 Nov 28 12:48 load_secret

koopaになって実行すると、直接は見れないファイルを読み込めることを確認!

# su koopa
$(koopa) ./load_secret
Wa-hoo!
Oh yeah!
Mario time!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2でSambaを構築し、ファイル共有を確認する

はじめに

AWS初心者が、練習目的でEC2を使ってSambaを勉強・構築した際の情報・手順をまとめた物です。
SambaでWindows用ファイルサーバとして構築し、Windowsのクライアントからファイル共有をしてみます。
同じような情報は既にあるので、解説を細かくしすぎず、かつ少し余談を交えた記事にしています。

目的

  • Sambaを構築して、構築・ファイル共有の流れと感覚を掴む。
  • さらっとやってみる。
  • WindowsServerをリモートで操作してみる。

構成図

練習用samba構成.jpg

  • EC2 OS:AmazonLinux2  (ファイルサーバー用) ポート:22(SSH)・445(TCP)
    ※ファイル共有用に445だけ開けていますが、その他の機能を使う場合は対応した他のポートも開ける必要があります。

  • EC2 OS:WindowsServer2019 (クライアント用) ポート:3389(RDP)

同一パブリックサブネット内にAmazonLinux2とWindowsServerのEC2を用意していて下さい。

EBSの無料枠の30GBを超えるはずなので、課金が発生しますが数時間で消す予定なので「超」低額だと思います。
その辺りが気になる方は公式でお調べ下さい。

終わったらささっと消しましょう。

パブリックにファイル共有サーバを置くのは実運用としては駄目でしょうが、練習・検証用ですので続行します。

全体の流れ

  1. Sambaとは
  2. Sambaをインストール、Samba用ユーザーの作成
  3. クライアントからSambaにアクセス、共有ファイルの作成
  4. Samba側から共有ファイルを確認

1. Sambaとは

今回使っている「Samba」はLinuxをWindowsのファイルサーバにするだけの物ではありません。

Windowsで使われているネットワークプロトコル(SMB・CIFS)を使うことで、LinuxでWindowsのネットワークシステムに参加する事が出来るようにするフリーソフトウェアです。
ファイル共有・プリンタ共有・ドメインコントローラー等のWindowsネットワークの諸機能を有しています。
よって、LinuxからWindowsのネットワークにアクセスできるようにさせるクライアント機能もある訳です。

そんな認識の上で、今回は単にファイル共有サーバの機能を利用させて頂きます。

2.Sambaをインストール、Samba用ユーザーの作成

Sambaのインストール

LinuxのEC2にSSHして、rootに切り替えます。

sudo su -

そしてSambaをインストールします。

yum -y install samba

Samba用ユーザーの作成

Sambaを利用するためにLinuxユーザーを作成します。

useradd samba-test
passwd samba-test

Changing password for user samba-test.
New password: 
Retype new password:
passwd: all authentication tokens updated successfully.

Sambaにユーザーを登録

先程のユーザーをSambaに登録し、Windowsと接続できるようにします。
Samba上にWindows形式のユーザー情報を登録するイメージです。

pdbedit -a samba-test
new password:
retype new password:

追加された事を確認してみましょう。

pdbedit -L
samba-test:1001:

コマンドについて余談

今回はpdbeditコマンドを使っていますが、smbpasswdというコマンドも使えます

「smbpasswd」はSamba2.2系で使われた旧来のユーザ管理コマンドです。
これは、rootでなくても使えますが先程の「ユーザーの一覧」を表示する機能は持っていません。
またデータベース形式が固定です。

「pdbedit」はSamba3.0以降で使われている新しいユーザ管理コマンドで、root権限がないと使えませんが、
先程の「ユーザーの一覧」や別の種類のデータベースを使用する事が出来るため、出来ることが多く汎用的なようです。

情報によって使っている管理コマンドが違いますが、今回の用途だとどちらを使っても問題ないと思います。
ただ、私は利用されることが多いだろう新しい方のコマンドを使うことにしました。

設定について

「/etc/samba/smb.conf 」にて、ワークグループやプリンタ共有の有無・パスワードの暗号化等々の設定。
そして共有ファイルの場所・名前の指定も行えますが、今回はサクっと作るため特に設定しません。
よって、ファイルの共有先は登録したLinuxユーザーのホームディレクトリになります。

余談

Sambaの設定に関することはLPICレベル2の参考書(記事下部に記載)がとても参考になりました。
ただ、manに詳しく書いてあるのでそれを読むほうが速いです。(ただし当然ながら英語です)

Sambaの起動、自動起動設定

設定は終わったので、Sambaを起動して自動起動もするようにします。

systemctl start smb
systemctl enable smb

3.クライアントからSambaにアクセス、共有ファイルの作成

WindowsのクライアントからSambaに接続する

エクスプローラーのアドレスバーに「\(sambaのIPアドレス:今回だと10.0.2.115)」と入力すると、
下記のようにユーザーとパスワードを求められるので、Sambaに登録した物を入力。

「samba-test」に接続します。

共有ファイルの作成

何でも良いのですが、簡単にテキストファイルを作ります。

4.Samba側から共有ファイルを確認

最後に共有先である「Samba-test」のディレクトリに先程作成したテキストがあるか確認します。

cd /home/samba-test
ls -l

-rwxr--r-- 1 samba-test samba-test 0 11月 28 06:37 New Text Document.txt

テキストが無事反映されているので、ファイル共有が出来ていることが確認出来ました。

参考URL

参考文献

  • Linux教科書 LPICレベル2 Version4.5対応
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2でSambaを構築してファイル共有を確認する

はじめに

AWS初心者が、練習目的でEC2を使ってSambaを勉強・構築した際の情報・手順をまとめた物です。
SambaでWindows用ファイルサーバとして構築し、Windowsのクライアントからファイル共有をしてみます。
同じような情報は既にあるので、解説を細かくしすぎず、かつ少し余談を交えた記事にしています。

目的

  • Sambaを構築して、構築・ファイル共有の流れと感覚を掴む。
  • さらっとやってみる。
  • WindowsServerをリモートで操作してみる。

構成図

練習用samba構成.jpg

  • EC2 OS:AmazonLinux2  (ファイルサーバー用) ポート:22(SSH)・445(TCP)
    ※ファイル共有用に445だけ開けていますが、その他の機能を使う場合は対応した他のポートも開ける必要があります。

  • EC2 OS:WindowsServer2019 (クライアント用) ポート:3389(RDP)

同一パブリックサブネット内にAmazonLinux2とWindowsServerのEC2を用意していて下さい。

EBSの無料枠の30GBを超えるはずなので、課金が発生しますが数時間で消す予定なので「超」低額だと思います。
その辺りが気になる方は公式でお調べ下さい。

終わったらささっと消しましょう。

パブリックにファイル共有サーバを置くのは実運用としては駄目でしょうが、練習・検証用ですので続行します。

全体の流れ

  1. Sambaとは
  2. Sambaをインストール、Samba用ユーザーの作成
  3. クライアントからSambaにアクセス、共有ファイルの作成
  4. Samba側から共有ファイルを確認

1. Sambaとは

今回使っている「Samba」はLinuxをWindowsのファイルサーバにするだけの物ではありません。

Windowsで使われているネットワークプロトコル(SMB・CIFS)を使うことで、LinuxでWindowsのネットワークシステムに参加する事が出来るようにするフリーソフトウェアです。
ファイル共有・プリンタ共有・ドメインコントローラー等のWindowsネットワークの諸機能を有しています。
よって、LinuxからWindowsのネットワークにアクセスできるようにさせるクライアント機能もある訳です。

そんな認識の上で、今回は単にファイル共有サーバの機能を利用させて頂きます。

2.Sambaをインストール、Samba用ユーザーの作成

Sambaのインストール

LinuxのEC2にSSHして、rootに切り替えます。

sudo su -

そしてSambaをインストールします。

yum -y install samba

Samba用ユーザーの作成

Sambaを利用するためにLinuxユーザーを作成します。

useradd samba-test
passwd samba-test

Changing password for user samba-test.
New password: 
Retype new password:
passwd: all authentication tokens updated successfully.

Sambaにユーザーを登録

先程のユーザーをSambaに登録し、Windowsと接続できるようにします。
Samba上にWindows形式のユーザー情報を登録するイメージです。

pdbedit -a samba-test
new password:
retype new password:

追加された事を確認してみましょう。

pdbedit -L
samba-test:1001:

コマンドについて余談

今回はpdbeditコマンドを使っていますが、smbpasswdというコマンドも使えます

「smbpasswd」はSamba2.2系で使われた旧来のユーザ管理コマンドです。
これは、rootでなくても使えますが先程の「ユーザーの一覧」を表示する機能は持っていません。
またデータベース形式が固定です。

「pdbedit」はSamba3.0以降で使われている新しいユーザ管理コマンドで、root権限がないと使えませんが、
先程の「ユーザーの一覧」や別の種類のデータベースを使用する事が出来るため、出来ることが多く汎用的なようです。

情報によって使っている管理コマンドが違いますが、今回の用途だとどちらを使っても問題ないと思います。
ただ、私は利用されることが多いだろう新しい方のコマンドを使うことにしました。

設定について

「/etc/samba/smb.conf 」にて、ワークグループやプリンタ共有の有無・パスワードの暗号化等々の設定。
そして共有ファイルの場所・名前の指定も行えますが、今回はサクっと作るため特に設定しません。
よって、ファイルの共有先は登録したLinuxユーザーのホームディレクトリになります。

余談

Sambaの設定に関することはLPICレベル2の参考書(記事下部に記載)がとても参考になりました。
ただ、manに詳しく書いてあるのでそれを読むほうが速いです。(ただし当然ながら英語です)

Sambaの起動、自動起動設定

設定は終わったので、Sambaを起動して自動起動もするようにします。

systemctl start smb
systemctl enable smb

3.クライアントからSambaにアクセス、共有ファイルの作成

WindowsのクライアントからSambaに接続する

エクスプローラーのアドレスバーに「\(sambaのIPアドレス:今回だと10.0.2.115)」と入力すると、
下記のようにユーザーとパスワードを求められるので、Sambaに登録した物を入力。

「samba-test」に接続します。

共有ファイルの作成

何でも良いのですが、簡単にテキストファイルを作ります。

4.Samba側から共有ファイルを確認

最後に共有先である「Samba-test」のディレクトリに先程作成したテキストがあるか確認します。

cd /home/samba-test
ls -l

-rwxr--r-- 1 samba-test samba-test 0 11月 28 06:37 New Text Document.txt

テキストが無事反映されているので、ファイル共有が出来ていることが確認出来ました。

※今回の筆者の環境では言語設定を日本語化していました。

参考URL

参考文献

  • Linux教科書 LPICレベル2 Version4.5対応
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LXDE・TightVNC・noVNCをインストールしてブラウザ経由でリモートデスクトップ環境を構築してみる

リモートでの障害対応する時の作業環境として、リモートデスクトップ環境を構築した時のメモとなります。Amazon Workspacesでも良かったのですが、OSはWindowsとAmazonLinuxしか選択肢がないので、Ubuntu上にLXDE・TightVNC・noVNCを設定して、ブラウザ経由でリモートデスクトップ環境を構築してみました。

環境

  • AWS
  • Ubuntu Server 20.04 LTS(AMI: ami-0f2dd5fc989207c82)

インストール手順

パッケージアップデート

  • 起動直後のUbuntuを最新の状態にする
sudo apt update
sudo apt upgrade

LXDEインストール

  • LXDEのインストール(最小限の機能が問題ないのであれば lxde-core のインストール)
sudo apt install lxde
sudo reboot

TightVNCインストール

  • vncサーバとしてTightVNCをインストール
sudo apt install tightvncserver
sudo apt install xfonts-base
vncserver :1
cp -p ~/.vnc/xstartup ~/.vnc/xstartup.bk
chmod +x ~/.vnc/xstartup
vi ~/.vnc/xstartup
*** 最終行に追記
-----
lxsession -s LXDE &
-----

vncserver -kill :1
vncserver :1

TightVNC自動起動設定

  • サーバ起動時に自動的に起動するよう設定
sudo vi /lib/systemd/system/vncserver@1.service
*** 新規作成
---
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu

PIDFile=/home/ubuntu/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x768 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target
---

sudo systemctl enable vncserver@1.service
sudo systemctl start vncserver@1.service

noVNCインストール

  • ブラウザ経由でアクセスするためにnoVNCをインストール
sudo apt install novnc websockify python-numpy
websockify -D --web=/usr/share/novnc/ 6080 localhost:5901

noVNC自動起動設定

  • サーバ起動時に自動的に起動するよう設定
sudo vi /lib/systemd/system/novnc.service
*** 新規作成
---
[Unit]
Description=noVNC startup

[Service]
Type=simple
ExecStart=/usr/bin/websockify -D --web=/usr/share/novnc/ 6080 localhost:5901
ExecStop=/bin/kill ${MAINPID}
Restart=always
User=ubuntu
Group=ubuntu

[Install]
WantedBy=multi-user.target
---

sudo systemctl enable novnc.service
sudo systemctl start novnc.service

ブラウザ経由で接続してみる

  • http://<IP Address>:6080/vnc.html にアクセス

  • vncserver初回起動時に設定したパスワードを入力

  • リモートデスクトップ環境にログイン完了

感想

  • ブラウザ経由でアクセスできるのは便利ですね。セキュリティを考えると認証をどうするか・SSL通信で暗号化する必要があるなどの課題があると思います。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux学習記録 〜Linuxリソースの管理〜

この記事

もやっとしたインフラ知識をスッキリさせていく方針で
Linuxの学習をしており、その記録をしていきます。

今回はLinuxのキャパシティプランニング分野です。
学習ベースは現在LinuCレベル2としてます。

学習に際して詰めが甘い部分もありますが、
Linuxお兄さん目指して精進します。

About キャパシティプランニング

コンピュータリソースは、無限にあるわけではなく
節約してうまく運用していかねばならない

必要なハードウェアやクラウド上のリソースを見積もることが、一般的なキャパシティプランニングを指す

何をするのか

リソースを知る、見積もる

リソースを予想するのは難しく、ピーク時に急激にリソース不足になることもある。

しかし、システム上の各プログラムがどれだけリソースを削るかのデータを収集すれば、将来の負荷をある程度まで見積もることはできる。

リソースの種類

主にCPU、メモリ、ディスクI/Oなどが挙げられる。
他にもネットワークI/O、スワップ利用率など。

Linuxにはこれらを知るためのツールやユーティリティが存在するので、手段を知ることが大事。

リソースを調整する

システム上のリソースを設定調整することで、性能の最適化を目指す。
パフォーマンスチューニングといい、キャパシティプランニングとともに重要なこと。

どうやるのか

システムリソースを知るために、Linuxではいくつかのコマンドが用意されている。
今回は代表的なtopコマンドを見てみる

現時点でのシステムリソースを知る

topコマンド

リアルタイムで実行中のプロセスを表示できる。

※これらはmanコマンドだったり、ググったりすればわかるので、覚える必要はないのだが
一度しっかり見ておくことで「ほー、こんなものなのか」と頭に入れておく

1行目

LinuC_topL1.png

1:現在日時(Linux上)
2:システム起動してからの経過時間
3:ログイン中のユーザー数
4:ロードアベレージ

ロードアベレージは、システム全体の負荷状況。
直近1/5/15(分)の値であり、1CPUにおける(単位時間あたりの)実行待ちとディスクI/Oプロセス数。

つまり、現在動いてるプロセスと待ち状態のプロセスを足し合わせたシステムの負荷数値という感じ
1より高いと処理待ち中のプロセスがいる、のような判断材料。

※値はもちろんCPUのコア数によって違う。
16コアであれば、16.0 = CPU100%が続いた、ということ

ロードアベレージが高いときは、CPU使用率やディスクI/O(Input/Output)を見たりしていく。
勘で動くのではなく、数値計測をして原因を探るためのもの

2行目

プロセスの状態
LinuC_topTASK.png

1:総プロセス数
2:実行状態
3:スリープ状態
4:停止状態
5:ゾンビ状態

ゾンビ気になる。
プロセスは、PIDという番号を持っていて、プロセステーブルにエントリがあるが
プロセステーブルに残っているのにその実態が存在しない場合にゾンビプロセスと言われる

ゾンビプロセスのエントリを消すにはkillコマンドでPIDを指定すれば可能

3行目

CPUの状態

LinuC_topCPU.png

1:ユーザプロセスが、CPUを使用している時間割合
us: user

2:カーネルが、CPUを使用している時間割合
sy: system

3:優先度が変更されたプロセスが、CPUを使用している時間割合
ni: nice
→プログラムを実行する優先度をnice値といい、rootユーザのみが変更できる

4:CPUがアイドル状態の時間割合
id: idle

5:ディスクI/O待ちの時間の割合
wa: io-wait

6:ハードウェア割込み要求時間の割合
hi: hardwareirq

7:ソフトウェア割込み要求時間の割合
si: softwareirq

8:ゲストOSがCPUを割り当てられなかった時間の割合
st: steal
→AWS EC2など、仮想環境でゲストOSが要求しても割り当ててもらえなかったので待機した時間割合
以前、EC2で何故か重くて原因がこいつだったことがあった(T2インスタンス)
T系インスタンスはCPUクレジットが関連することもあり。

4,5行目

LPIC2-1-L45.png

メモリとスワップの状態

4行目は、
全物理メモリ量、空きメモリ量、使用中メモリ量、バッファ/キャッシュサイズ。

5行目は、
スワップ領域サイズ、空き、使用中、メモリ不足時に利用可能な物理メモリ量。

Linuxメモリは、以下のようなものとなる
使用中のメモリ:カーネルが通常利用するメモリ
キャッシュ:ストレージとの高速なI/Oのために使用する
空きメモリ:残っている限り、キャッシュが使用していく容量
スワップ:使用メモリが実メモリ数を上回った際に使用される、ストレージ側の容量。ストレージで使用しているのでもちろんI/Oは遅い

タスクエリア

LPIC2-1-L6.png

PID: プロセスID
USER: ユーザー名
PR: 実行静的優先度
NI: nice値(相対優先度)
VIRT: 使用中仮想メモリ値(KB)、ただしスワップ含む
RES: 使用中実メモリ(KB)、スワップなし
SHR: 共有メモリ(KB)
 共有というのは、他のプロセスとの共有しているメモリを指す
S: プロセスの状態
 割り込み不能、実行中、ゾンビなどの状態を文字で表す

%CPU: CPU使用率
%MEM: 物理メモリの使用率
TIME+: プロセス開始からのCPU時間合計
COMMAND: 実行コマンド
このあたりは特に、例えばMac上のアクティビティモニタでも戦闘に表示される内容
(よくブラウザのスレッド数やCPU時間を見て反省する)

topコマンドの表示は、表示やソートを切り替えることが出来る。
メモリ使用率を確認する際に'm'を2度押して、グラフ表示に変えたりしている

デフォルト時
スクリーンショット 2020-11-28 14.12.32.png

メモリのグラフ表示
スクリーンショット 2020-11-28 14.12.44.png

'f'を押すと、表示する項目を選択可能になる
スクリーンショット 2020-11-28 14.14.28.png

他にチェックしたいコマンドとして、vmstat, sar, w等が挙げられる。

リソースを分析する

システムリソースの分析、予測をするためには、これらコマンドの結果を比較したり、よりわかりやすく可視化するために
監視ツールを使用することが一般的である

監視ツールを導入すると、継続的にデータを取得することが出来るため、
キャパシティの限界値に達する前に予測をする事ができるようになる

CPU

平均負荷のみを眺めるのではなく、システム使用率、ユーザーごとの使用率から、
システムのどの部分にCPU負荷がかかっているのかを分析する。

メモリ

稼働時間が長くなるほど空きメモリ自体はなくなるのが一般的であるため、
空きメモリではなくスワップ使用状況なども確認する。
スワップは使用メモリが実メモリ数を上回った際に使用されるため、恒常的に使用されているならば増設が必要
スワップ領域の確認にはvmstat, freeコマンドを活用できる。

ディスク

I/Oは、パーテイション別に見て特定の部分に負荷がかかっていないか等、ボトルネックを探す。
ディスク容量自体の増加は、アラートを設定しておき、必要なストレージ容量を予測する。
ログファイルがたまり続けていないかなども確認する。

まとめ

今回はキャパシティプランニングについて少しまとめました。
まだあまり使ったことないコマンドもあるので、この記事あるいは別記事に増やしていきます。

次はカーネルについての内容をまとめます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DHCP の基本設定について纏めてみた

dhcpサーバー

dhcpd.conf

dhcpd.confの設定項目 説明
option domain-name ドメイン名
option domain-name-servers DNSサーバー
option routers デフォルトゲートウェイのIP
option subnet-mask サブネットマスク
option broadcast-address ブロードキャスト
option ntp-servers NTPサーバーのIP
option netbios-name-servers WINSサーバーのIP
default-lease-time クライアントに貸し出すデフォルトリース期限
max-lease-time クライアントから貸し出す期間を要求してきた場合の最大リース期限
range 範囲
host クライアントで固定IPアドレスを使用
fixed-address 固定で割り当てるIPアドレス
hardware クライアントを特定するためのMACアドレス

設定例

dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {

 option routers 192.168.1.100;
 option subnet-mask 255.255.255.0;
 option domain-name "example.com";
 option domain-name-servers 8.8.8.8;
 option ntp-servers 210.173.160.27;

 range 192.168.1.101 192.168.1.200;
 default-lease-time 21600;
 max-lease-time 43200;

 host subnet {
  hardware ethernet 00:11:22:33:44:55;
  fixed-address 192.168.1.99;
 }
}

※systemctl status dhcpd で、
WARNING: Host declarations are global. They are not limited to the scope you dec...hem in
のように表示された場合。
特定のPCに固定のIPアドレスを割り当てたい時に使う「host」宣言を「subnet」区内に記述すると「Host」宣言はグローバルである。と、ワーニング出力されてしまいます。
一様、動作はしますが「subnet」区外(グローバル宣言区)に定義し、dhcpdサービスを再起動すれば出力されなくなります。

リース期間

dhcpd が現在貸し出しているIPアドレスは、dhcpd.leases に記録されています。
このファイルが存在しない場合は、あらかじめ作成しておく必要があります。

# touch /var/lib/dhcp/dhcpd.leases

dhcpクライアント

CentOS の場合は、次のように設定します。

/etc/sysconfig/network-scripts/ihcfg-eth0
BOOTPROTO=dhcp

nmcli もしくは、dhclient

# nmcli connection modify ihcfg-eth0 ipv4.method auto
# dhclient -d ihcfg-eth0

dhcpリレーエージェント

次の例は、ihcfg-eth1 で受け取ったDHCPリクエストを、192.168.0.100 にリレーするようにしています。

# dhcrealy -i ihcfg-eth1 192.168.0.100

IPv6の自動設定

IPv6クライアントは、IPv6ルーターに対して、RSを送り、それに対してルーターはRSを返します。
IPv6クライアントは、ルーターからの情報(プレフィックス)と自身のMACアドレスから生成される情報(インターフェースID)に基づいて、IPv6アドレスを生成します。
また、RA発信元のルーターをデフォルトゲートウェイに設定します。
Linuxでは、radvd をを導入することで、RAを送信できるようになります。

/etc/radvd.conf
interface ihcfg-eth3
{
 AdvSendAdvert on;
 prefix 2001:db8:0:1::/64
}

IPアドレス以外の情報(DNSサーバーのIPアドレスなど)を割り当てる場合は、DHCPサーバーが必要となります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

現在利用しているシェルの種類を確認する(GNU BashなのかZ Shellなのか)

実現したいこと

ターミナルで現在利用しているがbash(GNU Bash)なのかzsh(Z-shell)を表示する
※macOS Catalinaから標準シェルがzshになっている。

実行コマンド

CentOS Linux release 7.9.2009 の場合

$ uname
Linux 
$ ps -p $$ | tail -1 | awk '{print $NF}'
bash
$

macOS Catalina の場合

% uname
Darwin
% ps -p $$ | tail -1 | awk '{print $NF}'
-zsh
% 

補足

echo $SHELL
  • 上記の方法は、あまり良い方法ではない。
$ echo $SHELL
/bin/bash
$ SHELL="hoge"
$ echo $SHELL
hoge
% echo $SHELL
/bin/zsh
% SHELL="hoge"
% echo $SHELL
hoge
% 

情報源

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

高可用性と耐障害性の違いと稼働率について

システムを構築する上で、規模が大きくなればなるほど考える必要が出てくるのが可用性や耐障害性です。
クラウドを用いるのが当たり前になった昨今は、ある程度この辺を意識しなくてもシステムを構築できるようになりましたが、
1つのリージョンがダウンした場合でもサービス全体が止まらないような構成を考えなければならないこともあります。
(AWSの障害で〇〇が使えなくなった!などは記憶に新しいです・・・)

高可用性と耐障害性、どっちがどっちかよくわからなくなってしまうのでまとめました。

高可用性と耐障害性という言葉の意味

高可用性

高可用性(こうかようせい、英: High Availability; ハイ・アベイラビリティ、HA)は可用性が高いことを示すIT用語。
システムなどにおいて、サービス提供が出来なくなる事態の発生頻度が少ないことを指す。
また、そのようなシステムをHA構成などと呼称する。
システム的には冗長化構成を組んでいたり、バックアップ手段の確立、災害対策システムを講じることでHAを実現させる。
IT業界においてはほぼクラスタリングあるいはクラスタサーバと同義で使用される用語。
Wikipediaより1

つまり、高可用性とはサービスが停止する時間がどれくらい短いか。
もっというと「利用者がどれだけサービスを利用できるか」を指します。
引用元にも記載の通り、クラスタリングなどを用いて実現します。

耐障害性

こちらはいい引用元が見つかりませんでしたが、英語にするとFault Tolerant(フォールトトレラント)
どれだけ障害に耐えれるか、ということを指します。
またフォールトトレラントシステムといった場合、それはどんな障害にも耐えられる、つまり無停止のシステムであるということです。
ハードウェアの耐障害性を高める方法としては冗長化があります。
RAIDを組む、LANを冗長化する(リンクアグリゲーション)などです。
例えばディスクが1つ故障した場合でも、自動でスペアディスクをRAIDに組み込んだりできる機器などがあります。

稼働率について

可用性をはかる尺度として、稼働率という指標があります。
稼働率とはサービスが提供できている時間の割合のことです。
例えば、Googleが提供するmBaaSであるFirebaseは月間稼働率が99.5%未満で99.0%以上の場合は10%の返金、
99.0%未満だった場合は30%の金額を返金すると定めています。2
月間稼働率99.0%というのは月間で7.2時間までサービスがダウンする可能性があるということです。
月間稼働率99.5%だとダウンタイムは3.6時間です。

実現方法を考えてみる

クラウドを用いる場合はもちろん、オンプレミスの場合でも一般的にハードウェアは単一障害点が無いように設計し、
ハードウェア耐障害性は担保されていることが多いです。(無停止で部品を交換することが出来る仕組みを使う)
なので、ソフトウェアの可用性を高める以下のようなクラスタリングシステムについて例を用いて解説します。
プレゼンテーション1.png
Active-Standby構成のクラスタリング。共有ストレージを切り替えて、サービスを上げ下げすることで切替を行
います。
このようなシステムの場合、障害が発生してからスタンバイ側でサービス再開するまでに以下のようなことが起こります。

1. 監視

サービスが起動しているかどうかを定期的にクラスタリングソフトが監視します。
監視間隔は設定できることが多いですが、短すぎると誤検知してしまう確率が上がり、長すぎると気づくのが遅くなるので稼働率が下がってしまいます。

2. サービスの停止

監視で異常に気付いた後は、サービスを停止します。
サービスが異常になっている場合、正常に停止できないこともあるので、まずは普通に止めてみて、ダメだったら強制終了する というような動きになることが多いです。
この場合も、強制終了に移行するまでの時間を決めれることが多いですが、短すぎると正常稼働時でも強制終了してしまい、DBに不整合が起きてしまったり、逆に長すぎるとその分、稼働率が下がることになります。

3. リソースの切り離し

共有ストレージやVIPの切り離しを行います。LinuxでLVMだとアンマウント⇒LVダウン⇒VGダウン といった感じです。
それなりに時間がかかります。上2つと同様にタイムアウトが設定できるようになっていることが多いです。

4. スタンバイ側でのリソースの取り付け

Active側の切り離しが完了したら、Standby側でリソースの取り付けを行います。

5. サービス起動

正常にリソースが取り付けられたら、決められた順番に沿ってサービスを起動していきます。
これでDBサーバとしてはサービス再開できるわけです。

プレゼンテーション2.png

稼働率はどのくらいになるか

この例の場合、気にすべきタイマ値は以下です。

  • 監視間隔(ソフトウェアで制御可能)
  • サービス停止時間(タイムアウトはソフトウェアで制御可能)
  • リソース切り離し時間(マシンスペックや構成に大きく依存)
  • リソース取り付け時間(マシンスペックや構成に大きく依存)
  • サービス起動時間(マシンスペックや構成に大きく依存)

仮に監視間隔120(s)、サービス停止の最大値が240(s)、リソース切り離し+リソース取り付けが120(s)、サービス起動に120(s)かかるとすると
切替に10分かかるということになります。

仮に月に1回障害が発生し切替が行われるとすると(発生しすぎですが、一旦)

稼働率 =1 - \frac{10分}{(30日 \times 24時 \times 60分)} = 99.976...\%

となり99.9%以上の稼働率となります。


  1. 高可用性 - Wikipedia (https://ja.wikipedia.org/wiki/%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7

  2. Service Level Agreement for Hosting and Realtime Database - Firebase (https://firebase.google.com/terms/service-level-agreement

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む