仮想マシンを停止することなくLVMでディスク容量を追加する

OS:CentOS Linux release 7.7.1908
LVM: 2.02.185(2)-RHEL7
VMware Workstaion 15 Pro 15.5.2 build-15785246

既に稼働中の仮想マシンを停止せずにディスク容量を増すよう指令を受け実践するものである。然し乍ら追加したいディスクの種類がIDEとNVMeの場合は稼働中、新たに追加すること能わぬからこういう場合、関係者とマシン停止の機会を何としてでも調整せねばならない。まずは現状のブロックデバイスを把握する。

$ lsblk -i
NAME                    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                      11:0    1 1024M  0 rom
nvme0n1                 259:0    0   20G  0 disk
|-nvme0n1p1             259:1    0    1G  0 part /boot
`-nvme0n1p2             259:2    0   19G  0 part
  |-centos_centos7-root 253:0    0   17G  0 lvm  /
  `-centos_centos7-swap 253:1    0    2G  0 lvm  [SWAP]

そうしたら仮想マシンにディスクを追加する。

仮想マシンが稼働中であるとIDEとNVMeの仮想ディスクは追加できない

恙無くディスクが追加されたら改めてブロックデバイスを一覧すると新たにsdaというブロックデバイスがあるからこれが先に追加したディスクであろうと見当が付く。

$ lsblk -i
NAME                    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                       8:0    0   20G  0 disk
sr0                      11:0    1 1024M  0 rom
nvme0n1                 259:0    0   20G  0 disk
|-nvme0n1p1             259:1    0    1G  0 part /boot
`-nvme0n1p2             259:2    0   19G  0 part
  |-centos_centos7-root 253:0    0   17G  0 lvm  /
  `-centos_centos7-swap 253:1    0    2G  0 lvm  [SWAP]

このあとの手続きは物理ボリューム、ボリュームグループ、論理ボリュームそれぞれの作成である。先ずは追加したブロックデバイス /dev/sda をLVMで扱うために物理ボリュームとして初期化する。

$ sudo pvs
  PV             VG             Fmt  Attr PSize   PFree
  /dev/nvme0n1p2 centos_centos7 lvm2 a--  <19.00g    0

$ sudo pvcreate /dev/sda
  Physical volume "/dev/sda" successfully created.

$ sudo pvs
  PV             VG             Fmt  Attr PSize   PFree
  /dev/nvme0n1p2 centos_centos7 lvm2 a--  <19.00g    0
  /dev/sda       centos_centos7 lvm2 a--  <20.00g    0

/dev/sda が物理ボリュームとして追加されているから引き続き之を元にしてボリュームグループを作成する。ボリュームグループ名である centos_centos7 を用いてボリュームグループを作成した。

$ sudo vgs
  VG             #PV #LV #SN Attr   VSize   VFree
  centos_centos7   1   2   0 wz--n- <19.00g    0

$ sudo vgextend centos_centos7 /dev/sda
  Volume group "centos_centos7" successfully extended

$ sudo vgs
  VG             #PV #LV #SN Attr   VSize  VFree
  centos_centos7   2   2   0 wz--n- 38.99g    0

次に論理ボリュームを追加する。ボリュームグループ centos_centos7 の内、論理ボリューム root の容量を拡張したいからlvextendコマンドでこうである。

$ sudo lvs
  LV   VG             Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos_centos7 -wi-ao---- <17.00g
  swap centos_centos7 -wi-ao----   2.00g

$ sudo lvextend -l +100%FREE /dev/mapper/centos_centos7-root
  Size of logical volume centos_centos7/root changed from <17.00 GiB (4351 extents) to 36.99 GiB (9470 extents).
  Logical volume centos_centos7/root successfully resized.

$ sudo lvs
  LV   VG             Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos_centos7 -wi-ao---- 36.99g
  swap centos_centos7 -wi-ao----  2.00g

最後にファイルシステムの拡張を実施する。XFSファイルシステムで構成されているから xfs_growfs コマンドで以って拡張する。

$ df -Th
ファイルシス                    タイプ   サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos_centos7-root xfs         17G  1.5G   16G    9% /

$ sudo xfs_growfs /dev/mapper/centos_centos7-root
meta-data=/dev/mapper/centos_centos7-root isize=512    agcount=4, agsize=1113856 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=4455424, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

$ df -Th
ファイルシス                    タイプ   サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos_centos7-root xfs         37G  1.5G   36G    4% /

これでようやっとディスク容量の拡張が達成された。

.txtでない拡張子のファイルをtext/plainとして扱いたい

OS: CentOS Linux release 7.7.1908 (Core)
httpd-2.4.6-90.el7.centos.x86_64
Internet Explorer 11.719.18362.0

.lstという拡張子の付くテキストファイルをInternet Explorerで表示したときに改行が反映されないという通報を受けて調査を進めたところ、Content-Typeがtext/plainとして扱われていないが為に表示がクシャリとなっている模様である。

Google Chromeでは改行がきっちり表現されていたからInternet Explorer固有の問題であると早合点して、Microsoft Edgeへの移行を進言すべく目論んでいたところ、Microsoft Edgeもやはり表示がクシャリとなってしまったからすっかり計画が狂ってしまった。

拡張子が.txtであれば勝手にtext/plain扱いされて良いけれどもファイル名の変更は受け入れられない情勢である。唯一、Apacheの設定変更のみが許されているのである。それでこうである。

$ sudo vi /etc/httpd/conf/httpd.conf
<FilesMatch "\.lst$">
  AddType text/plain lst
</FilesMatch>

これで拡張子が.lstのファイルもtext/plainとして扱われてInternet Explorerでも改行が反映された。反映されないときは概ねキャッシュが邪魔をしているからCrtl+F5でスーパーリロードするのが宜しい。

AddTypeディレクティブは無闇にセットすると.lst.guroのような拡張子であっても効果を発揮してしまうから本当は SetHandler text/plain を使うのが良いようである。

けれどもどうしてもSetHandlerの設定が反映されなかったので已む無くFilesMatchディレクティブで取り囲んだAddTypeでお茶を濁したものである。

参考:
AddType ディレクティブ

Raspberry Pi 3 に Zabbix をインストールする

Raspberry Pi 3 Model B
OS: Raspbian Buster Lite

先ずは Download and install Zabbix へアクセスしてインストールしたいZabbixのバージョンやOSなどを選択する。そうすると其れに合わせたインストール手順が示されるから此れに従う。データベースにはMySQLを選択した。

$ sudo wget https://repo.zabbix.com/zabbix/4.0/raspbian/pool/main/z/zabbix-release/zabbix-release_4.0-3+buster_all.deb
$ sudo dpkg -i zabbix-release_4.0-3+buster_all.deb
$ sudo apt update
$ sudo apt install zabbix-server-mysql zabbix-frontend-php zabbix-agent

OSインストール直後の状態からZabbixパッケージのインストールを実施すると81にも及ぶパッケージの導入が始まる。

インストールが一段落したら、一先ずrootユーザでMySQLにログインする。パスワードは空っぽうだから何も入力せずにEnterを押下する。そうしてデータベースとユーザを作成する。データベースを作成する際にうっかりして character set utf8 collate utf8_binを忘れたら、データをインポートする段になって ERROR 1071 (42000) at line 165: Specified key was too long; max key length is 767 bytes などとエラーが発生して処理が進まなくなった。

デフォルトでセットされる文字コードのutf8mb4であると1文字あたり最大で4バイトも使用してテーブルのカラムに収まりきらないサイズになるから、此れを抑えるために1文字3バイトのutf8を態々指定する模様である。指示されたとおりにコピー&ペーストすることの肝要さを思い知ったものである。

$ sudo mysql -uroot -p
Enter password:

MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'password';
MariaDB [(none)]> quit;

次はZabbixサーバがデータベースに接続するためにユーザのパスワードを記載しておく。

$ sudo vi /etc/zabbix/zabbix_server.conf
DBPassword=password

それからApacheの設定ファイルにあるPHPのdate.timezoneを編集するのであるが、PHP5とPHP7の場合でそれぞれ場合分けをして設定が記載されているから知らずPHP5のほうだけを編集して満足していると、この後にある作業で Time zone for PHP is not set (configuration parameter "date.timezone"). となって立ち往生する。公式の手順に沿うとPHP7がインストールされるからそちら側を弄う必要がある。

$ sudo vi /etc/zabbix/apache.conf
    <IfModule mod_php7.c>
(snip)
        # php_value date.timezone Europe/Riga
        php_value date.timezone Asia/Tokyo
    </IfModule>

$ php -v
PHP 7.3.14-1~deb10u1 (cli) (built: Feb 16 2020 15:07:23) ( NTS )
$ sudo systemctl restart zabbix-server zabbix-agent apache2
$ sudo systemctl enable zabbix-server zabbix-agent apache2
(snip)
Created symlink /etc/systemd/system/multi-user.target.wants/zabbix-server.service → /lib/systemd/system/zabbix-server.service.
Created symlink /etc/systemd/system/multi-user.target.wants/zabbix-agent.service → /lib/systemd/system/zabbix-agent.service.

そうしたらブラウザでZabbixのページにアクセスしてウィザードに従いながら設定をする。

インストール直後の初期状態ではユーザ名:Admin、パスワード:zabbixでサインインする。

さっそくZabbixがサーバのグラフ制作に取り掛かってくれているのであるが、如何せん文字が豆腐状態であるから困る。之を解消せねばならない。Notoを導入してZabbixが採用するフォントとして設定してやれば終いである。

$ sudo apt install fonts-noto-cjk
$ cd /etc/alternatives/
$ sudo ln -sf /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc zabbix-frontend-font

ownCloudのインストール時にMySQLのエラーが表示されて処理がちっとも進まない

ownCloud: 10.3.2
MySQL: 8.0.18

ownCloudをインストールしようとするとこういうエラーメッセージを受け取るようになった。

Error while trying to create admin user: Failed to connect to the database: An exception occured in driver: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

どうもMySQL8系からは認証プラグインにcaching_sha2_passwordが標準で採用されるようになり、従来からのmysql_native_passwordから置き換わった模様である。ownCloud 10.3.2はこの流れに未だ対応していない為にエラーとなっているのである。これを避けるために一先ずMySQL接続ユーザの認証プラグインをかつてのmysql_native_passwordへと設定した。

mysql> create user 'ocadmin'@'localhost' identified by 'p@ssw0rd';
mysql> grant all on owncloud.* to 'ocadmin'@'localhost' with grant option;
mysql> select user, plugin from mysql.user where user = 'ocadmin';
+---------+-----------------------+
| user    | plugin                |
+---------+-----------------------+
| ocadmin | caching_sha2_password |
+---------+-----------------------+

mysql> alter user 'ocadmin'@'localhost' identified with mysql_native_password by 'p@ssw0rd' ;
mysql> select user, plugin from mysql.user where user = 'ocadmin';
+---------+-----------------------+
| user    | plugin                |
+---------+-----------------------+
| ocadmin | mysql_native_password |
+---------+-----------------------+

mysql> create database owncloud;

そうして改めてownCloudのインストールを試みると恙無く完了したのでよかった。

参考:
6.4.1.2 Caching SHA-2 Pluggable Authentication

Squidをソースから導入してSSL Bumpを設定する

サーバOS: Ubuntu 18.04 Server
クライアントOS: Windows 10 Pro version 1903
Squid 4.9

まずはソースコードを取得するところから始める。

$ wget -c http://www.squid-cache.org/Versions/v4/squid-4.9.tar.bz2
$ wget -c http://www.squid-cache.org/Versions/v4/squid-4.9.tar.bz2.asc
$ gpg --recv-keys B06884EDB779C89B044E64E3CD6DBF8EF3B17D3E
$ gpg --verify squid-4.9.tar.bz2.asc
(snip)
gpg: Good signature from "Amos Jeffries (Squid Signing Key) <squid3@treenet.co.nz>" [unknown]

libssl-dev パッケージが不足していると configure: error: library 'crypto' is required for OpenSSL というエラーメッセージが突き付けられるから予めの導入を要する。

$ sudo apt install libssl-dev
$ sudo useradd -s /bin/false squid
$ tar jxvf squid-4.9.tar.bz2
$ cd squid-4.9/
$ ./configure --prefix=/usr/local/squid --enable-ssl-crtd --with-openssl --with-default-user=squid
$ make all
$ sudo make install

次いで自己署名証明書を生成する。これはルート証明書として取り扱うことになる。証明書のセキュリティが侵害されるとMITM攻撃に晒される恐れがあるというから十分に注意を払わねばならない。

$ cd /usr/local/squid/etc/
$ sudo openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem
$ sudo openssl x509 -in myCA.pem -outform DER -out myCA.der

作成した自己署名証明書をクライアントの端末へコピーしてインストールする。

証明書を右クリックしてコンテキストメニューから「証明書のインストール」を選択
「証明書をすべて次のストアに配置する」を選択して「参照」
「信頼されたルート証明期間」を選択して「OK」を押下す
「次へ」をクリック
「完了」をクリック
インストールを許すなら「はい」をクリック

実際に証明書がインストールされたか否かを詳らかにするため inetcpl.cpl を実行してインターネットのプロパティを開く。

「コンテンツ」タブを開いて「証明書」ボタンをクリック
インストールされたことを確認

squidサーバの設定へ戻り、証明書の所有者とパーミッションを変更してsquidユーザだけが読み取れるようにしておく。

$ sudo chown squid:squid myCA.pem
$ sudo chmod 400 myCA.pem
$ ls -l myCA.pem
-r-------- 1 squid squid 3095 Nov 24 00:05 myCA.pem

設定ファイル squid.conf の編集に移る。動的に生成された証明書をキャッシュできるメモリやディスクの容量を指定する箇所があるけれども、どの程度が適当かとんと検討がつかぬから思い切って公式サイトの手引きの4倍をセットした。

あと sslcrtd_program の項目に ssl_crtd コマンドを指定しているサイトが其処此処に見られたけれども、此れがどうしても見当たらなくてこまった。リリースノートを過去へ遡ってゆくとバージョン4.0.5からは名称が security_file_certgen へと移り変わった模様である。

$ sudo vi /usr/local/squid/etc/squid.conf
#http_port 3128
http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=16MB cert=/usr/local/squid/etc/myCA.pem
sslcrtd_program /usr/local/squid/libexec/security_file_certgen -s /usr/local/squid/var/cache/squid/ssl_db -M 16MB
sslcrtd_children 20
sslproxy_cert_error deny all
ssl_bump stare all

動的に生成される証明書をキャッシュしておくディレクトリを用意する為に次のコマンドを実施する。

$ sudo /usr/local/squid/libexec/security_file_certgen -c -s /usr/local/squid/var/cache/squid/ssl_db -M 16MB
Initialization SSL db...
Done

これで一通りの下拵へは済んだから愈々Squidを起動するとパーミッションにまつわるエラーメッセージでまったく起動できない。/usr/local/squid/var/ 以下の所有者を一斉に squid へと差し替えて事なきを得た。

$ sudo /usr/local/squid/sbin/squid
WARNING: Cannot write log file: /usr/local/squid/var/logs/cache.log
/usr/local/squid/var/logs/cache.log: Permission denied
         messages will be sent to 'stderr'.

$ sudo chown -R squid:squid /usr/local/squid/var/
$ sudo /usr/local/squid/sbin/squid

あとはクライアント端末のProxy設定をよしなに整えてやれば終いである。

ログを流しながらGoogle Chromeで多数のサイトを閲覧したけれどもちっともキャッシュにヒットせずTCP_MISSばかり発生するから此は如何にと思っていたらどうも先んじてGoogle ChromeのキャッシュにヒットするせいでSquidの出番がなかった模様である。

Google Chromeの起動オプションに --disk-cache-size=1 を指定して実質的にキャッシュを無効にしてから改めて試験を実施するとキャッシュにヒットした証のTCP_MEM_HITが現れるようになった。

–disk-cache-sizeを指定する。0は際限なくキャッシュするようであるから1とした
TCP_MEM_HITがたくさん見られて喜ばしいログ

参考:
Dynamic SSL Certificate Generation
Compiling Squid