- 投稿日:2020-11-28T23:47:32+09:00
Linux(centos)でファイル容量を追加する(OCI)
やりたいこと
ルートボリュームを拡張して容量を増やしたい。
OCI上で作成したcentosのカスタムイメージのブートボリュームサイズが74Gあるはずなのに、ルートに27Gしか割り当てられていない。
# 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/0lsblkで確認すると、ルートボリュームはちゃんと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]手順
- パーテーションの拡張
- 物理ボリュームの拡張
- ボリュームグループの拡張
- 論理ボリュームの拡張
パーテーションの拡張
まず、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 resized74Gに拡張されていることを確認
# 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
- 投稿日:2020-11-28T23:02:55+09:00
非ツイッター民が黒い画面からツイートしてみた件について
- 投稿日:2020-11-28T23:01:38+09:00
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.txtWa-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の参考サイト
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!
- 投稿日:2020-11-28T16:50:21+09:00
EC2でSambaを構築し、ファイル共有を確認する
はじめに
AWS初心者が、練習目的でEC2を使ってSambaを勉強・構築した際の情報・手順をまとめた物です。
SambaでWindows用ファイルサーバとして構築し、Windowsのクライアントからファイル共有をしてみます。
同じような情報は既にあるので、解説を細かくしすぎず、かつ少し余談を交えた記事にしています。目的
- Sambaを構築して、構築・ファイル共有の流れと感覚を掴む。
- さらっとやってみる。
- WindowsServerをリモートで操作してみる。
構成図
EC2 OS:AmazonLinux2 (ファイルサーバー用) ポート:22(SSH)・445(TCP)
※ファイル共有用に445だけ開けていますが、その他の機能を使う場合は対応した他のポートも開ける必要があります。EC2 OS:WindowsServer2019 (クライアント用) ポート:3389(RDP)
同一パブリックサブネット内にAmazonLinux2とWindowsServerのEC2を用意していて下さい。
EBSの無料枠の30GBを超えるはずなので、課金が発生しますが数時間で消す予定なので「超」低額だと思います。
その辺りが気になる方は公式でお調べ下さい。
終わったらささっと消しましょう。パブリックにファイル共有サーバを置くのは実運用としては駄目でしょうが、練習・検証用ですので続行します。
全体の流れ
- Sambaとは
- Sambaをインストール、Samba用ユーザーの作成
- クライアントからSambaにアクセス、共有ファイルの作成
- 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 sambaSamba用ユーザーの作成
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 smb3.クライアントからSambaにアクセス、共有ファイルの作成
WindowsのクライアントからSambaに接続する
エクスプローラーのアドレスバーに「\(sambaのIPアドレス:今回だと10.0.2.115)」と入力すると、
下記のようにユーザーとパスワードを求められるので、Sambaに登録した物を入力。
共有ファイルの作成
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
- EC2にSambaを構築してWindowsからファイル共有してみた
- Sambaの基本を知っておこう
- オープンソースのドキュメント管理/Sambaとは
- Amazon Linux 2でSambaを構築する
参考文献
- Linux教科書 LPICレベル2 Version4.5対応
- 投稿日:2020-11-28T16:50:21+09:00
EC2でSambaを構築してファイル共有を確認する
はじめに
AWS初心者が、練習目的でEC2を使ってSambaを勉強・構築した際の情報・手順をまとめた物です。
SambaでWindows用ファイルサーバとして構築し、Windowsのクライアントからファイル共有をしてみます。
同じような情報は既にあるので、解説を細かくしすぎず、かつ少し余談を交えた記事にしています。目的
- Sambaを構築して、構築・ファイル共有の流れと感覚を掴む。
- さらっとやってみる。
- WindowsServerをリモートで操作してみる。
構成図
EC2 OS:AmazonLinux2 (ファイルサーバー用) ポート:22(SSH)・445(TCP)
※ファイル共有用に445だけ開けていますが、その他の機能を使う場合は対応した他のポートも開ける必要があります。EC2 OS:WindowsServer2019 (クライアント用) ポート:3389(RDP)
同一パブリックサブネット内にAmazonLinux2とWindowsServerのEC2を用意していて下さい。
EBSの無料枠の30GBを超えるはずなので、課金が発生しますが数時間で消す予定なので「超」低額だと思います。
その辺りが気になる方は公式でお調べ下さい。
終わったらささっと消しましょう。パブリックにファイル共有サーバを置くのは実運用としては駄目でしょうが、練習・検証用ですので続行します。
全体の流れ
- Sambaとは
- Sambaをインストール、Samba用ユーザーの作成
- クライアントからSambaにアクセス、共有ファイルの作成
- 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 sambaSamba用ユーザーの作成
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 smb3.クライアントからSambaにアクセス、共有ファイルの作成
WindowsのクライアントからSambaに接続する
エクスプローラーのアドレスバーに「\(sambaのIPアドレス:今回だと10.0.2.115)」と入力すると、
下記のようにユーザーとパスワードを求められるので、Sambaに登録した物を入力。
共有ファイルの作成
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
- EC2にSambaを構築してWindowsからファイル共有してみた
- Sambaの基本を知っておこう
- オープンソースのドキュメント管理/Sambaとは
- Amazon Linux 2でSambaを構築する
参考文献
- Linux教科書 LPICレベル2 Version4.5対応
- 投稿日:2020-11-28T16:48:24+09:00
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 upgradeLXDEインストール
- LXDEのインストール(最小限の機能が問題ないのであれば
lxde-core
のインストール)sudo apt install lxde sudo rebootTightVNCインストール
- 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 :1TightVNC自動起動設定
- サーバ起動時に自動的に起動するよう設定
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.servicenoVNCインストール
- ブラウザ経由でアクセスするためにnoVNCをインストール
sudo apt install novnc websockify python-numpy websockify -D --web=/usr/share/novnc/ 6080 localhost:5901noVNC自動起動設定
- サーバ起動時に自動的に起動するよう設定
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ブラウザ経由で接続してみる
感想
- ブラウザ経由でアクセスできるのは便利ですね。セキュリティを考えると認証をどうするか・SSL通信で暗号化する必要があるなどの課題があると思います。
参考
- 投稿日:2020-11-28T14:41:46+09:00
Linux学習記録 〜Linuxリソースの管理〜
この記事
もやっとしたインフラ知識をスッキリさせていく方針で
Linuxの学習をしており、その記録をしていきます。今回はLinuxのキャパシティプランニング分野です。
学習ベースは現在LinuCレベル2としてます。学習に際して詰めが甘い部分もありますが、
Linuxお兄さん目指して精進します。About キャパシティプランニング
コンピュータリソースは、無限にあるわけではなく
節約してうまく運用していかねばならない必要なハードウェアやクラウド上のリソースを見積もることが、一般的なキャパシティプランニングを指す
何をするのか
リソースを知る、見積もる
リソースを予想するのは難しく、ピーク時に急激にリソース不足になることもある。
しかし、システム上の各プログラムがどれだけリソースを削るかのデータを収集すれば、将来の負荷をある程度まで見積もることはできる。
リソースの種類
主にCPU、メモリ、ディスクI/Oなどが挙げられる。
他にもネットワークI/O、スワップ利用率など。Linuxにはこれらを知るためのツールやユーティリティが存在するので、手段を知ることが大事。
リソースを調整する
システム上のリソースを設定調整することで、性能の最適化を目指す。
パフォーマンスチューニングといい、キャパシティプランニングとともに重要なこと。どうやるのか
システムリソースを知るために、Linuxではいくつかのコマンドが用意されている。
今回は代表的なtopコマンドを見てみる現時点でのシステムリソースを知る
topコマンド
リアルタイムで実行中のプロセスを表示できる。
※これらはmanコマンドだったり、ググったりすればわかるので、覚える必要はないのだが
一度しっかり見ておくことで「ほー、こんなものなのか」と頭に入れておく1行目
1:現在日時(Linux上)
2:システム起動してからの経過時間
3:ログイン中のユーザー数
4:ロードアベレージロードアベレージは、システム全体の負荷状況。
直近1/5/15(分)の値であり、1CPUにおける(単位時間あたりの)実行待ちとディスクI/Oプロセス数。つまり、現在動いてるプロセスと待ち状態のプロセスを足し合わせたシステムの負荷数値という感じ
1より高いと処理待ち中のプロセスがいる、のような判断材料。※値はもちろんCPUのコア数によって違う。
16コアであれば、16.0 = CPU100%が続いた、ということロードアベレージが高いときは、CPU使用率やディスクI/O(Input/Output)を見たりしていく。
勘で動くのではなく、数値計測をして原因を探るためのもの2行目
1:総プロセス数
2:実行状態
3:スリープ状態
4:停止状態
5:ゾンビ状態ゾンビ気になる。
プロセスは、PIDという番号を持っていて、プロセステーブルにエントリがあるが
プロセステーブルに残っているのにその実態が存在しない場合にゾンビプロセスと言われるゾンビプロセスのエントリを消すにはkillコマンドでPIDを指定すれば可能
3行目
CPUの状態
1:ユーザプロセスが、CPUを使用している時間割合
us: user2:カーネルが、CPUを使用している時間割合
sy: system3:優先度が変更されたプロセスが、CPUを使用している時間割合
ni: nice
→プログラムを実行する優先度をnice値といい、rootユーザのみが変更できる4:CPUがアイドル状態の時間割合
id: idle5:ディスクI/O待ちの時間の割合
wa: io-wait6:ハードウェア割込み要求時間の割合
hi: hardwareirq7:ソフトウェア割込み要求時間の割合
si: softwareirq8:ゲストOSがCPUを割り当てられなかった時間の割合
st: steal
→AWS EC2など、仮想環境でゲストOSが要求しても割り当ててもらえなかったので待機した時間割合
以前、EC2で何故か重くて原因がこいつだったことがあった(T2インスタンス)
T系インスタンスはCPUクレジットが関連することもあり。4,5行目
メモリとスワップの状態
4行目は、
全物理メモリ量、空きメモリ量、使用中メモリ量、バッファ/キャッシュサイズ。5行目は、
スワップ領域サイズ、空き、使用中、メモリ不足時に利用可能な物理メモリ量。Linuxメモリは、以下のようなものとなる
使用中のメモリ:カーネルが通常利用するメモリ
キャッシュ:ストレージとの高速なI/Oのために使用する
空きメモリ:残っている限り、キャッシュが使用していく容量
スワップ:使用メモリが実メモリ数を上回った際に使用される、ストレージ側の容量。ストレージで使用しているのでもちろんI/Oは遅いタスクエリア
PID: プロセスID
USER: ユーザー名
PR: 実行静的優先度
NI: nice値(相対優先度)
VIRT: 使用中仮想メモリ値(KB)、ただしスワップ含む
RES: 使用中実メモリ(KB)、スワップなし
SHR: 共有メモリ(KB)
共有というのは、他のプロセスとの共有しているメモリを指す
S: プロセスの状態
割り込み不能、実行中、ゾンビなどの状態を文字で表す%CPU: CPU使用率
%MEM: 物理メモリの使用率
TIME+: プロセス開始からのCPU時間合計
COMMAND: 実行コマンド
このあたりは特に、例えばMac上のアクティビティモニタでも戦闘に表示される内容
(よくブラウザのスレッド数やCPU時間を見て反省する)topコマンドの表示は、表示やソートを切り替えることが出来る。
メモリ使用率を確認する際に'm'を2度押して、グラフ表示に変えたりしている他にチェックしたいコマンドとして、vmstat, sar, w等が挙げられる。
リソースを分析する
システムリソースの分析、予測をするためには、これらコマンドの結果を比較したり、よりわかりやすく可視化するために
監視ツールを使用することが一般的である監視ツールを導入すると、継続的にデータを取得することが出来るため、
キャパシティの限界値に達する前に予測をする事ができるようになるCPU
平均負荷のみを眺めるのではなく、システム使用率、ユーザーごとの使用率から、
システムのどの部分にCPU負荷がかかっているのかを分析する。メモリ
稼働時間が長くなるほど空きメモリ自体はなくなるのが一般的であるため、
空きメモリではなくスワップ使用状況なども確認する。
スワップは使用メモリが実メモリ数を上回った際に使用されるため、恒常的に使用されているならば増設が必要。
スワップ領域の確認にはvmstat, freeコマンドを活用できる。ディスク
I/Oは、パーテイション別に見て特定の部分に負荷がかかっていないか等、ボトルネックを探す。
ディスク容量自体の増加は、アラートを設定しておき、必要なストレージ容量を予測する。
ログファイルがたまり続けていないかなども確認する。まとめ
今回はキャパシティプランニングについて少しまとめました。
まだあまり使ったことないコマンドもあるので、この記事あるいは別記事に増やしていきます。次はカーネルについての内容をまとめます。
- 投稿日:2020-11-28T01:38:31+09:00
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.confsubnet 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.leasesdhcpクライアント
CentOS の場合は、次のように設定します。
/etc/sysconfig/network-scripts/ihcfg-eth0BOOTPROTO=dhcpnmcli もしくは、dhclient
# nmcli connection modify ihcfg-eth0 ipv4.method auto# dhclient -d ihcfg-eth0dhcpリレーエージェント
次の例は、ihcfg-eth1 で受け取ったDHCPリクエストを、192.168.0.100 にリレーするようにしています。
# dhcrealy -i ihcfg-eth1 192.168.0.100IPv6の自動設定
IPv6クライアントは、IPv6ルーターに対して、RSを送り、それに対してルーターはRSを返します。
IPv6クライアントは、ルーターからの情報(プレフィックス)と自身のMACアドレスから生成される情報(インターフェースID)に基づいて、IPv6アドレスを生成します。
また、RA発信元のルーターをデフォルトゲートウェイに設定します。
Linuxでは、radvd をを導入することで、RAを送信できるようになります。/etc/radvd.confinterface ihcfg-eth3 { AdvSendAdvert on; prefix 2001:db8:0:1::/64 }IPアドレス以外の情報(DNSサーバーのIPアドレスなど)を割り当てる場合は、DHCPサーバーが必要となります。
- 投稿日:2020-11-28T00:33:35+09:00
現在利用しているシェルの種類を確認する(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 %情報源
- 使っているシェルを調べる方法 | マイナビニュース
- 投稿日:2020-11-28T00:16:07+09:00
高可用性と耐障害性の違いと稼働率について
システムを構築する上で、規模が大きくなればなるほど考える必要が出てくるのが可用性や耐障害性です。
クラウドを用いるのが当たり前になった昨今は、ある程度この辺を意識しなくてもシステムを構築できるようになりましたが、
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時間です。実現方法を考えてみる
クラウドを用いる場合はもちろん、オンプレミスの場合でも一般的にハードウェアは単一障害点が無いように設計し、
ハードウェア耐障害性は担保されていることが多いです。(無停止で部品を交換することが出来る仕組みを使う)
なので、ソフトウェアの可用性を高める以下のようなクラスタリングシステムについて例を用いて解説します。
Active-Standby構成のクラスタリング。共有ストレージを切り替えて、サービスを上げ下げすることで切替を行
います。
このようなシステムの場合、障害が発生してからスタンバイ側でサービス再開するまでに以下のようなことが起こります。1. 監視
サービスが起動しているかどうかを定期的にクラスタリングソフトが監視します。
監視間隔は設定できることが多いですが、短すぎると誤検知してしまう確率が上がり、長すぎると気づくのが遅くなるので稼働率が下がってしまいます。2. サービスの停止
監視で異常に気付いた後は、サービスを停止します。
サービスが異常になっている場合、正常に停止できないこともあるので、まずは普通に止めてみて、ダメだったら強制終了する というような動きになることが多いです。
この場合も、強制終了に移行するまでの時間を決めれることが多いですが、短すぎると正常稼働時でも強制終了してしまい、DBに不整合が起きてしまったり、逆に長すぎるとその分、稼働率が下がることになります。3. リソースの切り離し
共有ストレージやVIPの切り離しを行います。LinuxでLVMだとアンマウント⇒LVダウン⇒VGダウン といった感じです。
それなりに時間がかかります。上2つと同様にタイムアウトが設定できるようになっていることが多いです。4. スタンバイ側でのリソースの取り付け
Active側の切り離しが完了したら、Standby側でリソースの取り付けを行います。
5. サービス起動
正常にリソースが取り付けられたら、決められた順番に沿ってサービスを起動していきます。
これでDBサーバとしてはサービス再開できるわけです。稼働率はどのくらいになるか
この例の場合、気にすべきタイマ値は以下です。
- 監視間隔(ソフトウェアで制御可能)
- サービス停止時間(タイムアウトはソフトウェアで制御可能)
- リソース切り離し時間(マシンスペックや構成に大きく依存)
- リソース取り付け時間(マシンスペックや構成に大きく依存)
- サービス起動時間(マシンスペックや構成に大きく依存)
仮に監視間隔120(s)、サービス停止の最大値が240(s)、リソース切り離し+リソース取り付けが120(s)、サービス起動に120(s)かかるとすると
切替に10分かかるということになります。仮に月に1回障害が発生し切替が行われるとすると(発生しすぎですが、一旦)
稼働率 =1 - \frac{10分}{(30日 \times 24時 \times 60分)} = 99.976...\%となり99.9%以上の稼働率となります。
高可用性 - Wikipedia (https://ja.wikipedia.org/wiki/%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7) ↩
Service Level Agreement for Hosting and Realtime Database - Firebase (https://firebase.google.com/terms/service-level-agreement) ↩