computerの日記

Cisco,SHELL,Qt,C++,Linux,ネットワーク,Windows Scriptなどの発言です

新人さんにポインタを教える

新人さん、said,

>int *x と *x の違いがよくわからない

Me said,

int* x の方が、理解しやすいと思います。
普通はあまりやらないみたいですけど。

実際に、プログラムを作って動かしてみると良いです。
例えば、以下のように。

1 #include <stdio.h>
2
3 int main() {
4 int* x;
5 int y;
6 int *y2;
7 int **z;
8 int ***z2;
9 y = 123;
10 y2 = &y;
11 x = y2;
12 z = &x;
13 z2 = &z;
14 printf ("%d\n",*x);
15 printf ("%d\n",y);
16 printf ("%d\n",*y2);
17 printf ("%d\n",**z);
18 printf ("%d\n",***z2);
19 return 0;
20 }

LVM のアーカイブファイル名の数字の限界は 5桁

以下のような実験で確かめました。

fdisk /dev/sdb
n
p
1
t
8e
w
mkfs.xfs /dev/sdb1
pvcreate /dev/sdb1
pvdisplay
vgcreate VgTest /dev/sdb1
vgdisplay
lvcreate -l 50%FREE -n LvTest VgTest
lvdisplay
vi /root/lv_test.sh
-------------
#!/bin/bash
while true
do
lvcreate -L 100M -n snap VgTest
sleep 1
lvremove -f /dev/VgTest/snap
done
-------------
chmod +x lv_test.sh

cd /etc/lvm/archive
ls -la
rm -f VgTest*
touch VgTest_99999-1234.vg

./lv_test.sh

ナンバリングが、インクリメントされることなく、以下のファイルが大量に作成されます。

VgTest_100000-<ランダムな数字>.vg

望ましい動作
100000 から、数字がインクリメントされていく。

何かあれば、お知らせください。

Fedora27 で Ruby 関連ソースパッケージをダウンロードする

お疲れさまです。

SHIRASAGI-hardening の RPM パッケージを作成してみた私ですが、あれ、Fedora なら、パッケージ色々とあるんじゃないか、とふと思いました。

ということで、以下のコマンドを実行しました。

$ cd

$ su

# dnf download --source ruby*

rubygems とかいっぱいダウンロードされました。

これは失敗した、どこかにディレクトリを作成してからやればよかった。

$ cd

$ mkdir RUBY

# chown me:me ruby*

# mv buby* RUBY

# ls lt | less

まだ先程ダウンロードしたファイルがあるようだ。me というホームディレクトリで、root でダウンロードしたので、時間的なことも考慮して移動させます。

# find ./ -type f -user root -maxdepth 1 -and -newermt '20171116' | xargs -I% mv % RUBY

できました。

# chown me:me RUBY -R

# exit

$ ls -l RUBY | wc -l

666

うわっ。

あるプロセスが使用しているメモリの正確な値を知る方法

お疲れさまです。あるプロセスが、どの程度メモリを使用しているかを知りたいという人がいると思います。

その回答となります。

例えば、 ps コマンドで以下のように出力してみます。
以下は、auditd のプロセスのみを取り出しました。

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...(snip)...
root 885 0.0 0.0 56120 1936 ? S<sl 18:50 0:00 /sbin/auditd
...(snip)...

ここで、VSZ は、Virtual Set SiZe (仮想メモリのサイズ)
RSS は、Resident Set Size (物理メモリのサイズ)

と言われています。

これが、正確な値であるかどうかは、疑わしいです。
他の確認方法として、以下のコマンドを実行する方法があります。

# pmap -x <PID>

結構、いい感じですけど、
共有されているメモリなのか、自分だけに割り当てられているものなのかがわかりません。
そんなときに使えるのが、以下のコマンドです。

# cat /proc/<PID>/smaps

上記コマンドは、メモリをどの位使用しているかを正確に教えてくれます。
もっと重要なことには、メモリを private と shared に分割します。
したがって、いくつかのプログラムのインスタンスにより共有されているメモリを含めることなく、プログラムのインスタンスがどの程度メモリを使用しているかを、知ることができます。


(コマンド)
# pmap -x 885 | less
(結果の一部)
----------------------------
885: /sbin/auditd
Address Kbytes RSS Dirty Mode Mapping
0000560598052000 112 112 0 r-x-- auditd
0000560598052000 0 0 0 r-x-- auditd
000056059826e000 4 4 4 r---- auditd
000056059826e000 0 0 0 r---- auditd
000056059826f000 4 4 4 rw--- auditd
000056059826f000 0 0 0 rw--- auditd
0000560598270000 16 12 12 rw--- [ anon ]
...(snip)...
----------------------------
(コマンド)
# cat /proc/885/smaps | less
(結果の一部)
----------------------------
560598052000-56059806e000 r-xp 00000000 fd:00 3044478 /usr/sbin/auditd
Size: 112 kB
Rss: 112 kB
Pss: 112 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 112 kB
Private_Dirty: 0 kB
Referenced: 112 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd ex mr mw me dw sd
56059826e000-56059826f000 r--p 0001c000 fd:00 3044478 /usr/sbin/auditd
Size: 4 kB
Rss: 4 kB
Pss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
...(snip)...

これなら、あるプロセスが使用しているメモリについて知りたいことが、全て明らかになりすね。

(参考)
https://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or-process

 

何かあれば、お知らせください。

Fedora27 アップグレード後に shell に落ちたときの対処法

標記の件、アップグレードシーケンス終了後の最初の起動時に、/etc/os-release がないと言われ、shell に落とされました。

 

幸い、既にアップグレードできていた Fedora27 が手元にあったので調べてみると、/etc/os-release は /usr/lib/os-release へのシンボリックリンクとなっていて、/usr/lib/os-release は、/usr/lib/os.release.d/os-release-fedora へのシンボリックリンクとなっていました。

 

起動に失敗した OS には、/usr/lib/os.release.d/os-release-fedora がなかったです。

 

/sysroot を rw でマウントして、上記ファイルを以下の内容で作成しました。

続きを読む

Fedora27 にアップグレードする

Fedora27 が出ました、ということで、早速アップグレードしました。

https://fedoraproject.org/wiki/DNF_system_upgrade

# dnf upgrade -y --refresh
# dnf install dnf-plugin-system-upgrade
# dnf system-upgrade download -y --refresh --releasever=27
# dnf system-upgrade reboot

SHIRASAGI-hardening の RPM化(その2)

sourceforge.net

SHIRASAGI-hardening ですけど、RPM を作ってみたので、発表します。

何かあれば、お知らせください。

ソフトウェア RAID 5 (ソフトウェア RAID)を MDADM で設定してみる

ソフトウェア RAID 5 (ソフトウェア RAID)を MDADM で設定してみる

今回は、RAID 5 について実験してみます。

というのも、私のノートパソコンなのですが、ご多分にもれず、壊れました。そこで、昔 RAID 5 システムを使っていたのですが、そのときは、ハードディスクに異常がでたら警報音(ピー、ピーという)がしてランプが点滅したので、ホットなままそのハードディスクを抜いて(引っ張り出す把手があるので)新しいハードディスクを挿す、ということをやっていたのを思い出したのです。

あれはいい気分はしませんでしたが、不思議とちゃんと直って問題なかったので、ああ、RAID 5 はいいな、と思い出した次第です。

さて、ネットにいい資料がありましたので、この記事を参考にして、私が昔、まさしく経験したことを再現してみます。
http://www.elinuxbook.com/how-to-configure-raid-5-in-linux-using-mdadm/

準備

RAID 5 は、( Redundant Array of Independent Disks )の略となります。Redundancy とは、もし何か障害があれば、その障害データを置き換えるバックアップデータがある、ということです。RAID は、1987 年に最初発明されました。RAID 5 の主な
目的は、データをミスするか失うことから守ることにあります。そして、読み込みスピードを増して、システムのパフォーマンスを向上させる事ができます。RAID は、データを守るために、ミラーリングパリティチェック、ストライピングという技術を利用します。
RAID には、たくさんのレベルがあり、それぞれのレベルには新しく発明された特徴があります。RAID レベルのタイプには、RAID 0,RAID 1, RAID 2, RAID 3, RAID 4, RAID 5, RAID 6 RAID 10 (RAID 0RAID 1 の組み合わせ)がありますが、最も利用され、有名な RAID レベルは以下となります。

RAID 0 – データのストライピング
RAID 1 – データのミラーリング
RAID 5パリティチェック付きストライピング
RAID 6 – ダブルパリティチェック付きストライピング
RAID 10ミラーリングとストライピング

ここでは、RHEL/CentOS 7 でどのように RAID 5 (ソフトウェア RAID) を設定するかについて確認して、ハードディスクに障害をおこして復旧させるということを、VirtualBox を使って実際にやってみます。

RAID 5 はどのように動作するのか ?

1010 1110 0110

HARDDISK1 HARDDISK2 HARDDSIK3
1 1 0
0 1 1
1 1 1
0 0 0

まずは、RAID 5 がどのように動作するかを理解します。RAID 5 は、データの安全化のためにストライピングとパリティチェック技術を使用しています。RAID 5 の実際のダイアグラムのスナップショットを上記に示しました。RAID 5 には、少なくとも 3つのハードディスクが必要です。ハードディスクにデータをコピーするときには、0 か 1 の数字のバイナリの形で保存します。したがって、1010 1110 0110 と上に示したようなデータを考えてみます。これらがハードディスクにコピーされたあとには、3つのハードディスク全てに分配されます。たとえば、上に示したように、1010 は ハードディスク1 に、1110 は ハードディスク2 に、0110 が ハードディスク3 に、コピーされます。データを複数のハードディスクに分配するのは、ストライピングと呼ばれています。データをコピーした後に、RAID 5 は、パリティビットを作成して、それぞれのハードディスクに保存します。RAID 5 は、パリティビットを計算するのに、XOR テーブル (Exclusive OR) を利用します。
以下の XOR テーブルを見てください。

XOR (Exclusive OR) Table :
A B Output
0 0 0
0 1 1
1 0 1
1 1 0

上記 XOR テーブルにしたがって、RAID 5 がどのようにパリティビットを計算するかについて見てみます。RAID 5 は、一度に 2つのハードディスクを取って、パリティビットを作成します。例えば、最初にハードディスク 1 と 2、次にハードディスク 2 と 3、最後に、ハードディスク 3 と 1 のように。
今回のシナリオでは、3つのハードディスクがあり、最初に例として、ハードディスク 1 とハードディスク 2 を考えてます。

注:RAID 5 は、パリティデータを全てのハードディスクに保存します。例えば、ハードディスク 1 と 2 のパリティを作成した後、ハードディスク1 とハードディスク2 の両方にパリティを保存します。そして、これは、ハードディスク2 とハードディスク3、ハードディスク3 とハードディスク1 も同様です。
今回は、ハードディスク 1 とハードディスク 2 は、以下のデータを保存しています :

Harddisk 1 Harddisk 2
1 1
0 1
1 1
0 0

パリティの計算方法:

ここで、 XOR テーブルを利用して、パリティチェックを計算してみます。
例 :

ハードディスク 1 の最初のビットは 1 であり、ハードディスク 2の最初のビットは 1であるので、 XOR テーブルは、A=1 B=1 Output=0
我々の最初のパリティビットは、0 となる。

ハードディスク 1 の2番目のビットは 0 であり、ハードディスク 2の2番目のビットは 1であるので、 XOR テーブルは、A=0 B=1 Output=1
我々の2番目のパリティビットは、1 となる。

ハードディスク 1 の3番目のビットは 1 であり、ハードディスク 2の3番目のビットは 1であるので、 XOR テーブルは、A=1 B=1 Output=0
我々の3番目のパリティビットは、0 となる。

ハードディスク 1 の4番目のビットは 0 であり、ハードディスク 2の4番目のビットは 0であるので、 XOR テーブルは、A=0 B=0 Output=0
我々の3番目のパリティビットは、0 となる。

Harddisk 1 Harddisk 2 Parity Check
1 1 0
0 1 1
1 1 0
0 0 0

したがって、ハードディスク 1 と 2 のパリティデータは、0 1 0 0 です。パリティデータを作成したのちに、ハードディスク1 と 2 の両方に、データを保存して、ハードディスクの障害に備えるのです。

FAID 5 は、上記のステップで、ハードディスク 2 と 3、ハードディスク 1 と 3 についてパリティピットを作成します。

最初のハードディスクである、ハードディスク 1 に障害が発生して、新しいハードディスクに交換したとしましょう。この場合、RAID 5 は、新しいハードディスクにどんな計算方法でデータをリカバするのでしょうか。

以下の方法をとります。

ハードディスク 2 には、それ自身だけでは、復旧できないのですが、RAID 5 は、パリティチェックデータを使用して、ハードディスク 1 のデータを復旧するのです。計算方法は以下となります。

ハードディスク 2 とパリティは、以下のデータを保存している :
Harddisk 2 Parity Check
1 0
1 1
1 0
0 0

したがって、ハードディスク 2 のデータとパリティから、 1 0 1 0 の結果を得るので、元のハードディスク 1 のデータを得るのです。
このように、例えばハードディスク 3 に障害が発生しても、同様のステップを経て、新しいハードディスクを交換してもデータを
復元できるのです。

RAID 5 の基本的な理解は以上となります。
では、以下の方法で、mdadm を使用して、RAID 5 (ソフトウェア RAID)を設定してみます。

前述の議論のとおり、 RAID 5 を設定するには、少なくとも 3 つの同じサイズのハードディスクが必要です。ここに、それぞれ 8GB のサイズのハードディスクを用意しました。つぎのアウトプットを見てください。

ーーーーーーーーーーーーーーー
Disk /dev/sda: 22.6 GB, 22630023168 bytes, 44199264 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt


# Start End Size Type Name
1 2048 411647 200M EFI System EFI System Partition
2 411648 2508799 1G Microsoft basic
3 2508800 44197887 19.9G Linux LVM

Disk /dev/sdb: 3145.7 GB, 3145728000000 bytes, 6144000000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdc: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdd: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sde: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/cl-root: 3164.9 GB, 3164916940800 bytes, 6181478400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/cl-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
ーーーーーーーーーーーーーーーーー

さて、それぞれのハードディスクにパーティションを作成して、RAID 5 すなわち、fd にする必要があります。
以下のステップを実行します。

注:RAID 5 を設定するには、3つのパーティションを作成するか、3つのハードディスクを設定するかします。
今回は、3つのハードディスクを使用します。

/dev/sdc にパーティションを作成します。

========
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xd56ff420.

Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-6291455, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215):
Using default value 16777215
Partition 1 of type Linux and of size 8 GiB is set

Command (m for help): t # To change the Partition ID
Selected partition 1
Hex code (type L to list all codes): fd # "fd" は、RAIDパーティションID です。
Changed type of partition 'Linux' to 'Linux raid autodet1ect'

Command (m for help): w # To save the Partition
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
ーーーーーーーーーーーーーーー

/dev/sdd、/dev/sde にも同様にパーティションを作成します(省略)。

さて、パーティションテーブルをシステムをリスタートせずに、partprobe コマンドを使用して保存してみます。以下のコマンドを実行する。

ーーーーーーーーーーーーーーーー
# partprobe /dev/sdc
# partprobe /dev/sdd
# partprobe /dev/sde
ーーーーーーーーーーーーーーーー

さて、RAID パーティションを作成した後のパーティションテーブル見てみます。

ーーーーーーーーーーーーーーーー
Disk /dev/sda: 22.6 GB, 22630023168 bytes, 44199264 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt


# Start End Size Type Name
1 2048 411647 200M EFI System EFI System Partition
2 411648 2508799 1G Microsoft basic
3 2508800 44197887 19.9G Linux LVM

Disk /dev/sdb: 3145.7 GB, 3145728000000 bytes, 6144000000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdc: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x249194cd

Device Boot Start End Blocks Id System
/dev/sdc1 2048 16777215 8387584 fd Linux raid autodetect

Disk /dev/sdd: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x17f0171e

Device Boot Start End Blocks Id System
/dev/sdd1 2048 16777215 8387584 fd Linux raid autodetect

Disk /dev/sde: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x922fbad9

Device Boot Start End Blocks Id System
/dev/sde1 2048 16777215 8387584 fd Linux raid autodetect

Disk /dev/mapper/cl-root: 3164.9 GB, 3164916940800 bytes, 6181478400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/cl-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
ーーーーーーーーーーーーーーーーー

さて、RAID に必要なパーティションを作成したので、RAID 5 (ソフトウェア RAID)を設定していきます。
RAID 5 を設定するには、mdadm というパッケージが必要です。デフォルトでは、インストールされているはずですが、インストールされていなければ、以下のコマンドにより、インストールします。

# yum -y install mdadm

# rpm -q mdadm
mdadm-3.4-14.el7_3.1.x86_64

では、RAID 5 Array を作成します。

# mdadm -C /dev/md0 --level=raid5 --raid-devices=3 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: Defaulting to version 1.2 metadata
[ 1592.845647] md/raid:md0: raid level 5 active with 2 out of 3 devices, algorithm 2
mdadm: array /dev/md0 started.

上記コマンドのうち :

mdadm – RAID Arrey を作成するコマンド
-C – RAID を作成する
/dev/md0 – RAID ドライブのシンタックス
--level – RAID レベル, ここでは、RAID 5
--raid-devices – いくつハードディスクを使うか, ここでは、3つのハードディスクを使用する。

作成した RAID 5パーティションをチェックするには、以下のコマンドを使用します。

ーーーーーーーーーーーーーーー
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jun 18 05:43:07 2017
Raid Level : raid5
Array Size : 16766976 (15.99 GiB 17.17 GB)
Used Dev Size : 8383488 (8.00 GiB 8.58 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Sun Jun 18 05:43:49 2017
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 09a7208f:869034d1:056672cf:238f70d1
Events : 18

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
3 8 65 2 active sync /dev/sde1
ーーーーーーーーーーーーーーーーーーーー

さて、RAID 5 パーティションを作成したので、ファイルシステムを作成してフォーマットしなければいけません。
したがって、RAID 5 のフォーマットは、以下のコマンドを使用します。

注:ここでは、xfs ファイルシステムを使用してフォーマットしています。もちろん、要求に応じて、他の異なるファイルシステムを使用してもよいです。

ーーーーーーーーーーーーーーーーーーー
# mkfs.xfs /dev/md0

meta-data=/dev/md0 isize=512 agcount=16, agsize=262016 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=4191744, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
ーーーーーーーーーーーーーーーーーーー

さて、RAID ドライブをマウントするディレクトリを作成します。2つの方法でドライブをマウントできます。

1) 一時的なマウント 2) 永続的なマウント

一時的なマウントは、システムの再起動後に、自動的にアンマウントされ、次回ブート時にはマウントされないということである。
一時的なマウントをする場合には、以下のステップにしたがいます。

ーーーーーーーーーーーーーーーーーーー
# mkdir /data-md0
# mount /dev/md0 /data-md0
# ls -l /data/
total 0
ーーーーーーーーーーーーーーーーーーー

マウントされたデバイスをチェックするには、以下のコマンドを使用します。

ーーーーーーーーーーーーーーーーーーー
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 2.9T 1.7G 2.9T 1% /
devtmpfs 910M 0 910M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.4M 912M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/sda2 1014M 175M 840M 18% /boot
/dev/sda1 200M 9.5M 191M 5% /boot/efi
tmpfs 184M 0 184M 0% /run/user/0
/dev/md0 16G 33M 16G 1% /data-md0
ーーーーーーーーーーーーーーーーーーー

2. 永続的なマウントは、システムを再起動してもパーティションがマウントされるように、/etc/fstab 設定ファイルにパーティションファイルシステムを記述します。

ーーーーーーーーーーーーーー
# vi /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sun May 7 09:29:16 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl-root / xfs defaults 0 0
UUID=7ae3c25b-9467-4b3a-aaa0-8e6ee1eb9d61 /boot xfs defaults 0 0
UUID=A5BE-AA40 /boot/efi vfat umask=0077,shortname=winnt 0 0
/dev/mapper/cl-swap swap swap defaults 0 0

/dev/md0 /data-md0 xfs defaults 0 0
ーーーーーーーーーーーーーー

マウントテーブルをリフレッシュするために、以下のコマンドを実行します。

ーーーーーーーーーーーーーー
# mount -a
ーーーーーーーーーーーーーー

/etc/fstab により RAID 5 ドライブ をマウントしたのちに、マウントが適切にされたかを df -h コマンドを使用して、確認します。

ーーーーーーーーーーーーーー
# df -h | grep /dev/md0
/dev/md0 16G 33M 16G 1% /data-md0
ーーーーーーーーーーーーーー

では、今度はトラブルシュートをやってみます。
3つのハードディスクのうちの 1つに障害が発生したとします。データをどうやって復旧しましょうか。心配しなくても、いつもデータを復旧する方法はあります。
この Redundancy フィーチャーのおかげで RAID 技術がこんなにも有名になっているのです。世界中でこの技術は使われています。

これから、ハードディスクに障害が発生した時にデータを復旧させる方法を示します。以下のステップにしたがってください。
まずは、シナリオを作成して、以下のコマンドを使用してどれか一つのハードディスク、今回は /dev/sdd1 を実験的に障害をおこさせてみます。

ーーーーーーーーーーーーーーー
# mdadm /dev/md0 -f /dev/sde1 # ハードディスクに障害を発生させる
[ 3865.594531 ] md/raid:md0: Disk failure on sde1, disabling device.
[ 3865.594531 ] md/raid:md0: Operation continuing on 2 devices.
mdadm: set /dev/sde1 faulty in /dev/md0
ーーーーーーーーーーーーーーー

上記コマンドのうち :
f – ハードディスクに障害を発生させる

障害をおこしたハードディスクをチェックするには、以下のコマンドを使用します。
このように、/dev/sdd1 に障害が発生している事が確認できます。

ーーーーーーーーーーーーーーーーー
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jun 18 05:43:07 2017
Raid Level : raid5
Array Size : 16766976 (15.99 GiB 17.17 GB)
Used Dev Size : 8383488 (8.00 GiB 8.58 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Sun Jun 18 06:21:00 2017
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 1
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 09a7208f:869034d1:056672cf:238f70d1
Events : 20

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
- 0 0 2 removed

3 8 65 - faulty /dev/sde1
ーーーーーーーーーーーーーーーーーー

次のステップは、システムからハードディスクを排除します。以下のコマンドを実行します。

========
[root@localhost ~]# mdadm /dev/md0 -r /dev/sde1 # 障害が発生したハードディスクを排除する
mdadm: hot removed /dev/sde1 from /dev/md0
========

上記コマンドのうち :
r – ハードディスクを取り除く

以下の出力で、障害をおこしたハードディスクがシステムから除外されたのが確認できます。
この状態では、新しいハードディスクに入れ替える必要があります。

ーーーーーーーーーーーーーー
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jun 18 05:43:07 2017
Raid Level : raid5
Array Size : 16766976 (15.99 GiB 17.17 GB)
Used Dev Size : 8383488 (8.00 GiB 8.58 GB)
Raid Devices : 3
Total Devices : 2
Persistence : Superblock is persistent

Update Time : Sun Jun 18 06:32:29 2017
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 09a7208f:869034d1:056672cf:238f70d1
Events : 21

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
- 0 0 2 removed
ーーーーーーーーーーーーーーーー

ということで、新しいハードディスク、/dev/sdf を接続しました。RAID の設定をします。以下のステップにしたがいます。

ーーーーーーーーーーーーーーーー
[root@localhost ~]# fdisk /dev/sdf
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-6291455, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215):
Using default value 16777215
Partition 1 of type Linux and of size 8 GiB is set

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
ーーーーーーーーーーーーーーーーーー

では、ハードディスク /dev/sdf1 RAID 5 ドライブ、すなわち、/dev/md0 に加えます。

ーーーーーーーーーーーーーーーーーー
[root@localhost ~]# mdadm /dev/md0 -a /dev/sdf1 # 新しいハードディスクを RAID ドライブに加える
mdadm: added /dev/sdf1
ーーーーーーーーーーーーーーーーーー

上記のコマンドのうち :
a – 新しいハードディスクを加える、という意味です。

状態を、以下のコマンドで確認します。
以下に出力されている用に、/dev/sdf1 が RAID ドライブに追加されました。

ーーーーーーーーーーーーーーーーーーーー
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jun 18 05:43:07 2017
Raid Level : raid5
Array Size : 16766976 (15.99 GiB 17.17 GB)
Used Dev Size : 8383488 (8.00 GiB 8.58 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Sun Jun 18 06:42:56 2017
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 09a7208f:869034d1:056672cf:238f70d1
Events : 44

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
3 8 81 2 active sync /dev/sdf1
ーーーーーーーーーーーーーーーーー

以上で、RAID 5 (ソフトウェア RAID) を Linux 上で設定する方法を終わります。

大切なデータを冗長化技術を使って守るのは、システムの基本だと思います。せっかく利用できるものはどんどん利用してみましょう。
今回の実験を終了します。

次回をお楽しみに。

Linux で既存のソフトウェアRAID 5 の領域を増やす方法

Linux で既存のソフトウェアRAID 5 の領域を増やす方法

お疲れさまです。

Linux でソフトウェア RAID 5 を設定する方法について勉強したんですが。
今回は、既存のソフトウェア RAID 5 ストレージ容量を増やす方法を学びましょう。

さて問題は、なぜソフトウェア RAID 5 のストレージ容量を増やす必要があり、そのやり方はというところです。

さて、実際に前回ソフトウェア RAID 5 で作成しているストレージアレイの容量を増やすのはどうしたらいいのか、まずは、では、以下実際にやっていきましょう。

前回の設定で使用したマシンを使用します。
以下からわかる様に、RAID 5 パーティションサイズは 17.17 GB です。
RAIDバイスは、3 です。

As you can see below my RAID 5 Partition Size is 2.17 GB.
RAID devices are 3 (Highlighted in Red color).

========
# mdadm --detail /dev/md0 # RAID 5パーティションの詳細を確認します。

/dev/md0:
Version : 1.2
Creation Time : Sun Jun 18 05:43:07 2017
Raid Level : raid5
Array Size : 16766976 (15.99 GiB 17.17 GB)
Used Dev Size : 8383488 (8.00 GiB 8.58 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Thu Jul 13 01:37:09 2017
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 09a7208f:869034d1:056672cf:238f70d1
Events : 44

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
3 8 81 2 active sync /dev/sdf1
================
RAIDバイスの詳細は、/proc/mdstat でも確認できます。
================
# cat /proc/mdstat # RAID 5バイスの詳細です

Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdc1[0] sdf1[3] sdd1[1]
16766976 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>
================
このシステムでは以下のように、RAID 5バイスは、/data-md0 ディレクトリにマウントされています。
================
# df -h # マウントデバイスをチェックします。

Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 2.9T 1.7G 2.9T 1% /
devtmpfs 910M 0 910M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.4M 912M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/md0 16G 33M 16G 1% /data-md0
/dev/sda2 1014M 174M 841M 18% /boot
/dev/sda1 200M 9.5M 191M 5% /boot/efi
tmpfs 184M 0 184M 0% /run/user/0
================
では、ソフトウェア RAID 5 のストレージ容量を、ハードディスクを追加することにより増やしてみましょう。
新しいハードディスクを、/dev/sdg として用意しました。
================
# fdisk -l | grep /dev/sdg
Disk /dev/sdg: 8589 MB, 8589934592 bytes, 16777216 sectors
================
では、/dev/sdg に新しいパーティションを作成し、パーティション ID を、RAID 5 、すなわち、fd にしていきます。
================
# fdisk /dev/sdg # Creating a New partition

n
p
Enter
Enter
t
fd
w
================
Linux システムにおいては、新しいパーティションを作成したら、システムを再起動してカーネルにおいてその情報をリフレッシュする必要がありますが、partprobe コマンドを使用することによりパーティションテーブルをカーネルにおいてリフレッシュできます。
================
# partprobe /dev/sdg # パーティションテーブルをリフレッシュする。
================
ということで、パーティション情報を確認すると、/dev/sdg1 は既存のソフトウェア RAID 5 パーティションに接続できる準備ができていることがわかります。
================
# fdisk -l | grep /dev/sdg
Disk /dev/sdg: 8589 MB, 8589934592 bytes, 16777216 sectors
/dev/sdg1 2048 16777215 8387584 fd Linux raid autodetect
================
新しいハードディスクを既存の RAID 5バイスに追加するには、以下のコマンドを実行します。
================
# mdadm --manage /dev/md0 --add /dev/sdg1 # 既存の RAID 5バイスに新しいハードディスクを追加する
mdadm: added /dev/sdg1

上記コマンドのうち:

/dev/md0 – 既存の RAID 5 パーティション
/dev/sdg1 – 新しく追加したパーティション
================
既存のソフトウェア RAID 5 パーティションに新しいハードディスクを追加しましたので、詳細について以下のコマンドにより確認します。
以下の表示のように、新しいハードディスク /dev/sdg1 が追加されました。
しかしながら、RAID 5バイスはまだスペアの状態です。容量は、まだ増えていません。
================
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jun 18 05:43:07 2017
Raid Level : raid5
Array Size : 16766976 (15.99 GiB 17.17 GB)
Used Dev Size : 8383488 (8.00 GiB 8.58 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Thu Jul 13 02:45:54 2017
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 09a7208f:869034d1:056672cf:238f70d1
Events : 45

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
3 8 81 2 active sync /dev/sdf1

4 8 97 - spare /dev/sdg1
================
/proc/mdstat コマンドにより、RAID 5バイスの状態を簡単に確かめることができます。
================
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdg1[4](S) sdf1[3] sdc1[0] sdd1[1]
16766976 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

上記表示のうち :

S – Spare デバイス
================
では、以下のコマンドにより、RAID 5 パーティションサイズを増やしましょう。
================
# mdadm --grow /dev/md0 -n4 # RAID 5バイスストレージの容量を増やす
================
さて、デバイスの状態をチェックしましょう。

以下の表示からわかるように、RAID 5バイスの が、そのリサイズを新しく追加されたハードディスクを含み Reshape されています。
Reshape ステータスは、57 % です。
以下のコマンドを実行した結果により、RAID 5バイスが増えていることがわかります。
================
# mdadm --detail /dev/md0

/dev/md0:
Version : 1.2
Creation Time : Sun Jun 18 05:43:07 2017
Raid Level : raid5
Array Size : 16766976 (15.99 GiB 17.17 GB)
Used Dev Size : 8383488 (8.00 GiB 8.58 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Thu Jul 13 02:58:07 2017
State : clean, reshaping
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Reshape Status : 57% complete
Delta Devices : 1, (3->4)

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 09a7208f:869034d1:056672cf:238f70d1
Events : 69

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
3 8 81 2 active sync /dev/sdf1
4 8 97 3 active sync /dev/sdg1
================
もう一度上記コマンドを実行すると、ソフトウェア RAID 5バイスは、25.75 GB に増加し、RAID 5バイスの数は、4 になりました。
================
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jun 18 05:43:07 2017
Raid Level : raid5
Array Size : 25150464 (23.99 GiB 25.75 GB)
Used Dev Size : 8383488 (8.00 GiB 8.58 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Thu Jul 13 02:58:36 2017
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 09a7208f:869034d1:056672cf:238f70d1
Events : 73

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
3 8 81 2 active sync /dev/sdf1
4 8 97 3 active sync /dev/sdg1
================
このシステムの RAID 5バイスは増加しましたが、df -h コマンドを実行してみると、元のサイズのままで増加してません。
これは、カーネルRAID 5バイスサイズが増加したことを、resize2fs コマンドにより通知する必要があります。
================
# df -h

Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 2.9T 1.7G 2.9T 1% /
devtmpfs 910M 0 910M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.4M 912M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/sda2 1014M 174M 841M 18% /boot
/dev/md0 16G 33M 16G 1% /data-md0
/dev/sda1 200M 9.5M 191M 5% /boot/efi
tmpfs 184M 0 184M 0% /run/user/0
================
したがって、次のコマンドを実行して、カーネルにリサイズした RAID 5バイスと、マウントポイントを通知しましょう。
================
# resize2fs /dev/md0
resize2fs 1.42.9 (28-Dec-2013)
Couldn't find valid filesystem superblock.

おっと、このシステムのファイルシステムが xfs だったのを忘れていました。
以下のコマンドでやり直します。

# xfs_growfs /dev/md0
meta-data=/dev/md0 isize=512 agcount=16, agsize=262016 blks
...(snip)...
data blocks changed from 4191744 to 6287616
================
上記プロセスののち、RAID 5 の容量がリサイズされます。以下の表示を見てください。
================
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 2.9T 1.7G 2.9T 1% /
devtmpfs 910M 0 910M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.4M 912M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/sda2 1014M 174M 841M 18% /boot
/dev/md0 24G 33M 24G 1% /data-md0
/dev/sda1 200M 9.5M 191M 5% /boot/efi
tmpfs 184M 0 184M 0% /run/user/0
================
全ての設定を終えたら、/etc/mdadm.conf に設定を保存するのを忘れないようにしなければいけません。
以下のコマンドを実行します。
================
# mdadm --detail --scan --verbose >> /etc/mdadm.conf
================
注意:RAID 設定を保存するのは必須です。設定を保存しないでシステムを再起動するとRAIDバイスを見つけられない可能性があります。

設定を保存したら、設定を以下のコマンドで確認します。
================
# cat /etc/mdadm.conf
ARRAY /dev/md/0 level=raid5 num-devices=4 metadata=1.2 name=localhost.localdomain:0 UUID=09a7208f:869034d1:056672cf:238f70d1
devices=/dev/sdc1,/dev/sdd1,/dev/sdf1,/dev/sdg1
================
お疲れさまです。今回の実験を終了します。

次回をお楽しみに。

SHIRASAGI-hardening の RPM化(その1)

SHIRASAGI というオープンソースCMS を、RPM化してみようと思っています。

私が、SHIRASAGI-hardening というのを作っていたのですが、それを RPM化します。
https://github.com/intrajp/shirasagi-hardening

SHIRASAGI-hardening には、インストールスクリプトしか存在しません。
インストールスクリプトから、SHIRASAGI upstream を引っ張ってきて、設定は SHIRASAGI-hardening で実行する、
という形です。

これにはちょっと不満を持っているので、SHIRASAGI の内容物とインストーラを含んだものにしたいです。

CentOS7 上で作業しようということで、SHIRASAGI-hardening の作業をしていた、CentOS7.4 を使おうと思います。
なにかいいガイドはないかな、と思いましたが、以下のサイトを見つけました。

http://lifeofageekadmin.com/build-rpms-centos

環境を整えなければいけないということで、以下のように、パッケージをダウンロードします。

# yum install epel-release rpm-build rpmdevtools
# yum groupinstall "Development tools" "Server Platform Development" "Additional Development" “Compatibility libraries”

$ rpmdev-setuptree

これで、rpmbuild ディレクトリが、ホームディレクトリにできました。

次回からは、SHIRASAGI-hardening のパッケージを作っていきたいと思います。

Linux で、HOSTNAME は何 byte まで設定できるか

Linux のHOSTNAMEが、何 byte まで設定できるか試してみました。

結論は、64 byte でした。

以下のコードを動かして確かめました。

なにかあればお知らせください。

/*
Name of the program: test-hostname
Objective: check hostname length on linux box
Author: Shintaro Fujiwara
(borrowed code snippet from https://arstechnica.com/civis/viewtopic.php?t=222715)

copyright Shintaro Fujiwara

Please check
man 2 gethostbyname
hint: According to below, maximum hostname is 64 bytes.
/usr/include/bits/local_lim.h
HOST_NAME_MAX

Compile: gcc -o test-hostname <file>

This program will not break anything, but execute on safe environment with your own responsibility.
This program goes with "NO WARRANTY".

You should be root to execute this program.
# ./test-hostname

---- Enjoy! ----
*/

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

/*current hostname buffer*/
char oldname[65];
/*testhostname buffer*/
char testname[256];
/*hostname 64 bytes long*/
char name_64[256] = "123456789.123456789.123456789.aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaa";
/*hostname 65 bytes long*/
char name_65[256] = "aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaaaaaaa.aaaaa";

int main() {
   // save current hostname
   puts("## hostname length test program##");
   puts("## Save current hostname");
   if(!gethostname(oldname, 65))
     printf(" Saving your current hostname (%s)...\n",oldname);

  // setting hostname 64 bytes long
   puts("## Let's set host name - 64 bytes length");
   if(!sethostname(name_64, strlen(name_64)))
     printf(" Success! Set your hostname to (%s)\n", name_64);
   else
     printf(" Oops! Failed to set your name to (%s)\n", name_64);

  // setting hostname 65 bytes long
   puts("## Let's set host name - 65 bytes length");
   if(!sethostname(name_65, strlen(name_65)))
     printf(" Success! Set your hostname to (%s)\n", name_65);
   else
     printf(" Oops! Failed to set your name to (%s)\n", name_65);

     puts("## Let's set host name 0 byte to 70 bytes length");
     int cnt = 0;
    while (1){
     if(!sethostname(testname, cnt))
       printf("%d bytes works\n",cnt);
     else
     printf("%d bytes does not work\n",cnt);
     cnt++;
     if (cnt > 70)
     break;
}

// restore current hostname
puts("## Restore hostname");
if(!sethostname(oldname, strlen(oldname)))
   printf(" Success! Restored your hostname to (%s)\n", oldname);
else
   puts(" Oops! Failed to restore hostname;)");

// finish the test
puts("This will end the test.");

return 0;
}

続きを読む

backlog の実験

こんにちは、ちょっと涼しくなってきましたね。

今日は、backlog の実験をしてみます。

CentOS6.9 で、メモリ4Gbyte の仮想マシン上で実験しました。

よく使われるアプリケーションとして、Apache を上げてみます。

前提知識です。

syn backlog:接続確立中キューの最大値(不完全なソケットのキューの最大長)

backlog:接続待ちキューの最大値(完全に確立されたソケットのキューの最大長)

tcp_syncookies:

有効(値 1):一定の基準を越えた場合、syncookies を送信する。
syn backlog と backlog の小さいほうの値を、付近の 2の累乗の値に
切り上げた数値を超えると、syncookie を送信します(注)。
その際、ソケット蓄積の概念は放棄されるため、syn backlogの最大値の概念
は無視されます。

無効(値 0): 一定の基準を越えた場合、新たな要求を無視する。
接続確立中キューに syn backlog の 75 % + 1 を超えるソケットが溜まる
と、新しい要求を無視します。

(注)
syncookies は、TCP プロトコルにしたがっていない点があり、攻撃に対する
対処用法として存在し、予備的な機能(fallback functionality)でしか
ないため、SYN flood を起こさせるようなDOS 攻撃を受けていると考えられる
場合のみに発動されるべきです。
(参考)
Documentation/networking/ip-sysctl.txt

次に、それぞれの値の設定ヶ所の説明です。

- syn backlog の設定ヶ所
OS の設定か所:/proc/sys/net/ipv4/tcp_max_syn_backlog
Apache の設定ヶ所:なし

- backlog の設定ヶ所
OSの設定箇所: /proc/sys/net/core/somaxconn
Apache の設定か所: ListenBackLog ディレクティブの設定値

backlog の値について、OS および Apache で設定が可能ですが、以下の条件にしたがいます。

Apache の設定値 ≦ OS の設定値ならば、
Apache の設定値が有効

Apache の設定値 > OS の設定値ならば、
OS の設定値が有効

- tcp_syncookies の設定ヶ所
OS の設定か所:/proc/sys/net/ipv4/tcp_syncookies
Apache の設定ヶ所:なし

backlog の値は、実際は 1 から 65535 まで設定可能です。

例えば、OS および Apache の設定値を 4096 にすると、backlog の設定値は、
Apache の値、4096 となります。

syn backlog の値を増やすかどうかは、そのマシンの通常の通信状況によります。

OS のデフォルト設定では、syncookies が有効になっていますので、
接続確立中の要求が syn backlog の値と、backlog 値の小さいほうの値を、
付近の 2 の累乗の値を切り上げた数値を超えた場合、syncookie が送信されます。

通常のトラフィックにおいて、接続確立中の要求が多くならいようであれば、
syn backlog の値を増やす必要はなく、通常の通信環境においても、
接続確立中の要求が多くなるようであれば、多くする必要があるかもしれませんね。

いずれにしても、設定の際は、通常のアプリケーションの通信状況を把握した上で、
各上限値を設定する必要があるといえます。

TCP ソケットを listen している情報は、以下のコマンドの結果が表示する、
Recv-Q,Send-Q により確認できます。ここで、Send-Q の値が、Apache
backlog になります。

 

# ss -lti '( sport = :http )'

 

接続確立中の要求数の確認は、以下のコマンドで確認できます。

 

# netstat -antp | grep SYN_RECV | wc -l

 

(一例:syncookies=0 で syn backlog が 2048 の時、上限値に達した場合)
1537

 

私が行った設定で実験したら、このようになりました。
--------
・デフォルトの設定

128 /proc/sys/net/core/somaxconn
2048 /proc/sys/net/ipv4/tcp_max_syn_backlog
511 Apache の ListenBackLog ディレクティブ

backlog の最大値 128
tcp_syncookies=1 の場合
接続確立中の要求数の上限値 256(backlog の付近の2の累乗の値)
tcp_syncookies=0 の場合
接続確立中の要求数の上限値 1537(syn backlog * 0.75 + 1 の値)

・OS、Apache の設定値を上げる

2048 /proc/sys/net/core/somaxconn
2048 /proc/sys/net/ipv4/tcp_max_syn_backlog
2048 Apache の ListenBackLog ディレクティブ

backlog の最大値 2048
tcp_syncookies=1 の場合
接続確立中キューの最大値 4096(backlog の付近の2の累乗の値)
tcp_syncookies=0 の場合
接続確立中キューの最大値 1537(syn backlog * 0.75 + 1 の値)

・syn backlog 変化させず、さらにOS、Apacheの設定値を上げる

4096 /proc/sys/net/core/somaxconn
2048 /proc/sys/net/ipv4/tcp_max_syn_backlog
4096 Apache の ListenBackLog ディレクティブ

backlog の最大値 4096
tcp_syncookies=1 の場合
接続確立中キューの最大値 4096(syn backlog の付近の 2 の累乗の値)
tcp_syncookies=0 の場合
接続確立中キューの最大値 1537(syn backlog * 0.75 + 1 の値)

・syn backlog を、4096 に上げる

4096 /proc/sys/net/core/somaxconn
4096 /proc/sys/net/ipv4/tcp_max_syn_backlog
4096 Apache の ListenBackLog ディレクティブ

backlog の最大値 4096
tcp_syncookies=1 の場合
接続確立中キューの最大値 8192(backlog の付近の2の累乗の値)
tcp_syncookies=0 の場合
接続確立中キューの最大値 3073(syn backlog * 0.75 + 1 の値)

 

また、この実験の場合ですが、接続確立中の要求が syn backlog の値と、
backlog 値の小さいほうの値を、付近の 2 の累乗の値を切り上げた数値を超えた
場合、syncookie が送信されることになります。
そのとき、/va/log/messages には、以下のログが 60秒に 1回記録されます。

kernel: possible SYN flooding on port <PORT>. Sending cookies.

 

tcp_syncookies は OS で有効に設定されています。
tcp_syncookies が有効な場合、上述のとおり syn backlog の値を
変化させることにより、接続確立中キューの最大値は変化するので、

適宜設定したらいいと思います。

 

 具体的にどうやって実験したかというと、次のようにやりましたよ。

以下のスクリプトを実行します。これを確認します。

#!/bin/bash
while :
do
netstat -antp | grep SYN_RECV | wc -l

sleep 1
done

 

下記のとおり、SYN FLOOD 攻撃を実行して、上記の表示を観察する(実際のシステムにやってはいけませんよ)。

 

# hping3 -c 10000 -d 120 -S -w 64 -p 21 --flood --rand-source <TARGET_IP>

 

おいしいもの食べたいなぁ。

 

(参考:用語解説等)

https://access.redhat.com/solutions/30453

http://d.hatena.ne.jp/nyant/20111216/1324043063

mpm_common - Apache HTTP サーバ バージョン 2.4

(参考:hping3)
https://www.blackmoreops.com/2015/04/21/denial-of-service-attack-dos-using-hping3-with-spoofed-ip-in-kali-linux/

libvirt をインストールして、ホストマシンから仮想マシンのダンプを取得して crash で読んでみる

こんちには、私です。

今日のお題です。

libvirt をインストールして、ホストマシンから仮想マシンのダンプを取得して crash で読んでみる」です。

libvirt をインストールします。

# dnf install libvirt
# dnf install virt-manager
# virt-manager

編集 - ストレージ
を確認すると、/var/lib/libvirt/images となっています。

ちなみに、/ には、50G しか割り当てがありません。これじゃ、仮想マシンを作れません。新しい領域もないので、今あるものを活用したいです。
/home が大きな容量なので、そちらに移したいです。

ちょっとよろしくないかもですが、ユーザつくって、root own にしてみます。

# useradd virt-manager
# chown root:root /home/virt-manager

これで、root が /home/virt-manager を使えます。

デフォルトのストレージパスを変更します。

# virsh
virsh # pool-destroy default
virsh # pool-undefine default
virsh # pool-define-as --name default --type dir --target /home/virt-manager
virsh # pool-autostart default
virsh # pool-build default
virsh # pool-start default
virsh # exit

ストレージパスが、/home/virt-manager になりました。

ただ、これはいい設定とは言えないので、真似しないでくださいね。

以下のファイルを配置します。

/home/virt-manager/CentOS-6.9-x86_64-bin-DVD1.iso
/home/virt-manager/CentOS-6.9-x86_64-bin-DVD2.iso

インストールします。
ドメインは、centos6.9 にしました。
DVDを、入れ替える指示が出たら、以下を実行します(聞かれませんでした)。
# virsh
virsh # attach-disk generic <path-to-iso> <device> --driver file --type cdrom --mode readonly

ここからは、仮想マシンでの作業です。
# rpm -q yum-utils
入っていなければ、yum-utils をインストールします。
# yum install yum-utils

debuginfo パッケージをインストールします。

# debuginfo-install kernel

これで、ホストマシンでゲストマシンのダンプを採取して、そのダンプファイルをゲストマシンに送って crash で読みます。

ここからは、ホストマシンの作業です。巨大になるので、圧縮します。

# virsh dump centos6.9 centos6.9-dump --memory-only --reset --verbose --format kdump-zlib
ダンプ: [100 %]
ドメイン centos6.9 が centos6.9-dump にダンプされました

サイズは、1.2G でした。

ちなみに、--format kdump-zlib を指定しないと、4G越えてました。


これを、仮想マシンに送って、crash で読めるか確認します。
# scp centos6.9-dump root@192.168.122.140:/root

 

ここからは、仮想マシンでの作業です。
# crash centos6.9-dump /usr/lib/debug/lib/modules/2.6.32-696.el6.x86_64/vmlinux
...(snip)...
crash>

読めました。

crash コマンドについては、ここをみるとよいかもですよ。

http://people.redhat.com/anderson/help.html


(参考)
man virsh

お疲れさまです、私でした。次回をお楽しみに。

CentOS 7.4 を VirtualBox に作成して SHIRASAGI-hardening をインストールする方法

minimal をダウンロード。インストールしてから、curl は入っているので、以下でできる。
$ curl -sO https://raw.githubusercontent.com/intrajp/shirasagi-hardening/master/install.sh
# bash install.sh
そして、systemctl get-default として、graphical.target がないので、以下を実行。
# yum -y groupinstall "GNOME Desktop"
# shutdown -r now
# systemctl list-units --type target --all
graphical.target があるので、これを設定する。
# systemctl set-default graphical.target
# shutdown -r now
# yum install kernel-devel
Guest Addition の挿入を実施する。
# shutdown -r now
Firefox を立ち上げる。
http://localhost:3000/.mypage
アカウント:admin
パスワード:pass

SHIRASAGI-hardening を CentOS 7.4 に対応させました

SHIRASAGI-hardening を、CentOS 7.4 に対応させました。
インストールテストもしました。って、それ以上が分からないけど、今度、勉強します。
アカウント:admin
パスワード:pass
で、テストページが表示できましたぁ。