- 1 keepalivedとは?
- 2 検証環境
- 3 パッケージのインストール
- 4 Netfilterの設定
- 5 httpdサーバの設定
- 6 SELinuxの設定
- 7 動作確認(その1)
- 8 動作確認(その2)
- 9 動作確認(その3)
- 10 動作確認(その4)
- Z 参考情報
1 keepalivedとは?
冗長構成のシステムを構築するためのツールです。ここでは、keepalivedを使って、サーバ2台の冗長構成を作成してみます。
2 検証環境
2.1 ネットワーク構成
KVMホストに仮想マシン2台構成です。仮想IPアドレスは192.168.122.100です。また、各サーバの実IPアドレスは以下のとおりです。
・サーバ1の実IPアドレス:192.168.122.216
・サーバ2の実IPアドレス:192.168.122.181
仮想IP=192.168.122.100 +--- server1 ---+ +--- server2 ---+ | (CentOS7.9) | | (CentOS7.9) | | | | | | | | | +----- eth0 ----+ +----- eth0 ----+ | .216 |.181 | | ------------------------------------------------------- 192.168.122.0/24
3 パッケージのインストール
サーバ1、サーバ2でkeepalivedパッケージをインストールします。
[root@server1 ~]# yum -y install keepalived [root@server2 ~]# yum -y install keepalived
keepalivedの版数を確認します。
[root@server1 ~]# keepalived --version Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2 -snip-
サーバの切り替えをhttpdを使って確認するため、httpdパッケージをインストールします。サーバ1、サーバ2でhttpdパッケージをインストールします。
[root@server1 ~]# yum -y install httpd [root@server2 ~]# yum -y install httpd
4 Netfilterの設定
各サーバのkeepalivedは、お互いが生きているかどうかをマルチキャストパケットを送信しあって監視します。そのため、それぞれのサーバでマルチキャストパケットを送受信できるようにする必要があります。なお、Netfilterの位置づけは、firewall-cmdの使い方 - hana_shinのLinux技術ブログを参照してください。
4.1 サーバ1の設定
224.0.0.18宛てのマルチキャストパケットの受信を許可します。なお、firewall-cmdコマンドの使い方は、firewall-cmdの使い方 - hana_shinのLinux技術ブログを参照してください。
[root@server1 ~]# firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -i eth0 -d 224.0.0.18 -p vrrp -j ACCEPT success
224.0.0.18宛てのマルチキャストパケットの送信を許可します。
[root@server1 ~]# firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -o eth0 -d 224.0.0.18 -p vrrp -j ACCEPT success
サーバが再起動すると設定が消えるので、設定をパーマネントルールとして保存します。
[root@server1 ~]# firewall-cmd --runtime-to-permanent success
設定内容を確認します。マルチキャストパケットの送受信を許可するルールが設定されていることがわかります。
[root@server1 ~]# firewall-cmd --direct --get-all-rules ipv4 filter OUTPUT 1 -o eth0 -d 224.0.0.18 -p vrrp -j ACCEPT ipv4 filter INPUT 1 -i eth0 -d 224.0.0.18 -p vrrp -j ACCEPT
4.2 サーバ2の設定
224.0.0.18宛てのマルチキャストパケットの受信を許可します。
[root@server2 ~]# firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -i eth0 -d 224.0.0.18 -p vrrp -j ACCEPT success
224.0.0.18宛てのマルチキャストパケットの送信を許可します。
[root@server2 ~]# firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -o eth0 -d 224.0.0.18 -p vrrp -j ACCEPT success
サーバが再起動すると設定が消えるので、設定をパーマネントルールとして保存します。
[root@server2 ~]# firewall-cmd --runtime-to-permanent success
設定したルールを確認します。マルチキャストパケットの送受信を許可するルールが設定されていることがわかります。
[root@server2 ~]# firewall-cmd --direct --get-all-rules ipv4 filter OUTPUT 1 -o eth0 -d 224.0.0.18 -p vrrp -j ACCEPT ipv4 filter INPUT 1 -i eth0 -d 224.0.0.18 -p vrrp -j ACCEPT
5 httpdサーバの設定
5.1 サーバ1の設定
index.htmlを編集します。
[root@server1 ~]# echo "Server1" > /var/www/html/index.html
index.htmlの中身を確認します。
[root@server1 ~]# cat /var/www/html/index.html Server1
httpdサービスを再起動します。
[root@server1 ~]# systemctl restart httpd
httpdがListenしているポート番号を確認します。httpdが80番ポートでListenしていることがわかります。なお、lsofコマンドの使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
[root@server1 ~]# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 1641 root 4u IPv6 58389 0t0 TCP *:http (LISTEN) httpd 1642 apache 4u IPv6 58389 0t0 TCP *:http (LISTEN) httpd 1643 apache 4u IPv6 58389 0t0 TCP *:http (LISTEN) httpd 1644 apache 4u IPv6 58389 0t0 TCP *:http (LISTEN) httpd 1645 apache 4u IPv6 58389 0t0 TCP *:http (LISTEN) httpd 1646 apache 4u IPv6 58389 0t0 TCP *:http (LISTEN)
httpdがListenしている80番ポートを解放します。
[root@server1 ~]# firewall-cmd --permanent --add-port=80/tcp success
[root@server1 ~]# firewall-cmd --reload success
kvmホストでcurlコマンドを実行します。このとき、IPアドレスはサーバ1の実IPアドレスを指定します。
[root@kvm ~]# curl http://192.168.122.216:80 Server1
5.2 サーバ2の設定
index.htmlを編集します。
[root@server2 ~]# echo "Server2" > /var/www/html/index.html
index.htmlの中身を確認します。
[root@server2 ~]# cat /var/www/html/index.html Server2
httpdサービスを再起動します。
[root@server2 ~]# systemctl restart httpd
httpdがListenしているポート番号を確認します。httpdが80番ポートでListenしていることがわかります。
[root@server2 ~]# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 1456 root 4u IPv6 58374 0t0 TCP *:http (LISTEN) httpd 1457 apache 4u IPv6 58374 0t0 TCP *:http (LISTEN) httpd 1458 apache 4u IPv6 58374 0t0 TCP *:http (LISTEN) httpd 1459 apache 4u IPv6 58374 0t0 TCP *:http (LISTEN) httpd 1460 apache 4u IPv6 58374 0t0 TCP *:http (LISTEN) httpd 1461 apache 4u IPv6 58374 0t0 TCP *:http (LISTEN)
httpdがListenしている80番ポートを解放します。
[root@server2 ~]# firewall-cmd --permanent --add-port=80/tcp success
[root@server2 ~]# firewall-cmd --reload success
kvmホストでcurlコマンドを実行します。このとき、IPアドレスはサーバ2の実IPアドレスを指定します。
[root@kvm ~]# curl http://192.168.122.181:80 Server2
6 SELinuxの設定
SELinuxが有効になっていると、vrrp_script(後述)が実行できませんでした。本来、vrrp_scriptを実行できるようにルールを作成する必要があるのですが、今現在ルールの作成方法がわからないのでSELinuxの設定をPermissiveに変更します。
サーバ1のSELinux設定をPermissiveに変更します。
[root@server1 ~]# setenforce 0 [root@server1 ~]# getenforce Permissive
サーバ2のSELinux設定をPermissiveに変更します。
[root@server2 ~]# setenforce 0 [root@server2 ~]# getenforce Permissive
なお、サーバを再起動するとSELinuxの設定内容が消えてしまうので、再起動しても設定を維持したい場合は設定ファイル(/etc/sysconfig/selinux)を編集してください。
7 動作確認(その1)
keepalivedをサーバ1、サーバ2の順で起動すると、サーバ1がMASTER、サーバ2がBACKUPになります。このとき、サーバ1のNICに仮想IPアドレスが設定されます。そして、サーバ1のkeepalivedを停止すると、サーバ1の仮想IPアドレスが削除され、サーバ2のNICに設定されることを確認してみます。
7.1 設定ファイル編集
オリジナルの設定ファイルをバックアップします。
[root@server1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.org
サーバ1とサーバ2で、同じ内容の設定ファイルを作成します。
[root@server1 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 virtual_ipaddress { 192.168.122.100/24 } } [root@server1 ~]#
7.2 サーバ1の初期状態確認
keepalived起動前のIPアドレスを確認します。eth0に実IPアドレスが設定されていることがわかります。
[root@server1 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.216/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
keepalivedを起動します。
[root@server1 ~]# systemctl start keepalived
keepalivedの状態を確認します。keepalivedがactiveになったことがわかります。
[root@server1 ~]# systemctl is-active keepalived active
keepalived起動後のIPアドレスを確認します。eth0に仮想IPアドレスが設定されたことがわかります(期待値)。
[root@server1 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.216/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0 inet 192.168.122.100/24 scope global secondary eth0
7.3 サーバ2の初期状態確認
keepalived起動前のIPアドレスを確認します。eth0に実IPアドレスが設定されていることがわかります。
[root@server2 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.181/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
keepalivedを起動します。
[root@server2 ~]# systemctl start keepalived
keepalivedの状態を確認します。keepalivedがactiveになったことがわかります。
[root@server2 ~]# systemctl is-active keepalived active
keepalived起動後のIPアドレスを確認します。サーバ2のeth0には実IPしか設定されていないことがわかります(期待値)。
[root@server2 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.181/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
7.4 動作確認
kvmホストでcurlコマンドを実行します。このとき、仮想IPアドレスを宛先に指定します。この時点で仮想IPアドレスは、サーバ1に割り当てられているので、サーバ1のindex.htmlの内容が表示されていることがわかります。
[root@kvm ~]# curl http://192.168.122.100:80 Server1
サーバ1のkeepalivedを停止します。
[root@server1 ~]# systemctl stop keepalived.service
サーバ1のIPアドレスを確認します。仮想IPアドレスが削除されたことがわかります。
[root@server1 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.216/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
次にサーバ2のIPアドレスを確認します。仮想IPアドレスが設定されたことがわかります。
[root@server2 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.181/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0 inet 192.168.122.100/24 scope global secondary eth0
kvmホストでcurlコマンドを実行します。このとき、仮想IPアドレスを宛先に指定します。この時点で仮想IPアドレスは、サーバ2に割り当てられているので、サーバ2のindex.htmlの内容が表示されていることがわかります。
[root@kvm ~]# curl http://192.168.122.100:80 Server2
8 動作確認(その2)
httpdプロセスの終了を検出したら、サーバ1からサーバ2にMASTERが切り替わることを確認します。
8.1 vrrp_scriptとは?
設定ファイルから、シェルスクリプトを実行する機能です。シェルスクリプトでプロセスの状態をチェックして、もしプロセスが終了したらMASTERを切り替える、といったことができます。
8.2 シェルスクリプトの作成
サーバ1とサーバ2で、同じ内容のシェルスクリプトを作成します。
[root@server1 ~]# vi /etc/keepalived/chk_httpd.sh [root@server1 ~]# cat /etc/keepalived/chk_httpd.sh #!/usr/bin/bash systemctl is-active httpd
シェルスクリプトの実行権を変更します。
[root@server1 ~]# chmod 744 /etc/keepalived/chk_httpd.sh
8.3 設定ファイルの作成
サーバ1とサーバ2で、同じ内容の設定ファイルを作成します。設定内容は、2秒間隔(interval)でシェルスクリプトを実行し、2回続けてhttpdの状態が異常(fall)だったら、FAULTを返す内容になっています。
[root@server1 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { } vrrp_script chk_httpd { script "/etc/keepalived/chk_httpd.sh" interval 2 fall 2 rise 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 virtual_ipaddress { 192.168.122.100/24 dev eth0 } track_script { chk_httpd } } [root@server1 ~]#
設定ファイルを作成したら、サーバ1とサーバ2でkeepalivedを再起動します。
[root@server1 ~]# systemctl restart keepalived.service
8.4 動作確認
サーバ1のIPアドレスを確認します。
[root@server1 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.216/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0 inet 192.168.122.100/24 scope global eth0
kvmホストでcurlコマンドを実行します。この時点で仮想IPアドレスは、サーバ1に割り当てられているので、サーバ1のindex.htmlの内容が表示されていることがわかります。
[root@kvm ~]# curl http://192.168.122.100:80 Server1
サーバ1のhttpdの状態を確認します。httpdの状態がactiveであることがわかります。
[root@server1 ~]# systemctl is-active httpd.service active
httpdを停止します。
[root@server1 ~]# systemctl stop httpd.service
サーバ1のIPアドレスを確認します。仮想IPアドレスが削除されたことがわかります。
[root@server1 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.216/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
サーバ2のIPアドレスを確認します。仮想IPアドレスが設定されたことがわかります。
[root@server2 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.181/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0 inet 192.168.122.100/24 scope global eth0
kvmホストでcurlコマンドを実行します。この時点で仮想IPアドレスは、サーバ2に割り当てられているので、サーバ2のindex.htmlの内容が表示されていることがわかります。
[root@kvm ~]# curl http://192.168.122.100:80 Server2
サーバ1でjournalctlコマンドを実行してみます。仮想IPアドレスが削除され、FAULTに遷移している旨のログが出力されていることがわかります。なお、journalctlコマンドの使い方は、journalctlコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
[root@server1 ~]# journalctl -f -snip- 4月 23 21:47:54 server1 Keepalived_vrrp[2150]: /etc/keepalived/chk_httpd.sh exited with status 3 4月 23 21:47:54 server1 Keepalived_vrrp[2150]: VRRP_Script(chk_httpd) failed 4月 23 21:47:54 server1 Keepalived_vrrp[2150]: VRRP_Instance(VI_1) Entering FAULT STATE 4月 23 21:47:54 server1 Keepalived_vrrp[2150]: VRRP_Instance(VI_1) removing protocol VIPs. 4月 23 21:47:54 server1 Keepalived_vrrp[2150]: VRRP_Instance(VI_1) Now in FAULT state 4月 23 21:47:56 server1 Keepalived_vrrp[2150]: /etc/keepalived/chk_httpd.sh exited with s
サーバ2でjournalctlコマンドを実行してみます。仮想IPアドレスが設定され、MASTERに遷移している旨のログが出力されていることがわかります。
[root@server2 ~]# journalctl -f -snip- 4月 23 21:51:00 server2 Keepalived_vrrp[2513]: VRRP_Instance(VI_1) Transition to MASTER STATE 4月 23 21:51:01 server2 Keepalived_vrrp[2513]: VRRP_Instance(VI_1) Entering MASTER STATE 4月 23 21:51:01 server2 Keepalived_vrrp[2513]: VRRP_Instance(VI_1) setting protocol VIPs. 4月 23 21:51:01 server2 Keepalived_vrrp[2513]: Sending gratuitous ARP on eth0 for 192.168.122.100 4月 23 21:51:01 server2 Keepalived_vrrp[2513]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.122.100
9 動作確認(その3)
httpdプロセスのハングアップを検出したら、MASTERがサーバ1からサーバ2に切り替わることを確認します。
9.1 シェルスクリプトの作成
サーバ1とサーバ2で、同じ内容のシェルスクリプトを作成します。
[root@server1 ~]# vi /etc/keepalived/check_hungup.sh [root@server1 ~]# cat /etc/keepalived/check_hungup.sh #!/usr/bin/bash timeout 3 curl http://localhost:80 status=$? if [ $status -eq 0 ]; then logger "All processes are alive." exit 0 elif [ $status -eq 124 ]; then logger "There is a process that is hanging up." exit 1 else logger "Something is wrong." exit 1 fi
シェルスクリプトの実行権を変更します。
[root@server1 ~]# chmod 744 /etc/keepalived/check_hungup.sh
9.2 設定ファイルの作成
サーバ1とサーバ2で、同じ内容の設定ファイルを作成します。
[root@server1 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { } vrrp_script chk_httpd { script "/etc/keepalived/check_hungup.sh" interval 2 fall 2 rise 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 virtual_ipaddress { 192.168.122.100/24 dev eth0 } track_script { chk_httpd } } [root@server1 ~]#
設定ファイルを作成したら、keepalivedを再起動します。
[root@server1 ~]# systemctl restart keepalived.service
9.3 動作確認
httpdプロセスの状態を確認します。
[root@server1 ~]# ps -C httpd -o comm,command,pid,state COMMAND COMMAND PID S httpd /usr/sbin/httpd -DFOREGROUN 7727 S httpd /usr/sbin/httpd -DFOREGROUN 7728 S httpd /usr/sbin/httpd -DFOREGROUN 7729 S httpd /usr/sbin/httpd -DFOREGROUN 7730 S httpd /usr/sbin/httpd -DFOREGROUN 7731 S httpd /usr/sbin/httpd -DFOREGROUN 7732 S
kvmホストでcurlコマンドを実行します。このとき、仮想IPアドレスを宛先に指定します。この時点で仮想IPアドレスは、サーバ1に割り当てられているので、サーバ1のindex.htmlの内容が表示されていることがわかります。
[root@kvm ~]# curl http://192.168.122.100:80 Server1
httpdプロセスにSIGSTOPシグナルを送信します。
[root@server1 ~]# pkill -SIGSTOP httpd
httpdプロセスの状態を確認します。httpdプロセスが停止状態になったことがわかります。
[root@server1 ~]# ps -C httpd -o comm,command,pid,state COMMAND COMMAND PID S httpd /usr/sbin/httpd -DFOREGROUN 7727 T httpd /usr/sbin/httpd -DFOREGROUN 7728 T httpd /usr/sbin/httpd -DFOREGROUN 7729 T httpd /usr/sbin/httpd -DFOREGROUN 7730 T httpd /usr/sbin/httpd -DFOREGROUN 7731 T httpd /usr/sbin/httpd -DFOREGROUN 7732 T
kvmホストでcurlコマンドを実行します。このとき、仮想IPアドレスを宛先に指定します。この時点で仮想IPアドレスは、サーバ2に割り当てられているので、サーバ2のindex.htmlの内容が表示されていることがわかります。
[root@kvm ~]# curl http://192.168.122.100:80 Server2
10 動作確認(その4)
keepalivedがSIGKILLを受信して異常終了すると、仮想IPアドレスがMASTERとBACKUPの両方に設定される事象が発生します。このような状態にならないようにするため、keepalivedを自動起動するようなユニット定義ファイルを作成します。
10.1 発生事象の確認
実際にkeepalivedにSIGKILLを送信して、どのような事象が発生するのか確認をしてみます。現時点でサーバ1がMASTER、サーバ2がBACKUPです。
[root@server1 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.216/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0 inet 192.168.122.100/24 scope global secondary eth0
[root@server2 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.181/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
keepalivedの状態を確認します。
[root@server1 ~]# ps -C keepalived PID TTY TIME CMD 4835 ? 00:00:00 keepalived 4836 ? 00:00:00 keepalived 4837 ? 00:00:00 keepalived
keepalivedにSIGKILLを送信します。
[root@server1 ~]# pkill -9 keepalived [root@server1 ~]#
サーバ1のIPアドレスを確認します。実IPアドレスと仮想IPアドレスが設定されていることがわかります。
[root@server1 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.216/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0 inet 192.168.122.100/24 scope global secondary eth0
サーバ2のIPアドレスを確認します。こちらも、実IPアドレスと仮想IPアドレスが設定されていることがわかります。
[root@server2 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.181/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0 inet 192.168.122.100/24 scope global secondary eth0
10.2 対処内容
サーバ1とサーバ2で、同じ内容の設定ファイルを作成します。
[root@server1 ~]# vi /etc/systemd/system/keepalived.service [root@server1 ~]# cat /etc/systemd/system/keepalived.service [Unit] Description=LVS and VRRP High Availability Monitor After=syslog.target network.target [Service] Type=forking Restart=on-failure PIDFile=/var/run/keepalived.pid KillMode=process EnvironmentFile=-/etc/sysconfig/keepalived ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target
systemdに定義ファイルの変更を読み込ませます。
[root@server1 ~]# systemctl daemon-reload
keepalivedを再起動します。
[root@server1 ~]# systemctl restart keepalived
10.3 対処後の動作確認
サーバ1のIPアドレスを確認します。実IPアドレスと仮想IPアドレスが設定されていることがわかります。
[root@server1 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.216/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0 inet 192.168.122.100/24 scope global secondary eth0
サーバ2のIPアドレスを確認します。実IPアドレスが設定されていることがわかります。
[root@server2 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.181/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
keepalivedの状態を確認します。
[root@server1 ~]# ps -C keepalived PID TTY TIME CMD 8951 ? 00:00:00 keepalived 8952 ? 00:00:00 keepalived 8953 ? 00:00:00 keepalived
keepalivedにSIGKILLを送信します。
[root@server1 ~]# pkill -9 keepalived
サーバ1のIPアドレスを確認します。実IPアドレスと仮想IPアドレスが設定されていることがわかります。
[root@server1 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.216/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0 inet 192.168.122.100/24 scope global secondary eth0
サーバ2のIPアドレスを確認します。対処前は、サーバ2にも仮想IPアドレスが設定されていましたが、対処後は、実IPアドレスだけが設定されるようになりました。
[root@server2 ~]# ip a show dev eth0|grep -w inet inet 192.168.122.181/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ