2019年12月11日水曜日

CentOS8.0 で /tmp を tmpfs に設定できない

最近の SSD なら気にしなくてもよさそうですが、SSD の消耗対策に /tmp を tmpfs にしようとしたら、CentOS8.0 では次のコマンドが効きませんでした。RHEL7/CentOS7 では、この操作でよかったはずですが。
[root@hoge ~]# df -hT /tmp
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/nvme0n1p6 ext4      40G  9.4G   28G   26% /
[root@hoge ~]# systemctl enable tmp.mount
The unit files have no installation config (WantedBy, RequiredBy, Also, Alias
settings in the [Install] section, and DefaultInstance for template units).
This means they are not meant to be enabled using systemctl.
Possible reasons for having this kind of units are:
1) A unit may be statically enabled by being symlinked from another unit's
   .wants/ or .requires/ directory.
2) A unit's purpose may be to act as a helper for some other unit which has
   a requirement dependency on it.
3) A unit may be started when needed via activation (socket, path, timer,
   D-Bus, udev, scripted systemctl call, ...).
4) In case of template units, the unit is meant to be enabled with some
   instance name specified.
[root@hoge ~]# rpm -q systemd
systemd-239-13.el8_0.5.x86_64
調べてみると、バグという話しです。RHEL8.1 では既に直っている模様。
https://bugzilla.redhat.com/show_bug.cgi?id=1667065
修正イメージは次の通りです。https://github.com/lnykryn/systemd-rhel/pull/275/
@@ -22,3 +22,7 @@ What=tmpfs
 Where=/tmp
 Type=tmpfs
 Options=mode=1777,strictatime,nosuid,nodev
+
+# Make 'systemctl enable tmp.mount' work:
+[Install]
+WantedBy=local-fs.target
ということなので、systemctl edit で差分を追加すれば、応急処置できます。
[root@hoge ~]# EDITOR=vim systemctl edit tmp.mount
[root@hoge ~]# systemctl cat tmp.mount
# /usr/lib/systemd/system/tmp.mount
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Temporary Directory (/tmp)
Documentation=man:hier(7)
Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
ConditionPathIsSymbolicLink=!/tmp
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
After=swap.target

[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime,nosuid,nodev

# /etc/systemd/system/tmp.mount.d/override.conf
# Make 'systemctl enable tmp.mount' work:
[Install]
WantedBy=local-fs.target
[root@hoge ~]# systemctl enable tmp.mount
Created symlink /etc/systemd/system/local-fs.target.wants/tmp.mount → /usr/lib/systemd/system/tmp.mount.
[root@hoge ~]#
上記はたいした内容ではないですが、やはり RHEL8.0/CentOS8.0 は、まだまだ こなれていない 印象です。業務用サーバとして使うのなら、やはり RHEL8.2 あたりからではないでしょうかね。

2019年11月29日金曜日

シェル芸で audit ログに分かり易いタイムスタンプを付加

audit ログというのは、めったには見ないのですが、タイムスタンプが UNIX 時間になっていて不便です。前回の dmesg に続いて、分かり易いタイムスタンプを付加してみました。
[root@hoge ~]# gawk -F\( '{print strftime("%F %T",$2),$0}' /var/log/audit/audit.log
...
2019-11-29 06:26:01 type=SERVICE_STOP msg=audit(1574976361.151:1341): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=sysstat-collect comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'UID="root" AUID="unset"
2019-11-29 06:27:01 type=SERVICE_START msg=audit(1574976421.151:1342): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=sysstat-collect comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'UID="root" AUID="unset"
2019-11-29 06:27:01 type=SERVICE_STOP msg=audit(1574976421.151:1343): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=sysstat-collect comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'UID="root" AUID="unset"
[root@hoge ~]# 
厳密には $2 をピリオド (.) または コロン (:) のところまででカット (1574976421.151:1343 -> 1574976421) してから、strftime に渡すのが「お行儀が良い」ものと思いますが、AWK の仕様を考えれば、そのまま $2 を渡すで良いものと思います。もっと明示的に、0+$2 と記述することもできますが、シェル芸 (gawk芸?) 道的には、そのまんま $2 指定でしょう。
[root@hoge ~]# date ; gawk -F\( '{printf("%d %s\n",0+$2,$0)}' /var/log/audit/audit.log | tail -1
2019年 11月 29日 金曜日 06:40:32 JST
1574977201 type=SERVICE_STOP msg=audit(1574977201.368:1377): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=dnf-makecache comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'UID="root" AUID="unset"
[root@hoge ~]# date -d @1574977201
2019年 11月 29日 金曜日 06:40:01 JST

2019年11月27日水曜日

シェル芸で dmesg に分かり易いタイムスタンプを付加してみたが・・・

ふと思い付きで、dmesg の左端のタイムスタンプを分かり易くできるのでは、と閃いた。。。
[root@hoge ~]# (date -d"$(uptime -s)" +%s;dmesg)|awk -F\[ 'BEGIN {getline b} {print strftime("%F %T",b+$2),$0}'
...
2019-11-27 21:46:52 [52976.500320] IPv6: ADDRCONF(NETDEV_UP): wlp4s0: link is not ready
2019-11-27 21:47:10 [52994.337872] [drm:intel_pipe_update_end [i915]] *ERROR* Atomic update failure on pipe B (start=92367 end=92368) time 177 us, min 1073, max 1079, scanline start 1069, end 1077
2019-11-27 21:47:11 [52995.637878] [drm:intel_pipe_update_end [i915]] *ERROR* Atomic update failure on pipe B (start=92445 end=92446) time 174 us, min 1073, max 1079, scanline start 1068, end 1079
しかしながら、そもそも dmesg のオプションに、所望の機能があるのではないかと、ヘルプを見てみたら。。。ありました。
[root@hoge ~]# dmesg -e
...
[11月27 21:46] IPv6: ADDRCONF(NETDEV_UP): wlp4s0: link is not ready
[11月27 21:47] [drm:intel_pipe_update_end [i915]] *ERROR* Atomic update failure on pipe B (start=92367 end=92368) time 177 us, min 1073, max 1079, scanline start 1069, end 1077
[  +1.300006] [drm:intel_pipe_update_end [i915]] *ERROR* Atomic update failure on pipe B (start=92445 end=92446) time 174 us, min 1073, max 1079, scanline start 1068, end 1079
知らなかった。/var/log/messages を見て、対応する行を探してました。この機会に、頭のノートにメモっておこう。

2019年11月17日日曜日

bash の [[ の中では -a は使えない

長年 bash を使っていて、気がつきませんでしたが、[[ の中では -a (AND条件指定) は使えないことを知りました。
[root@hoge ~]# A="hoge"
[root@hoge ~]# B="fuga"
[root@hoge ~]# [[ $A = ho* -a $B = fu* ]]
bash: 条件式に構文エラーがあります
bash: `-a' 周辺に構文エラーがあります
[root@hoge ~]# [[ $A = ho* && $B = fu* ]]
[root@hoge ~]# echo $?
0
このように -a は使えないが、その代わりに && が使えるようです。
[root@hoge ~]# help [[
[[ ... ]]: [[ expression ]]
    条件式のコマンドを実行します。

    条件式 EXPRESSION の評価結果に基づいて 0 または 1 を返します。
    条件式は test 組み込み関数と同じ優先順位で組み合わされます。また、
    次の演算子とも組み合わされます。

      ( EXPRESSION )    EXPRESSION の値を返します
      ! EXPRESSION              EXPRESSION が true の時 false を返します。それ
                                以外は false を返します
      EXPR1 && EXPR2    EXPR1 および EXPR2 の両方が true の時 true を返します。
        それ以外は false を返します。
      EXPR1 || EXPR2    EXPR1 および EXPR2 のいずれかが true の時 true を返し
        ます。それ以外は false を返します。

    `==' および `!=' 演算子が使用された場合、演算子の右側の文字列をパターンと
    した左側の文字列に対するパターン一致処理が行われます。
    `=~' 演算子が使用された場合、演算子の右側の文字列が正規表現として扱われま
    す。

    && および || 演算子は EXPR1 で式の値を決定するのに十分な場合は EXPR2 を
    評価しません。

    終了ステータス:
    EXPRESSION の値に基づいて 0 または 1 を返します。
以上、あたまのノートにメモ。

2019年10月28日月曜日

最近発見された3つの立方数の和が42になる数

掲題の件を CentOS8 の gawk で確認してみた。
-M オプション(MPFR / MP 拡張)が必要なので、CentOS7 以下では駄目でした。
[root@hoge ~]# uname -a
Linux hoge 4.18.0-80.el8.x86_64 #1 SMP Wed Mar 13 12:02:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# gawk --version
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2018 Free Software Foundation.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
[root@hoge ~]# cat 42.gawk 
BEGIN {
 a = -80538738812075974
 b =  80435758145817515
 c =  12602123297335631

 printf("a = %18d    length=%d\n", a, length(-a))
 printf("b = %18d    length=%d\n", b, length(b))
 printf("c = %18d    length=%d\n", c, length(c))
 print ""

 x = a^3
 y = b^3
 z = c^3

 printf("a^3 = %52d    length=%d\n", x, length(-x))
 printf("b^3 = %52d    length=%d\n", y, length(y))
 printf("c^3 = %52d    length=%d\n", z, length(z))
 print ""

 printf("a^3 + b^3 + c^3 = %d\n", x + y + z)

 exit(0)
}
[root@hoge ~]# time gawk -M -f 42.gawk 
a = -80538738812075974    length=17
b =  80435758145817515    length=17
c =  12602123297335631    length=17

a^3 = -522413599036979150280966144853653247149764362110424    length=51
b^3 =  520412211582497361738652718463552780369306583065875    length=51
c^3 =    2001387454481788542313426390100466780457779044591    length=49

a^3 + b^3 + c^3 = 42

real 0m0.002s
user 0m0.000s
sys 0m0.001s
恐ろしい桁数ですが、このように計算は一瞬でした。

2019年10月22日火曜日

CentOS7 で mlterm をビルドする

~/.mlterm/msg.log に出力されるエラーを見ながら、トライアル&エラーでビルドしたので、備忘録です。

まず、ビルドに必要なもの、途中メモらなかったので、history から抜粋です。もしかしたら、不完全かもです。
[root@hoge ~]# history | grep -w "yum install" | grep 2019-10-22 | sort -k +3
14624   2019-10-22 04:42:31  yum install xcb-util-image.x86_64
14627   2019-10-22 04:44:31  yum install libX11-devel
14691   2019-10-22 08:13:48  yum install cairo-devel
14722   2019-10-22 08:29:17  yum install harfbuzz-devel
14729   2019-10-22 08:37:55  yum install fribidi-devel
14817   2019-10-22 08:48:07  yum install gtk3-devel
特に最後の gtk3-devel が入ってないと、Ctrl+マウス右ボタン(設定を呼び出す)が使えません。入ってなくても、それにまつわる機能が disable になってビルドされてしまうので、厄介でした。最後の最後に、見出しました。

ソース tar の中には、spec ファイルが含まれていますが、少し手直しする必要がありました。次は差分です。
[root@hoge ~]# diff -u mlterm-3.8.8/mlterm.spec.org mlterm-3.8.8/mlterm.spec
--- mlterm-3.8.8/mlterm.spec.org 2019-03-31 22:10:47.000000000 +0900
+++ mlterm-3.8.8/mlterm.spec 2019-10-22 08:57:24.925819688 +0900
@@ -19,7 +19,7 @@
 URL:         http://mlterm.sourceforge.net/
 Source0:     http://prdownloads.sourceforge.net/mlterm/mlterm-%{version}.tar.gz
 Packager:    The mlterm team
-Requires:    gtk+
+Requires:    gtk3
 BuildRoot:   /var/tmp/%{name}-%{version}-root
 
 %description
@@ -68,7 +68,7 @@
 %{bindir}/mlfc
 %{libdir}/libpobl.*
 %{libdir}/libmef.*
-%{libdir}/libmlterm_core.*
+#%{libdir}/libmlterm_core.*
 %{libdir}/libmlterm_coreotl.*
 %{libdir}/mef/
 %{libdir}/mlterm/
@@ -79,9 +79,10 @@
 %{mandir}/man1/mlcc.1*
 %{pixmapdir}/mlterm*
 %{datadir}/locale/*/LC_MESSAGES/mlconfig.mo
+%{datadir}/mlterm/scrollbars/sample3/
 
 %changelog
-* Sun Mar 31 2018 Araki Ken 
+* Sun Mar 31 2019 Araki Ken 
 - Source version 3.8.8
 
 * Sat Oct 27 2018 Araki Ken 
@@ -153,7 +154,7 @@
 * Tue Oct 28 2014 Araki Ken 
 - Source version 3.4.0
 
-* Sun Aug 16 2014 Araki Ken 
+* Sat Aug 16 2014 Araki Ken 
 - Source version 3.3.8
 
 * Sun Jul 06 2014 Araki Ken 
@@ -240,7 +241,7 @@
 * Sat Jun 04 2011 Araki Ken 
 - Source version 3.0.5
 
-* Sat May 29 2011 Araki Ken 
+* Sun May 29 2011 Araki Ken 
 - Source version 3.0.4
 
 * Sun Mar 20 2011 Araki Ken 
@@ -261,7 +262,7 @@
 * Sun May 07 2006 Seiichi SATO 
 - Source version 2.9.3
 
-* Sat Mar 04 2005 Seiichi SATO 
+* Fri Mar 04 2005 Seiichi SATO 
 - Source version 2.9.2
 
 * Sun Nov 28 2004 Seiichi SATO 
@@ -283,7 +284,7 @@
 * Sun Jan 12 2003 Araki Ken 
 - Source version 2.6.3
 
-* Thu Oct 1 2002 Araki Ken 
+* Tue Oct 1 2002 Araki Ken 
 - Source version 2.6.2
 
 * Thu Sep 12 2002 Araki Ken 
後半の changelog の年月日や曜日の間違いは、「あるある」だなあと思いました。それと、spec ファイル書いてくれた方、ありがとうございます。やはり、make install より、rpm のほうが取り回しが良いですよね。

あとは、ビルドです。
[root@hoge ~]# ls -l rpmbuild/SOURCES/mlterm-3.8.8.tar.gz  ※ここに tar ボール配置
-rw-r--r-- 1 root root 4035215 10月 22 04:35 rpmbuild/SOURCES/mlterm-3.8.8.tar.gz
[root@hoge ~]# rpmbuild -ba mlterm-3.8.8/mlterm.spec
...
[root@hoge ~]# ls -l --full-time rpmbuild/RPMS/x86_64/
合計 4777
-rw-r--r-- 1 root root 2392004 2019-10-22 08:58:58.737085241 +0900 mlterm-3.8.8-1.x86_64.rpm
-rw-r--r-- 1 root root 2535872 2019-10-22 08:58:59.713098408 +0900 mlterm-debuginfo-3.8.8-1.x86_64.rpm

[root@hoge ~]# dmidecode --type 1
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 3.0.0 present.

Handle 0x000C, DMI type 1, 27 bytes
System Information
 Manufacturer: LENOVO
 Product Name: 20K70003JP
 Version: ThinkPad 25
 Serial Number: PF0XJ53D
 UUID: 307f584c-2bae-11b2-a85c-c18b88313792
 Wake-up Type: Power Switch
 SKU Number: LENOVO_MT_20K7_BU_Think_FM_ThinkPad 25
 Family: ThinkPad 25

[root@hoge ~]# uversion 
CentOS Linux release 7.7.1908           20K70003JP

BIOS version  : N1QET85W (1.60 )  08/30/2019  1.60
Firmware rev. : 1.34
System serial : PF0XJ53D

CPU model  : Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
Processors : 4  (1 sockets, 2 cores per CPU, Hyperthreading: enabled)

Memory : 31772 MB

Linux : 3.10.0-1062.1.2.el7.x86_64  x86_64  (hoge)

[root@hoge ~]# rpm -qi mlterm
Name        : mlterm
Version     : 3.8.8
Release     : 1
Architecture: x86_64
Install Date: 2019年10月22日 08時59分37秒
Group       : User Interface/X
Size        : 17492735
License     : Modified BSD-style license
Signature   : (none)
Source RPM  : mlterm-3.8.8-1.src.rpm
Build Date  : 2019年10月22日 08時58分57秒
Build Host  : hoge
Relocations : (not relocatable)
Packager    : The mlterm team
URL         : http://mlterm.sourceforge.net/
Summary     : Multi Lingual TERMinal emulator on X
Description :
mlterm is a multi-lingual terminal emulator written from
scratch, which supports various character sets and encodings
in the world.  It also supports various unique feature such as
anti-alias using FreeType, multiple windows, scrollbar API,
scroll by mouse wheel, automatic selection of encoding,
and so on. Multiple xims are also supported.
You can dynamically change various xims.
格闘の記録。msg.log も貼っておきます。
[root@hoge ~]# cat .mlterm/msg.log 
Oct 22 04:58:27[16165] ERROR(No such file or directory): cairo: Could not load.
Oct 22 04:58:27[16165] Fall back to xcore.
Oct 22 04:58:27[16165] ERROR(No such file or directory): BiDi: Could not load.
Oct 22 04:58:40[16165] Font(id 2d1) width(10) is not matched with standard width(20).
Oct 22 04:58:40[16165] Characters (cs d1) are drawn *one by one *to arrange column width.
Oct 22 04:59:32[16165] Font(id 6d1) width(10) is not matched with standard width(20).
Oct 22 04:59:32[16165] Characters (cs d1) are drawn *one by one *to arrange column width.
Oct 22 05:08:13[17324] ERROR(No such file or directory): cairo: Could not load.
Oct 22 05:08:13[17324] Fall back to xcore.
Oct 22 05:08:13[17324] ERROR(No such file or directory): BiDi: Could not load.
Oct 22 05:08:24[17384] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 05:08:30[17391] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 05:08:32[17394] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 05:08:35[17399] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 05:13:28[17995] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 05:13:30[17998] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 05:13:33[18003] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 05:13:34[18006] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 05:14:59[18140] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 05:15:00[18142] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 05:19:24[17324] Font(id 2d1) width(10) is not matched with standard width(20).
Oct 22 05:19:24[17324] Characters (cs d1) are drawn *one by one *to arrange column width.
Oct 22 07:39:49[6408] ERROR(No such file or directory): cairo: Could not load.
Oct 22 07:39:49[6408] Fall back to xcore.
Oct 22 07:39:49[6408] ERROR(No such file or directory): BiDi: Could not load.
Oct 22 07:39:53[6459] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 07:39:55[6462] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 07:39:56[6463] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 07:39:56[6465] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 07:40:45[6408] Fall back to xcore.
Oct 22 07:43:36[6408] Fall back to xcore.
Oct 22 07:43:38[6408] Fall back to xcore.
Oct 22 07:44:28[6408] Font(id 2d1) width(10) is not matched with standard width(20).
Oct 22 07:44:28[6408] Characters (cs d1) are drawn *one by one *to arrange column width.
Oct 22 08:10:51[10440] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:20:55[11806] ERROR(No such file or directory): BiDi: Could not load.
Oct 22 08:21:05[11806] Font(id 2d1) width(21) is not matched with standard width(16).
Oct 22 08:23:07[12239] ERROR(No such file or directory): BiDi: Could not load.
Oct 22 08:23:09[12278] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:23:10[12280] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:23:10[12281] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:23:13[12284] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:23:14[12286] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:23:14[12287] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:26:08[12644] ERROR(No such file or directory): BiDi: Could not load.
Oct 22 08:26:15[12692] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:26:15[12694] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:28:45[12644] Font(id 2d1) width(21) is not matched with standard width(16).
Oct 22 08:34:21[14473] ERROR(Resource temporarily unavailable): BiDi: Could not load.
Oct 22 08:34:26[14527] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 08:34:37[14581] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 08:35:08[14652] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 08:35:09[14653] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:35:57[14706] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 08:35:57[14708] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:35:58[14710] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 08:37:21[14473] Font(id 2d1) width(21) is not matched with standard width(16).
Oct 22 08:41:51[16532] Font(id 2d1) width(21) is not matched with standard width(16).
Oct 22 08:42:07[16743] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 08:42:08[16746] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:42:13[16764] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 08:42:14[16765] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:42:14[16767] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlconfig.
Oct 22 08:42:15[16768] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
Oct 22 08:42:15[16769] ERROR(No such file or directory): Failed to exec /usr/libexec/mlterm/mlterm/mlterm-menu.
[root@hoge ~]# 
それにしても、CentOS や Fedora で利用している人は、あまり居ないのでしょうかね。ググってもなかなか情報を見つけられず、時間かかりました。
mlterm の「良さ」などについては、ネット検索すると、いろいろと解説が出てくるので、そちらを参照ください。

わたしの目的は、これがしたかっただけです。別途 img2sixel を入れる必要がありますが、そちらは簡単でした。

ターミナルの中で png が見えるー。ひゃっほー。Windows なら Rlogin が Sixel 対応しているようです。

2019-10-22 17時 追記
CentOS8 が入ってる別マシンでも、同様の手順で rpm 作成できることを確かめました。


2019-10-22 21時 追記
背景画像設定して、カラーを調整(前景色を白に設定)したら、良い感じになりました。


2019-10-24追記
Mac の iTerm2 では、imgcat というツールがよく使われるらしいですが、mlterm でも使えました。
https://iterm2.com/utilities/imgcat

大きめの画像を表示する場合は、どういうわけか imgcat のほうが反応が良い(処理時間短い)ようです。それと imgcat のほうが名前を覚えやすいですね。名前重要。
imgls というツールもあり、これまた便利なようです。mlterm でも使えました。

2019年10月18日金曜日

懐かしの kbanner を CentOS8 でコンパイルしたら動いた!

1994年頃、仕事で NEC の UNIXワークステーション EWS4800 を日常的に使っていました。そのマシンの /usr/local/bin (職場の中央サーバを NFS マウントして利用していた) に、kbanner というツール (漢字に対応した banner ソフト) がインストールされていて、その -s オプションの表示の綺麗さに魅了され、よく利用していました。
当時は、誰が作ったものなのか?をググったりはできませんでしたし、ソースは入手できないものだと思っていました。

時は流れ、2003年ごろから Linux どっぷりな仕事 (使うマシンも Express5800 に変わった) になり、kbanner のソースも持っていませんでしたので、EWS4800 の衰退と共に記憶の彼方になっていきました。

そして今、ふと懐かしく思い出し、どこかにソースないのかなと、ググってみたら、ありました!
なんと kbanner の作者さんは、「キーボード配列 QWERTYの謎 NTT出版 (2008年3月), ISBN978-4-7571-4176-6.」の著者さんだったのかー、キーボード好き (特に ThinkPad と RealForce) が高じて手もとにあります。

さっそくダウンロードして、現在の自宅メインマシン (ThinkPad 25 + CentOS8) で make してみました。
コンパイルエラーでも起きるかなと思ったのですが、警告は出るものの、修正なしでビルドできました!
[root@hoge kbanner2]# make
cc -c -O kbanner.c
kbanner.c:5:14: 警告: 組み込み関数 ‘malloc’ と型が競合しています [-Wbuiltin-declaration-mismatch]
 extern char *malloc();
              ^~~~~~
kbanner.c:85:1: 警告: 戻り値の型をデフォルトの ‘int’ にします [-Wimplicit-int]
 main(argc,argv)
 ^~~~
kbanner.c: 関数 ‘main’ 内:
kbanner.c:115:14: 警告: 関数 ‘atoi’ の暗黙的な宣言です [-Wimplicit-function-declaration]
       column=atoi(&((*argv)[1]));
              ^~~~
kbanner.c:82:3: 警告: 関数 ‘exit’ の暗黙的な宣言です [-Wimplicit-function-declaration]
   exit(1);\
   ^~~~
kbanner.c:120:7: 備考: in expansion of macro ‘USAGE’
       USAGE
       ^~~~~
kbanner.c:82:3: 警告: 組み込み関数 ‘exit’ の互換性がない暗黙的な宣言です
   exit(1);\
   ^~~~
kbanner.c:120:7: 備考: in expansion of macro ‘USAGE’
       USAGE
       ^~~~~
kbanner.c:82:3: 備考: include ‘<stdlib.h>’ or provide a declaration of ‘exit’
kbanner.c:4:1:
+#include 
 
kbanner.c:82:3:
   exit(1);\
   ^~~~
kbanner.c:120:7: 備考: in expansion of macro ‘USAGE’
       USAGE
       ^~~~~
kbanner.c:126:5: 警告: 組み込み関数 ‘exit’ の互換性がない暗黙的な宣言です
     exit(1);
     ^~~~
kbanner.c:126:5: 備考: include ‘<stdlib.h>’ or provide a declaration of ‘exit’
kbanner.c:129:5: 警告: 関数 ‘kbanner’ の暗黙的な宣言です [-Wimplicit-function-declaration]
     kbanner(stdin);
     ^~~~~~~
kbanner.c:130:5: 警告: 組み込み関数 ‘exit’ の互換性がない暗黙的な宣言です
     exit(0);
     ^~~~
kbanner.c:130:5: 備考: include ‘<stdlib.h>’ or provide a declaration of ‘exit’
kbanner.c:142:3: 警告: 組み込み関数 ‘exit’ の互換性がない暗黙的な宣言です
   exit(0);
   ^~~~
kbanner.c:142:3: 備考: include ‘<stdlib.h>’ or provide a declaration of ‘exit’
kbanner.c: トップレベル:
kbanner.c:145:1: 警告: 戻り値の型をデフォルトの ‘int’ にします [-Wimplicit-int]
 kbanner(fp)
 ^~~~~~~
kbanner.c: 関数 ‘kbanner’ 内:
kbanner.c:152:12: 警告: implicit declaration of function ‘kgetchar’; did you mean ‘getchar’? [-Wimplicit-function-declaration]
   while((i=kgetchar(fp))!=EOF){
            ^~~~~~~~
            getchar
kbanner.c:159:4: 警告: implicit declaration of function ‘kputchar’; did you mean ‘putchar’? [-Wimplicit-function-declaration]
    kputchar(i*256+(j&127));
    ^~~~~~~~
    putchar
kbanner.c: トップレベル:
kbanner.c:202:1: 警告: 戻り値の型をデフォルトの ‘int’ にします [-Wimplicit-int]
 kputchar(c)
 ^~~~~~~~
kbanner.c: 関数 ‘kputchar’ 内:
kbanner.c:267:7: 警告: 非 void を戻す関数内に値が無い ‘return’ があります
       return;
       ^~~~~~
kbanner.c:202:1: 備考: ここで宣言されています
 kputchar(c)
 ^~~~~~~~
kbanner.c: トップレベル:
kbanner.c:278:1: 警告: 戻り値の型をデフォルトの ‘int’ にします [-Wimplicit-int]
 kgetchar(fp)
 ^~~~~~~~
cc -c -O font1.c
cc -c -O font2.c
cc -c -O font3.c
cc kbanner.o font1.o font2.o font3.o -o kbanner
strip kbanner
[root@hoge kbanner2]# ls -l
合計 1356
-rw-r--r-- 1 1001 wheel    321  7月 13  2004 Makefile
-rw-r--r-- 1 1001 wheel    203  7月 13  2004 README
-rw-r--r-- 1 1001 wheel 289120 10月 15  1993 font1.c
-rw-r--r-- 1 root root   79952 10月 18 04:47 font1.o
-rw-r--r-- 1 1001 wheel 289120 10月 15  1993 font2.c
-rw-r--r-- 1 root root   79952 10月 18 04:47 font2.o
-rw-r--r-- 1 1001 wheel 278000 10月 15  1993 font3.c
-rw-r--r-- 1 root root   76912 10月 18 04:47 font3.o
-rwxr-xr-x 1 root root  245376 10月 18 04:47 kbanner
-rw-r--r-- 1 1001 wheel    692 10月 15  1993 kbanner.1
-rw-r--r-- 1 1001 wheel   8594 10月 15  1993 kbanner.c
-rw-r--r-- 1 root root   16208 10月 18 04:47 kbanner.o
[root@hoge kbanner2]# ./kbanner --help
Usage: ./kbanner [-l|-numofcol] [-s] [-m] [file]
早速動かしてみると文字化け、、、当時は EUC-JP でしたので、環境変数 LANG=ja_JP.eucJP を設定し、端末文字コードも EUC-JP にして、再実行。
[root@hoge kbanner2]# echo -n キーボード配列 QWERTYの謎 | ./kbanner -s -8
     ;                                 ,    ; ;                       ,     , , ,,,,,,,,, ,,,,,  ,,,,,,,,, ,  ;                 
     ';   ,,,                          ;                              ;     ' '    ; ;        ;     ;      ;  ;                 
    ,,;;'''                      '''''';'''''''                       ;          ;';';';      ;     ;,,,,  ;  ;                 
 ''''  ;   ,,,,  ',,,,,,,,,,,,,     ,  ;   ,     ',,,,,,,,,,,,,       ;'';,,     ; ; ; ;  ;''''    ;'   ;  ;  ;                 
     ,,;;'''                       ,;  ;   ';,                        ;    '''   ;'  '';  ;      ,;';, ;'  ;  ;                 
  ''''  ;,                        ,;   ;     ;,                       ;          ;,,,,,;  ;          ';'   '  ;                 
         ;                       ''    ;      '                       ;          ;     ;  ;,  ,;    ,;'       ;                 
         ';                          '''                              '          '''''''   '''' ,,;''       ,,;                 
      ,,,,      ,,,,,  ,,  ,,,,,  ,,,,,,,,,,,     ,,,,,,,,,      ,,,,,,,,,,,,,   ,,,,,   ,,,,,                   ,,,, ,  ,  ;  ,
   ,;'    ';,     ;    ;;    ;      ;       ',      ;      ',    ;     ;     ;     ;,     ,;        ,,;';';,,   ,,,,,,'; '; ; ;'
  ,;        ;,    ;,  ;'';  ,;      ;    ,          ;       ;          ;            ;,   ,;       ,;'   ;   ';   ,,,,    ,,,;,,,
  ;          ;     ; ,;  ;, ;       ;,,,,;          ;,,,,,,'           ;             ;, ,;       ,;    ;'    ';       ,,,  ,;,  
  ;,        ,;     ; ;    ; ;       ;    ;          ;     ;,           ;              ';'        ;    ;'      ;  ''''   ; ,';', 
   ;, ,'', ,;      ';;    ;;'       ;        ,      ;      ;,          ;               ;         ;  ,;'      ;'  ,,,,   ;,' ; ',
    '',,,,';  ,     ;      ;      ,,;,,,,,,,;     ,,;,,   ,,;,,      ,,;,,           ,,;,,        '''    ,,;''   ;  ;  ,;   ;   
            ''                                                                                                   ;,,; ;' ',,,,,,
[root@hoge kbanner2]# 
これだ、これだよ〜、懐かしいなあ。また利用させてもらおうと思います。作者さん、ありがとうございます m(_ _)m

2019年10月10日木曜日

CentOS8 で ZFS on Linux 0.8.2 をビルドする

RHEL8/CentOS8 で、ZFS on Linux 0.8.2 をビルドしてインストールする手順。備忘録。

現時点では、公式ページからビルド済みパッケージが提供されていないので、ソースから dkms 版をビルドします。
まず最初に、いつの間にか、EL8 向けの EPEL が出来ていたので、そちらから dkms パッケージをインストールしておきます。それから、次の手順 (bash history から抜粋) 。
[root@hoge zfs-0.8.2]# history
...
 3059   2019-10-10 06:39:21  cd zfs-0.8.2/
 3060   2019-10-10 06:39:28  ./autogen.sh 
 3061   2019-10-10 06:40:03  ./configure --with-config=srpm
 3062   2019-10-10 06:40:26  make -s -j$(nproc)
 3063   2019-10-10 06:41:15  make -j1 pkg-utils rpm-dkms
 3064   2019-10-10 06:44:39  rpm -Uvh $(ls -1 *.$(uname -p).rpm *.noarch.rpm | grep -v debug)
次は、インストールログです。
[root@hoge zfs-0.8.2]# rpm -Uvh $(ls -1 *.$(uname -p).rpm *.noarch.rpm | grep -v debug)
Verifying...                          ################################# [100%]
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:libnvpair1-0.8.2-1.el8           ################################# [  5%]
   2:libuutil1-0.8.2-1.el8            ################################# [ 10%]
   3:libzfs2-0.8.2-1.el8              ################################# [ 15%]
   4:libzpool2-0.8.2-1.el8            ################################# [ 20%]
   5:zfs-dkms-0.8.2-1.el8             ################################# [ 25%]
Loading new zfs-0.8.2 DKMS files...
Building for 4.18.0-80.el8.x86_64
Building initial module for 4.18.0-80.el8.x86_64
Done.

zavl.ko.xz:
Running module version sanity check.
 - Original module
   - This kernel never originally had a module by this name
 - Installation
   - Installing to /lib/modules/4.18.0-80.el8.x86_64/extra/

znvpair.ko.xz:
Running module version sanity check.
 - Original module
   - This kernel never originally had a module by this name
 - Installation
   - Installing to /lib/modules/4.18.0-80.el8.x86_64/extra/

zunicode.ko.xz:
Running module version sanity check.
 - Original module
   - This kernel never originally had a module by this name
 - Installation
   - Installing to /lib/modules/4.18.0-80.el8.x86_64/extra/

zcommon.ko.xz:
Running module version sanity check.
 - Original module
   - This kernel never originally had a module by this name
 - Installation
   - Installing to /lib/modules/4.18.0-80.el8.x86_64/extra/

zfs.ko.xz:
Running module version sanity check.
 - Original module
   - This kernel never originally had a module by this name
 - Installation
   - Installing to /lib/modules/4.18.0-80.el8.x86_64/extra/

icp.ko.xz:
Running module version sanity check.
 - Original module
   - This kernel never originally had a module by this name
 - Installation
   - Installing to /lib/modules/4.18.0-80.el8.x86_64/extra/

zlua.ko.xz:
Running module version sanity check.
 - Original module
   - This kernel never originally had a module by this name
 - Installation
   - Installing to /lib/modules/4.18.0-80.el8.x86_64/extra/

spl.ko.xz:
Running module version sanity check.
 - Original module
   - This kernel never originally had a module by this name
 - Installation
   - Installing to /lib/modules/4.18.0-80.el8.x86_64/extra/
Adding any weak-modules

depmod.....

DKMS: install completed.
   6:zfs-0.8.2-1.el8                  ################################# [ 30%]
   7:zfs-dracut-0.8.2-1.el8           ################################# [ 35%]
   8:zfs-test-0.8.2-1.el8             ################################# [ 40%]
   9:libzfs2-devel-0.8.2-1.el8        ################################# [ 45%]
  10:python3-pyzfs-0.8.2-1.el8        ################################# [ 50%]
整理中 / 削除中...
  11:libzfs2-devel-0.8.0-rc4.el8      ################################# [ 55%]
  12:python3-pyzfs-0.8.0-rc4.el8      ################################# [ 60%]
  13:zfs-test-0.8.0-rc4.el8           ################################# [ 65%]
  14:zfs-dracut-0.8.0-rc4.el8         ################################# [ 70%]
  15:zfs-0.8.0-rc4.el8                ################################# [ 75%]
  16:zfs-dkms-0.8.0-rc4.el8           ################################# [ 80%]
  17:libzfs2-0.8.0-rc4.el8            ################################# [ 85%]
  18:libzpool2-0.8.0-rc4.el8          ################################# [ 90%]
  19:libnvpair1-0.8.0-rc4.el8         ################################# [ 95%]
  20:libuutil1-0.8.0-rc4.el8          ################################# [100%]
2019-10-11追記
ビルドする前に必要なパッケージは、
https://github.com/zfsonlinux/zfs/wiki/Custom-Packages
に書いてありますが、一部のパッケージ (device-mapper-develなど) が PowerTools というリポジトリに分類されているようなので、次のように有効化する必要がありました。
[root@hoge ~]# dnf install device-mapper-devel --enablerepo=PowerTools
それから、UEFI secureboot が有効になっていると、zfs モジュールをロードできないようです。
[root@hoge ~]# dmesg | grep secure
[    0.000000] secureboot: Secure boot enabled
[    0.000000] Kernel is locked down from EFI secure boot; see man kernel_lockdown.7
[root@hoge ~]# modprobe zfs
modprobe: ERROR: could not insert 'zfs': Required key not available
[root@hoge ~]# grep LOCK_DOWN /boot/config-4.18.0-80.7.1.el8_0.x86_64 
CONFIG_LOCK_DOWN_KERNEL=y
# CONFIG_LOCK_DOWN_MANDATORY is not set
CONFIG_LOCK_DOWN_IN_EFI_SECURE_BOOT=y
[root@hoge ~]# grep CONFIG_ALLOW_LOCKDOWN_LIFT_BY_SYSRQ /boot/config-4.18.0-80.7.1.el8_0.x86_64 
[root@hoge ~]# 
SysRq x も使えない。BIOS で、secureboot を無効化するとロードできまます。

2019-10-19追記
EL8 向けのリポジトリは、作業中の模様。
https://github.com/zfsonlinux/zfs/issues/9287

2019-11-19追記
EL8 向けリポジトリが公開されたので、これからは kmod-zfs を使えば良さそうです。
早速、入れ替えました。
[root@hoge ~]# rpm -qi kmod-zfs
Name        : kmod-zfs
Version     : 0.8.2
Release     : 1.el8
Architecture: x86_64
Install Date: 2019年11月19日 21時34分52秒
Group       : System Environment/Kernel
Size        : 6812072
License     : CDDL
Signature   : RSA/SHA256, 2019年11月14日 02時48分47秒, Key ID a9d5a1c0f14ab620
Source RPM  : zfs-kmod-0.8.2-1.el8.src.rpm
Build Date  : 2019年11月13日 10時17分58秒
Build Host  : fedora-30-repo
Relocations : (not relocatable)
URL         : http://zfsonlinux.org/
Summary     : zfs kernel module(s)
Description :
This package provides the zfs kernel modules built for
the Linux kernel 4.18.0-80.11.2.el8_0.x86_64 for the x86_64
family of processors.

2019年7月27日土曜日

RHEL8 の sysstat の採取周期を 1 分毎に変更

RHEL8/CentOS8 では、sysstat のデフォルト採取周期を 10分 から 1分 に変更する方法が変更になっています。RHEL7 以下では cron を利用していたものが、systemd.timer ベースに変更されてしまったためです。RHEL7 以下のように簡単ではないので、備忘録として書いておこうと思います。

sysstat-collect.timer に修正を加えるのですが、sysstat パッケージの更新のことを考えると /var/lib/systemd/system 下のファイルを直接書き換えるのではなくて、systemctl edit を使ったほうが良いものと思います。
[root@hoge ~]# EDITOR=vim systemctl edit sysstat-collect.timer
[Unit]
Description=Run system activity accounting tool every 1 minutes

[Timer]
OnCalendar=  ※必要
OnCalendar=*:*:01
AccuracySec=0
上記のように入力して書き込みます。デフォルトのエディタは vim にしてくれって思いますが、いたしかたない。
[root@hoge ~]# systemctl cat sysstat-collect.timer
# /usr/lib/systemd/system/sysstat-collect.timer
# /usr/lib/systemd/system/sysstat-collect.timer
# (C) 2014 Tomasz Torcz 
#
# sysstat-11.7.3 systemd unit file:
#        Activates activity collector every 10 minutes

[Unit]
Description=Run system activity accounting tool every 10 minutes

[Timer]
OnCalendar=*:00/10

[Install]
WantedBy=sysstat.service

# /etc/systemd/system/sysstat-collect.timer.d/override.conf
[Unit]
Description=Run system activity accounting tool every 1 minutes

[Timer]
OnCalendar=
OnCalendar=*:*:01
AccuracySec=0
[root@hoge ~]# systemctl status sysstat-collect.timer
* sysstat-collect.timer - Run system activity accounting tool every 1 minutes
   Loaded: loaded (/usr/lib/systemd/system/sysstat-collect.timer; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/sysstat-collect.timer.d
           `-override.conf
   Active: active (waiting) since Sat 2019-07-27 21:19:18 JST; 14min ago
  Trigger: Sat 2019-07-27 21:35:00 JST; 41s left

Jul 27 21:19:18 hoge systemd[1]: Started Run system activity accounting tool every 1 minutes.
[root@hoge ~]# sar
Linux 4.18.0-80.el8.x86_64 (hoge)  07/27/19  _x86_64_ (2 CPU)

21:19:18     LINUX RESTART (2 CPU)

21:20:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
21:21:01        all      0.08      0.00      0.14      0.04      0.00     99.73
21:22:01        all      0.03      0.00      0.09      0.02      0.00     99.86
21:23:01        all      0.05      0.00      0.09      0.04      0.00     99.82
21:24:01        all      0.03      0.00      0.12      0.03      0.00     99.82
21:25:01        all      0.21      1.54      0.83      0.35      0.02     97.05
21:26:01        all      0.03      0.00      0.08      0.04      0.00     99.84
21:27:01        all      0.03      0.00      0.08      0.01      0.00     99.87
21:28:01        all      0.03      0.00      0.08      0.00      0.00     99.88
21:29:01        all      0.03      0.00      0.08      0.05      0.00     99.84
21:30:01        all      0.10      0.30      0.18      0.18      0.00     99.24
21:31:01        all      0.03      0.00      0.07      0.01      0.00     99.90
21:32:01        all      0.03      0.00      0.08      0.03      0.01     99.85
21:33:01        all      0.14      0.00      0.17      0.03      0.01     99.65
21:34:01        all      0.03      0.00      0.09      0.03      0.00     99.85
Average:        all      0.06      0.13      0.16      0.06      0.00     99.59
なんだかなあ。cron で ええやんか と思うのですがねえ、messages にも余計なメッセージが大量に出てしまうし。
[root@hoge ~]# less /var/log/messages
...
Jul 27 21:33:01 hoge systemd[1]: Starting system activity accounting tool...
Jul 27 21:33:01 hoge systemd[1]: Started system activity accounting tool.
Jul 27 21:34:01 hoge systemd[1]: Starting system activity accounting tool...
Jul 27 21:34:01 hoge systemd[1]: Started system activity accounting tool.
...
これらが不要(要るっていう人は居るの?)なら、以前書いた記事を応用して rsyslog でフィルタすれば良いものと思いますが、あーめんどくさい。rsyslog なんてやめて journal で運用すればいいって、開発者の人は思ってるのでしょうけれど、世の中そう急には変わらない。/var/log/messages は必要とされているだろうと思います。きっと。

2019-09-18追記
1点間違えていましたので、訂正しました。
override.confの[timer]セクションで、OnCalendar=*:*:01 の前には、もう一つ OnCalendar= が必要でした。そうしないと、デフォルトの OnCalendar=*:00/10 も有効として扱われるようです。風変わりな書き方ですが、実装を想像するとそうなるか、という記法だと思いました。

2019年7月22日月曜日

CentOS 7 の root ファイルシステムに ZFS を使う

3年ほど前に、CentOS 6 の root ファイルシステムに ZFS を使う方法について書きました。
CentOS 6 の root ファイルシステムに ZFS を使う
当時設定したサーバは、最新の v0.8.1 にアップデートして、今も動かしています。3年間の運用中、カーネルアップデートや ZFS のアップデートの際、何回か起動できなくなり snapshot から rollback したことがありましたが、ZFS の高い信頼性(格納データに対するチェックサム、mirror構成による自己修復)を活用できたと思っています。
しかし、CentOS 7 については Btrfs raid1 が使えたので、そちらを使って構築していました。カーネルアップデートが ZFS よりは容易であるという利点があります。信頼性はおそらく ZFS のほうが上かも。

さて、Red Hat が Btrfs を見限った(フルサポート開始をあきらめて RHEL8 から削除)ということもあり、最近になって CentOS 7 の root ファイルシステムに ZFS を使うようになりました。ところが、、、最新の zfs-dracut には問題があるようです。v0.7.13 で動作していた環境を v0.8.1 にアップデートしたら起動できなくなってしまいました。
https://github.com/zfsonlinux/zfs/issues/8913
たぶんこれが、対応していると思われます。まもなく直るでしょう。
zfs-dracut っていうのは、要するに dracut のフレームワークに乗っかって、ZFS root をマウントしてくれるだけだし、最新のスクリプトでなくてもよいと思えるので、snapshot 中の古い /usr/lib/dracut/modules.d/90zfs/ をコピーして、initramfs を再作成したら起動できました。rd.break=pre-mount で、起動を中断させてシェルに落し、次のような手順で initramfs を再作成しました。応急処置です。
# zpool import rpool
# mkdir /mnt_temp
# mount -t zfs rpool/ROOT /mnt_temp
# mkdir /mnt_temp2
# mount -t zfs -o ro rpool/ROOT@2019-04-23-0312 /mnt_temp2
# cp -rp /mnt_temp2/usr/lib/dracut/modules.d/90zfs/ /mnt_temp/usr/lib/dracut/modules.d/
# mount -t proc proc /mnt_temp/proc
# mount -t devtmpfs devtmpfs /mnt_temp/dev
# mount -t devpts devpts /mnt_temp/dev/pts
# mount -t sysfs sysfs /mnt_temp/sys
# chroot /mnt_temp
# dracut -f /boot/initramfs-3.10.0-957.21.3.el7.x86_64.img 3.10.0-957.21.3.el7.x86_64
次は、現在の稼動状態です。ThinkPad 25 の NVMe から UEFI ブートしています。
[root@hoge ~]# df -hT /
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
rpool/ROOT     zfs       26G  7.7G   18G   31% /
[root@hoge ~]# cat /proc/cmdline 
BOOT_IMAGE=/ROOT@/boot/vmlinuz-3.10.0-957.21.3.el7.x86_64 root=ZFS=rpool/ROOT ro crashkernel=auto elevator=deadline vconsole.keymap=jp106 int_pln_enable=1 efi=old_map
[root@hoge ~]# grep linuxefi /boot/efi/EFI/centos/grub.cfg
 linuxefi /ROOT@/boot/vmlinuz-3.10.0-957.21.3.el7.x86_64 root=ZFS=rpool/ROOT ro crashkernel=auto elevator=deadline vconsole.keymap=jp106 int_pln_enable=1 efi=old_map 
 linuxefi /ROOT@/boot/vmlinuz-0-rescue-27a0bb3862794c69a2c05249c5e54c36 root=ZFS=rpool/ROOT ro crashkernel=auto elevator=deadline vconsole.keymap=jp106 int_pln_enable=1 efi=old_map 
[root@hoge ~]# grep ^GRUB_CMD /etc/default/grub 
GRUB_CMDLINE_LINUX="crashkernel=auto elevator=deadline vconsole.keymap=jp106 int_pln_enable=1 efi=old_map"
[root@hoge ~]# zpool status
  pool: rpool
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
 still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
 the pool may no longer be accessible by software that does not support
 the features. See zpool-features(5) for details.
  scan: scrub repaired 0B in 0 days 00:00:20 with 0 errors on Sat Jul 20 00:58:48 2019
config:

 NAME         STATE     READ WRITE CKSUM
 rpool        ONLINE       0     0     0
   nvme0n1p5  ONLINE       0     0     0

errors: No known data errors
[root@hoge ~]# zfs get all -s local
NAME                        PROPERTY              VALUE                    SOURCE
rpool                       compression           lz4                      local
rpool                       relatime              on                       local
rpool/ROOT                  mountpoint            legacy                   local
rpool/ROOT                  compression           lz4                      local
rpool/ROOT                  acltype               posixacl                 local
これは、実験的な環境ですが、この他にサーバを1台 ZFS mirror で動かしています。

CentOS 7 で ZFS root 環境を作る手順については、こちら にまとめられています。thanks

2019-11-27追記
書き忘れていましたが、カーネルをアップデートした場合に、grub.cfg の自動更新が失敗するので、手動で grub2-mkconfig を行う必要があります。
  インストール中          : kernel-3.10.0-1062.4.3.el7.x86_64
grubby fatal error: unable to find a suitable template
  更新します              : sudo-1.8.23-4.el7_7.1.x86_64
というメッセージが出て、grub.cfg に新しいエントリーが追加されません。
[root@hoge ~]# grep 3.10.0 /boot/efi/EFI/centos/grub.cfg
menuentry 'CentOS Linux (3.10.0-1062.4.1.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1062.4.1.el7.x86_64-advanced-8c823f06e4556631' {
        linuxefi /ROOT@/boot/vmlinuz-3.10.0-1062.4.1.el7.x86_64 root=ZFS=rpool/ROOT ro crashkernel=auto elevator=deadline vconsole.keymap=jp106 int_pln_enable=1 psmouse.synaptics_intertouch=1
        initrdefi /ROOT@/boot/initramfs-3.10.0-1062.4.1.el7.x86_64.img
[root@hoge ~]# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
Generating grub configuration file ...
Linux イメージを見つけました: /boot/vmlinuz-3.10.0-1062.4.3.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1062.4.3.el7.x86_64.img
Linux イメージを見つけました: /boot/vmlinuz-3.10.0-1062.4.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1062.4.1.el7.x86_64.img
Linux イメージを見つけました: /boot/vmlinuz-0-rescue-27a0bb3862794c69a2c05249c5e54c36
Found initrd image: /boot/initramfs-0-rescue-27a0bb3862794c69a2c05249c5e54c36.img
完了
[root@hoge ~]# grep 3.10.0 /boot/efi/EFI/centos/grub.cfg
menuentry 'CentOS Linux (3.10.0-1062.4.3.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1062.4.3.el7.x86_64-advanced-8c823f06e4556631' {
        linuxefi /ROOT@/boot/vmlinuz-3.10.0-1062.4.3.el7.x86_64 root=ZFS=rpool/ROOT ro crashkernel=auto elevator=deadline vconsole.keymap=jp106 int_pln_enable=1 psmouse.synaptics_intertouch=1
        initrdefi /ROOT@/boot/initramfs-3.10.0-1062.4.3.el7.x86_64.img
menuentry 'CentOS Linux (3.10.0-1062.4.1.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1062.4.1.el7.x86_64-advanced-8c823f06e4556631' {
        linuxefi /ROOT@/boot/vmlinuz-3.10.0-1062.4.1.el7.x86_64 root=ZFS=rpool/ROOT ro crashkernel=auto elevator=deadline vconsole.keymap=jp106 int_pln_enable=1 psmouse.synaptics_intertouch=1
        initrdefi /ROOT@/boot/initramfs-3.10.0-1062.4.1.el7.x86_64.img
if [ "x$default" = 'CentOS Linux (3.10.0-1062.4.1.el7.x86_64) 7 (Core)' ]; then default='Advanced options for CentOS Linux>CentOS Linux (3.10.0-1062.4.1.el7.x86_64) 7 (Core)'; fi;
[root@hoge ~]# 

2019-12-25追記
前述の grubby のエラーについて探究していませんでしたが、調べてみると単純な話しでした。まず、/var/log/grubby というログファイルが存在することがわかったので見てみたら、次のような出力になっていました。
[root@hoge ~]# cat /var/log/grubby
...
DBG: 1894: Wed Dec 25 04:39:43 2019: command line: --grub2 -c /boot/efi/EFI/centos/grub.cfg --efi --add-kernel=/boot/vmlinuz-3.10.0-1062.9.1.el7.x86_64 --copy-default --title CentOS Linux (3.10.0-1062.9.1.el7.x86_64) 7 (Core) --args=root=ZFS=rpool/ROOT  --remove-kernel=TITLE=CentOS Linux (3.10.0-1062.9.1.el7.x86_64) 7 (Core) --make-default
DBG: Image entry failed: access to /ROOT@/boot/vmlinuz-3.10.0-1062.4.3.el7.x86_64 failed
DBG: menuentry 'CentOS Linux (3.10.0-1062.4.3.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1062.4.3.el7.x86_64-advanced-8c823f06e4556631' { 
DBG:  load_video
DBG:  set gfxpayload=keep
DBG:  insmod gzio
DBG:  insmod part_gpt
DBG:  insmod zfs
DBG:  if [ x$feature_platform_search_hint = xy ]; then
DBG:    search --no-floppy --fs-uuid --set=root  8c823f06e4556631
DBG:  else
DBG:    search --no-floppy --fs-uuid --set=root 8c823f06e4556631
DBG:  fi
DBG:  linuxefi /ROOT@/boot/vmlinuz-3.10.0-1062.4.3.el7.x86_64 root=ZFS=rpool/ROOT ro crashkernel=auto elevator=deadline vconsole.keymap=jp106 int_pln_enable=1 psmouse.synaptics_intertouch=1 
DBG:  initrdefi /ROOT@/boot/initramfs-3.10.0-1062.4.3.el7.x86_64.img
DBG: }
DBG: Image entry failed: access to /ROOT@/boot/vmlinuz-0-rescue-27a0bb3862794c69a2c05249c5e54c36 failed
DBG: menuentry 'CentOS Linux (0-rescue-27a0bb3862794c69a2c05249c5e54c36) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-27a0bb3862794c69a2c05249c5e54c36-advanced-8c823f06e4556631' { 
DBG:  load_video
...
ZFS 特有の /ROOT@/boot という記法を解釈できないために、vmlinuz のパスを正しく認識できず、エラーになるようです。つまり、安直にはシンボリックリンクでも張ればよいと思われます。
[root@hoge ~]# ln -s / /ROOT\@
[root@hoge ~]# ls -l / | grep ROOT
lrwxrwxrwx    1 root root    1 12月 25 06:00 ROOT@ -> /
[root@hoge ~]# ls -l /ROOT@/boot/vmlinuz-3.10.0-1062.9.1.el7.x86_64 
-rwxr-xr-x 1 root root 6734016 12月  7 00:53 /ROOT@/boot/vmlinuz-3.10.0-1062.9.1.el7.x86_64
[root@hoge ~]# 
これでうまくいくかどうかは、次回のアップデートカーネルが出て来たときに確認しようと思います。
思わず grubby のソースまで見てしまいましたが、ZFS の場合だけ特別に扱うようなコードは受け入れられそうにないかなと思いました。

2019年7月21日日曜日

bash でシグナル trap 中に更にシグナルを受けたらどうなるか?

bash でシグナル trap 中に更にシグナルを受けたらどうなるか? を確認したいと思い、実験してみました。
#!/bin/bash

SELF_PID=$$

sig_HUP_handler() {
        echo caught SIGHUP
        kill -TERM $SELF_PID
}

trap "echo caught SIGTERM ; exit 1" SIGTERM
trap "sig_HUP_handler     ; exit 2" SIGHUP

kill -HUP $SELF_PID

exit 0
このスクリプトを実行して確認してみたら、終了コードが 2 でした。つまり、SIGTERM に対する trap は実行されませんでした。
[root@hoge ~]# ./trap_test.bash 
caught SIGHUP
[root@hoge ~]# echo $?
2
[root@hoge ~]# strace ./trap_test.bash 
...
kill(9607, SIGHUP)                      = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=9607, si_uid=0} ---
rt_sigreturn({mask=[]})                 = 0
rt_sigprocmask(SIG_BLOCK, [HUP], [], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP], 8) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0264e7a000
write(1, "caught SIGHUP\n", 14caught SIGHUP
)         = 14
kill(9607, SIGTERM)                     = 0
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=9607, si_uid=0} ---
rt_sigreturn({mask=[HUP]})              = 0
rt_sigprocmask(SIG_SETMASK, [HUP], NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(2)                           = ?
+++ exited with 2 +++
[root@hoge ~]# 
strace をかけてみると、このように SIGTERM は確かに割り込んでいます。次に、exit 2 を行わないようにして、実験してみました。
[root@hoge ~]# diff trap_test.bash trap_test2.bash 
11c11
< trap "sig_HUP_handler     ; exit 2" SIGHUP
---
> trap "sig_HUP_handler     # exit 2" SIGHUP
[root@hoge ~]# ./trap_test2.bash 
caught SIGHUP
caught SIGTERM
[root@hoge ~]# echo $?
1
終了コードは 1 になりました。つまり、SIGHUP に対する trap 完了後に、SIGTERM に対する trap が実行されました。
なお、上記の実験環境は、CentOS7 bash-4.2.46-31.el7.x86_64 です。同じスクリプトを RHEL4 より古い環境で動かすと bash が segfault してしまいます。当時は、想定されていなかったのでしょうね。 シグナルには気をつけよう!

2019年6月22日土曜日

fedora30 で日本語ロケールを追加するには?

fedora30 で日本語マニュアルページを参照しようとしたら、日本語ロケールがインストールされていませんでした。
知りませんでした(いつもインストールの時に日本語サポートを追加していた)が、glibc-langpack-ja を入れたら日本語ロケールが追加されました。忘れそうなので、備忘録。
[root@fedora30 ~]# rpm -qi glibc-langpack-ja
Name        : glibc-langpack-ja
Version     : 2.29
Release     : 15.fc30
Architecture: x86_64
Install Date: 2019年06月22日 21時51分40秒
Group       : Unspecified
Size        : 2200156
License     : LGPLv2+ and LGPLv2+ with exceptions and GPLv2+ and GPLv2+ with exceptions and BSD and Inner-Net and ISC and Public Domain and GFDL
Signature   : RSA/SHA256, 2019年06月07日 01時19分38秒, Key ID ef3c111fcfc659b9
Source RPM  : glibc-2.29-15.fc30.src.rpm
Build Date  : 2019年06月06日 21時27分54秒
Build Host  : buildvm-19.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : http://www.gnu.org/software/glibc/
Bug URL     : https://bugz.fedoraproject.org/glibc
Summary     : Locale data for ja
Description :
The glibc-langpack-ja package includes the basic information required
to support the ja language in your applications.
[root@fedora30 ~]# locale -a | grep ja
ja_JP.eucjp
ja_JP.utf8

bash のヒアドキュメントは、一時ファイルを作成する

ディスクの空きスペースが無くなった際、手持ちの bash スクリプトから次のようなメッセージが出ていました。
myscript: cannot create temp file for here-document: No space left on device
そのスクリプトではヒアドキュメントを使っており、メッセージから察するに、bash のヒアドキュメントでは、背後で一時ファイルが作られるらしい、と認識しました。考えてみると自然な実装であり「まあそうなるわなあ」という感想。
いちおう確かめるために、そのスクリプトのエッセンスを抽出して実験してみました。
#!/bin/bash
perl <<'PERL'
exit 0
PERL
[root@hoge ~]# uname -a
Linux hoge 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# rpm -q bash
bash-4.2.46-31.el7.x86_64
[root@hoge ~]# diff -c test1 test2
*** test1 2019-06-21 23:38:42.812280355 +0900
--- test2 2019-06-21 23:39:56.797172798 +0900
***************
*** 1,4 ****
  #!/bin/bash
! perl <<'PERL'
  exit 0
! PERL
--- 1,4 ----
  #!/bin/bash
! perl -e '
  exit 0
! '
[root@hoge ~]# strace -o /tmp/strace.out -f ./test1   ※ヒアドキュメントを使用した場合
[root@hoge ~]# strace -o /tmp/strace.out2 -f ./test2
[root@hoge ~]# grep /tmp/ /tmp/strace.out
86704 open("/tmp/sh-thd-1561087024", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600) = 3
86704 open("/tmp/sh-thd-1561087024", O_RDONLY) = 4
86704 unlink("/tmp/sh-thd-1561087024")  = 0
[root@hoge ~]# grep /tmp/ /tmp/strace.out2
※ヒアドキュメントを使用しない場合は出力なし
[root@hoge ~]# wc -l /tmp/strace.out*
  402 /tmp/strace.out
  393 /tmp/strace.out2
  795 合計
strace の出力から、bash のヒアドキュメントは、一時ファイルを作成すると確認できました。この例の場合は、ヒアドキュメントをやめて perl -e '...' と書き換えれば、一時ファイル作成を避けることができました。全体のシステムコール数も減りました。
せこいようですが、「塵も積もれば山となる」という場合もあるものと思います。

2019年6月7日金曜日

Perl のモジュール(.pm)のパスを調べたい

Perl のモジュール(.pm)を追加インストールするため、そのモジュールを含む RPM パッケージ名が知りたい場合があります。yum search perl で適当に名前から推測でも、大抵間に合いますが、正確に知る方法を調べてみました。
モジュールがインストールされている環境で、そのモジュールのパスを調べる方法がわかればよいと思って検索してみると、ありがたいことに、先人の方が居られました。

http://wizard-blue.hatenablog.jp/entry/20091029/1256743552

なるほど @INC を find すればよいですね。ドット(.)の find には気をつけたほうがよいって、なんと親切な補足と思いました。ドット(.)の下に大量にファイルがあるという状況は、よくありそうですよね。ホームディレクトリとか。
man perlvar によると、-T オプションを使えば、ドット(.)が除外されるとありました。
       @INC    The array @INC contains the list of places that the "do EXPR",
               "require", or "use" constructs look for their library files.
               It initially consists of the arguments to any -I command-line
               switches, followed by the default Perl library, probably
               /usr/local/lib/perl, followed by ".", to represent the current
               directory.  ("." will not be appended if taint checks are
               enabled, either by "-T" or by "-t".)  If you need to modify
ということは、先人の方が書かれていたテクニックを若干変形して、次のようにすれば、ドット(.)を避けて検索できるようです。
[root@hoge ~]# perl -T -e 'map { print "$_\n" ; } @INC ;'
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
※ドット(.)は含まれない
[root@hoge ~]# find `perl -T -e 'print "@INC" ;'` -name "Zlib.pm"
find: '/usr/local/lib64/perl5': そのようなファイルやディレクトリはありません
find: '/usr/local/share/perl5': そのようなファイルやディレクトリはありません
/usr/lib64/perl5/vendor_perl/Compress/Raw/Zlib.pm
/usr/lib64/perl5/vendor_perl/Compress/Raw/Zlib.pm
/usr/share/perl5/Compress/Zlib.pm
この出力を rpm -qf に渡すことで、そのモジュールを含む RPM を特定できました。
[root@hoge ~]# rpm -qf /usr/share/perl5/Compress/Zlib.pm
perl-IO-Compress-2.061-2.el7.noarch
[root@hoge ~]# uname -a
Linux hoge 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
/usr/share の下とは、ちょっと意外でした。/usr/lib64 の下かと思ってた。

2019年5月31日金曜日

ZFS on Linux 0.8.0 で zpool trim

v0.8.0 で、zpool trim が使えるようになったので、初めて使ってみました。
コマンド自体は TRIM 処理の完了を待たずに即座に終了するようで、その後しばらく iostat で負荷が見えました。ThinkPad W520 にはディスクアクセスを示す LED がついていて、長時間点灯していました。
[root@hoge ~]# uname -a
Linux hoge 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# rpm -q kmod-zfs
kmod-zfs-0.8.0-1.el7.x86_64
[root@hoge ~]# zpool trim tankW
[root@hoge ~]# iostat -x -m 2
Linux 3.10.0-957.12.2.el7.x86_64 (hoge)  2019年05月31日  _x86_64_ (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.81    0.06    3.20    1.51    0.00   93.42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda              39.03     8.63   47.95  263.80     2.38   137.59   919.58     0.15    0.48    0.96    0.39   0.18   5.65
sdb              97.99     8.79  112.27  263.45     6.15   137.58   783.44     0.33    0.88    2.02    0.40   0.19   7.02
zd0               0.00     0.00    3.42    0.00     0.06     0.00    37.43     0.00    0.07    0.07    0.00   0.05   0.02
zd16              0.00     0.00    2.30    0.00     0.01     0.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    2.30    0.00     0.01     0.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    2.85    0.00     0.04     0.00    25.68     0.00    0.08    0.08    0.00   0.05   0.01
zd64              0.00     0.00    2.48    0.00     0.02     0.00    14.78     0.00    0.05    0.05    0.00   0.05   0.01
zd80              0.00     0.00    3.35    0.00     0.04     0.00    22.23     0.00    0.07    0.07    0.00   0.05   0.02
dm-0              0.00     0.00    0.35    0.00     0.01     0.00    51.80     0.00    0.20    0.20    0.00   0.07   0.00
dm-1              0.00     0.00    0.35    0.00     0.01     0.00    51.80     0.00    0.15    0.15    0.00   0.12   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    3.61   12.65    0.00   83.68

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   60.00 2808.50     0.25  1589.70  1135.16     0.58    0.20    0.17    0.20   0.16  45.35
sdb               0.00     0.00   60.00 2817.50     0.24  1590.78  1132.38     0.59    0.20    0.18    0.20   0.16  46.50
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    3.72   13.69    0.00   82.52

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   51.50 3109.00     0.20  1402.12   908.70     0.62    0.20    0.08    0.20   0.15  48.70
sdb               0.00     0.00   48.50 3096.50     0.19  1402.12   913.18     0.61    0.19    0.07    0.20   0.15  46.90
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.13    0.00    3.85   12.18    0.00   83.85

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00  156.00 2428.50     0.86  2251.20  1784.56     0.54    0.21    0.17    0.21   0.17  43.00
sdb               0.00     0.00  146.00 2446.50     0.73  2250.95  1778.77     0.55    0.21    0.18    0.22   0.17  43.90
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    2.47   11.46    0.00   86.07

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     1.50   36.00 2536.00     0.23  1033.82   823.38     0.50    0.20    0.14    0.20   0.18  45.80
sdb               0.00     1.50   36.50 2529.00     0.20  1033.65   825.31     0.49    0.19    0.15    0.19   0.17  44.30
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    4.10   11.22    0.00   84.62

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   93.00 2532.50     0.75  1309.89  1022.36     0.53    0.20    0.23    0.20   0.17  44.15
sdb               0.00     0.00   96.50 2523.50     0.55  1307.29  1022.31     0.49    0.19    0.15    0.19   0.16  41.10
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    2.40   11.79    0.00   85.75

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   38.50 2582.00     0.29  1539.58  1203.46     0.52    0.20    0.23    0.20   0.17  45.80
sdb               0.00     0.00   39.50 2592.50     0.25  1538.75  1197.52     0.53    0.20    0.19    0.20   0.18  46.60
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    2.65   11.16    0.00   86.19

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   30.00 2596.00     0.22   611.86   477.35     0.47    0.18    0.18    0.18   0.17  44.50
sdb               0.00     0.00   32.00 2593.00     0.22   615.56   480.43     0.48    0.18    0.33    0.18   0.17  44.45
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    5.72   12.39    0.00   81.82

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00  226.50 2692.50     1.46  1841.68  1293.16     0.60    0.21    0.24    0.20   0.15  42.65
sdb               0.00     0.00  200.50 2699.50     1.42  1841.84  1301.72     0.57    0.20    0.24    0.19   0.14  39.65
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    3.59   13.36    0.00   82.99

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   41.50 3118.50     0.16  1775.72  1150.95     0.66    0.21    0.25    0.21   0.16  49.00
sdb               0.00     0.00   38.00 3115.00     0.15  1765.88  1147.11     0.64    0.20    0.28    0.20   0.15  47.70
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    3.47   11.48    0.00   84.98

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   75.50 2533.00     0.54  2058.24  1616.40     0.53    0.20    0.23    0.20   0.17  44.20
sdb               0.00     0.00   83.50 2522.00     0.48  2045.01  1607.81     0.53    0.20    0.20    0.20   0.17  43.80
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    2.66   11.28    0.00   85.99

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.50     0.00   52.00 2509.00     0.29  1027.77   822.12     0.49    0.19    0.12    0.19   0.18  45.20
sdb               0.00     0.00   51.50 2509.50     0.23  1050.85   840.54     0.50    0.19    0.13    0.20   0.18  45.15
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    2.84   10.74    0.00   86.36

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   31.50 2135.50     0.33  1940.75  1834.49     0.47    0.22    0.22    0.22   0.20  43.95
sdb               0.00     0.00   29.00 2135.50     0.20  1940.70  1836.43     0.47    0.22    0.17    0.22   0.20  43.95
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    3.29   11.15    0.00   85.50

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   67.50 2659.50     0.30   591.65   444.56     0.50    0.18    0.12    0.18   0.17  45.20
sdb               0.00     0.00   66.50 2651.50     0.29   590.42   445.10     0.49    0.18    0.11    0.18   0.16  44.10
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    2.21   10.69    0.00   87.03

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     3.00   15.50 2256.00     0.16  1215.62  1096.15     0.45    0.20    0.26    0.20   0.20  44.30
sdb               0.00     3.00   13.00 2264.50     0.13  1216.85  1094.34     0.45    0.20    0.15    0.20   0.19  43.70
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    3.15   11.72    0.00   85.07

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   92.50 2638.00     0.49  1039.02   779.68     0.53    0.19    0.11    0.20   0.17  45.25
sdb               0.00     0.00   90.00 2641.50     0.52  1038.91   779.33     0.53    0.19    0.15    0.19   0.16  44.80
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    2.92   11.41    0.00   85.67

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     1.00   65.00 2549.50     0.26   905.43   709.45     0.49    0.19    0.05    0.19   0.17  43.45
sdb               0.00     0.50   58.00 2543.00     0.26   905.18   712.94     0.51    0.20    0.09    0.20   0.17  44.55
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    3.09   11.04    0.00   85.80

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   60.00 2244.00     0.41  1526.12  1356.91     0.49    0.21    0.17    0.21   0.20  45.10
sdb               0.00     0.00   63.00 2244.50     0.39  1526.45  1355.13     0.48    0.21    0.21    0.21   0.19  43.65
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    2.85   11.47    0.00   85.61

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   24.50 2607.50     0.15   801.90   624.09     0.52    0.20    0.20    0.20   0.17  45.80
sdb               0.00     0.00   19.50 2627.00     0.11   803.70   622.02     0.50    0.19    0.26    0.19   0.17  44.45
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.13    0.00    5.44   11.25    0.00   83.19

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   74.00 2762.00     0.29   872.94   630.60     0.56    0.20    0.09    0.20   0.16  44.20
sdb               0.00     0.00   74.00 2771.00     0.29   878.07   632.30     0.55    0.19    0.09    0.19   0.15  44.05
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.13    0.00    6.36   12.03    0.00   81.49

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.50   60.50 2511.50     0.57  1823.39  1452.36     0.53    0.20    0.36    0.20   0.17  43.50
sdb               0.00     0.50   63.50 2497.00     0.66  1816.62  1453.55     0.54    0.21    0.35    0.21   0.18  45.95
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.25    0.00    4.11   12.34    0.00   83.29

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   53.00 2764.50     0.23   902.79   656.39     0.51    0.18    0.17    0.18   0.16  45.00
sdb               0.00     0.00   47.00 2770.50     0.24   902.75   656.37     0.52    0.18    0.21    0.18   0.17  46.90
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.13    0.00    3.21   11.96    0.00   84.70

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   30.50 2608.50     0.12  1529.08  1186.74     0.52    0.20    0.21    0.20   0.17  46.05
sdb               0.00     0.00   29.50 2593.00     0.12  1529.77  1194.74     0.51    0.20    0.22    0.19   0.18  46.15
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.25    0.00    1.70    5.29    0.00   92.76

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   17.00 1343.50     0.07   317.63   478.23     0.27    0.19    0.26    0.19   0.13  17.70
sdb               0.00     0.00   16.50 1358.50     0.06   316.93   472.15     0.26    0.19    0.30    0.19   0.13  17.85
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.13    0.00    0.00   99.81

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     1.00    0.00   14.00     0.00     0.10    14.29     0.00    0.07    0.00    0.07   0.04   0.05
sdb               0.00     2.00    0.00   13.00     0.00     0.10    15.38     0.00    0.08    0.00    0.08   0.04   0.05
zd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd16              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd32              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd48              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd64              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
zd80              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

^C
[root@hoge ~]# 
SATA 接続なのに wMB/s にあり得ない数字が出てますが、TRIM されたサイズを書き込みとして計測してしまっているのでしょうかね。
使用している SSD は Crucial MX200 です。その後、scrub を行い正常終了しました。
root@hoge ~]# zpool status
  pool: tankW
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
 still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
 the pool may no longer be accessible by software that does not support
 the features. See zpool-features(5) for details.
  scan: scrub repaired 0B in 0 days 00:17:03 with 0 errors on Fri May 31 07:10:23 2019
config:

 NAME                                               STATE     READ WRITE CKSUM
 tankW                                              ONLINE       0     0     0
   mirror-0                                         ONLINE       0     0     0
     ata-Crucial_CT500MX200SSD3_xxxxxxxxxxxx-part8  ONLINE       0     0     0
     ata-Crucial_CT500MX200SSD3_yyyyyyyyyyyy-part8  ONLINE       0     0     0

errors: No known data errors
[root@hoge ~]# zpool history tankW | head 
History for 'tankW':
2016-08-04.20:21:41 zpool create tankW mirror /dev/sda8 /dev/sdb8  ※3年近く前に作成
2016-08-04.20:21:47 zpool export tankW
2016-08-04.20:22:03 zpool import -d /dev/disk/by-id tankW
...

2019年5月6日月曜日

シェルスクリプトでファイルサイズを取得するベストな方法は?

シェルスクリプトでファイルサイズを取得するのに、今まで次のように書いていて、常套句と思っていました。
[root@hoge tmp]# uname -a
Linux hoge 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge tmp]# ls -l /etc/services 
-rw-r--r-- 1 root root 670293 Jun  7  2013 /etc/services
[root@hoge tmp]# declare -i fsize=`wc -c /etc/services`
bash: declare: 670293 /etc/services: division by 0 (error token is "/services")
[root@hoge tmp]# echo $fsize

[root@hoge tmp]# wc -c /etc/services 
670293 /etc/services
[root@hoge tmp]# declare -i fsize=`wc -c /etc/services | gawk '{print $1}'`
[root@hoge tmp]# echo $fsize
670293
gawk まで呼び出すのがイマイチだなとは思っていたのですが、本日ふと思い立ち、調べてみたら先人の方が居られました。
https://ameblo.jp/archive-redo-blog/entry-10196055325.html
なるほど標準入力にリダイレクトすれば1コマンドで済むのですね。賢い方法と思いました。
[root@hoge tmp]# declare -i fsize=`wc -c < /etc/services`                    
[root@hoge tmp]# echo $fsize
670293
これからは、このパターンを使おうと思います。
ところで、wc というコマンド名からは、ファイルを全部読んでファイルサイズを得る動きをしそうに見えますが、そこは賢い実装になっており、-c オプション指定だと fstat(2) システムコールが利用され、ファイルを全部読み出すなどという非効率な振舞いにはならないようです。
[root@hoge tmp]# strace wc -c < /etc/services
execve("/usr/bin/wc", ["wc", "-c"], [/* 46 vars */]) = 0
brk(NULL)                               = 0x1e76000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa4cf32f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=90399, ...}) = 0
mmap(NULL, 90399, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa4cf318000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340$\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2151672, ...}) = 0
mmap(NULL, 3981792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa4ced42000
mprotect(0x7fa4cef04000, 2097152, PROT_NONE) = 0
mmap(0x7fa4cf104000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c2000) = 0x7fa4cf104000
mmap(0x7fa4cf10a000, 16864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa4cf10a000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa4cf317000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa4cf315000
arch_prctl(ARCH_SET_FS, 0x7fa4cf315740) = 0
mprotect(0x7fa4cf104000, 16384, PROT_READ) = 0
mprotect(0x608000, 4096, PROT_READ)     = 0
mprotect(0x7fa4cf330000, 4096, PROT_READ) = 0
munmap(0x7fa4cf318000, 90399)           = 0
brk(NULL)                               = 0x1e76000
brk(0x1e97000)                          = 0x1e97000
brk(NULL)                               = 0x1e97000
fstat(0, {st_mode=S_IFREG|0644, st_size=670293, ...}) = 0
lseek(0, 0, SEEK_CUR)                   = 0
lseek(0, 0, SEEK_END)                   = 670293
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa4cf32e000
write(1, "670293\n", 7670293
)                 = 7
close(0)                                = 0
close(1)                                = 0
munmap(0x7fa4cf32e000, 4096)            = 0
close(2)                                = 0https://ameblo.jp/archive-redo-blog/entry-10196055325.html
exit_group(0)                           = ?
+++ exited with 0 +++
[root@hoge tmp]# 
ということで、これがベストな方法に思いましたが、他にあるでしょうかね?
もちろん Perl/Python/Ruby等 の汎用スクリプト言語を呼べば同様のことが出来るけど、軽量に行うには wc -c < file がベストなのではと思っています。

2019-07-24追記
stat -c %s というのもありますが、当然 -c %s を解釈する処理の分だけ遅いに違いないと思っていましたが、一応実験してみました。
[root@hoge ~]# perf stat stat -c %s /etc/services
670293

 Performance counter stats for 'stat -c %s /etc/services':

          0.728356      task-clock (msec)         #    0.749 CPUs utilized          
                 2      context-switches          #    0.003 M/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               249      page-faults               #    0.342 M/sec                  
         2,528,856      cycles                    #    3.472 GHz                    
         1,292,306      instructions              #    0.51  insn per cycle         
           252,891      branches                  #  347.208 M/sec                  
            11,528      branch-misses             #    4.56% of all branches        

       0.000972916 seconds time elapsed

[root@hoge ~]# perf stat wc -c < /etc/services
670293

 Performance counter stats for 'wc -c':

          0.599273      task-clock (msec)         #    0.705 CPUs utilized          
                 2      context-switches          #    0.003 M/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               219      page-faults               #    0.365 M/sec                  
         2,077,769      cycles                    #    3.467 GHz                    
         1,043,855      instructions              #    0.50  insn per cycle         
           202,792      branches                  #  338.397 M/sec                  
            10,808      branch-misses             #    5.33% of all branches        

       0.000849638 seconds time elapsed
人気ブログランキングへ にほんブログ村 IT技術ブログへ