ラベル Fedora の投稿を表示しています。 すべての投稿を表示
ラベル Fedora の投稿を表示しています。 すべての投稿を表示

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年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年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

2019年2月22日金曜日

fedora28でディスク空き容量低下

fedora28 で dnf update をやったら、ディスクが足りずエラーになり、どこで食ってるか調べました。ほぼ使ったことがなかったのですが「ディスク使用量アナライザー」というのが役に立ちました。

PackageKit のキャッシュが溜まっていたようです。
[root@hoge packages]# pwd
/var/cache/PackageKit/28/metadata/updates/packages
[root@hoge packages]# ls -l | head -5
合計 8639488
-rw-r--r--. 1 root root   564484  6月 25  2018 GeoIP-GeoLite-data-2018.06-1.fc28.noarch.rpm
-rw-r--r--. 1 root root  1611928 11月 29 06:41 GraphicsMagick-1.3.31-1.fc28.x86_64.rpm
-rw-r--r--. 1 root root   364720  6月 16  2018 LibRaw-0.18.12-1.fc28.x86_64.rpm
-rw-r--r--. 1 root root   365108  7月 25  2018 LibRaw-0.18.13-1.fc28.x86_64.rpm
[root@hoge packages]# du -hs .
8.3G .
https://unix.stackexchange.com/questions/265755/fedora-23-can-i-safely-delete-files-in-var-cache-packagekit-metadata-updates
によれば、消しても問題なし。まあ、キャッシュだしそうだよな。
[root@hoge packages]# pkcon refresh force -c -1
キャッシュをリフレッシュ中[=========================]         
キャッシュをロード中[=========================]         
レポジトリ情報をダウンロード中[=========================]         
キャッシュをロード中[=========================]         
レポジトリ情報をダウンロード中[=========================]         
キャッシュをロード中[=========================]         
レポジトリ情報をダウンロード中[=========================]         
キャッシュをロード中[=========================]         
レポジトリ情報をダウンロード中[=========================]         
キャッシュをロード中[=========================]         
レポジトリ情報をダウンロード中[=========================]         
クエリ中                  [=========================]         
キャッシュをロード中[=========================]         
終了                        [=========================]         
[root@hoge packages]# du -hs .
180K .
[root@hoge packages]# df -k /
ファイルシス   1K-ブロック     使用  使用可 使用% マウント位置
/dev/nvme0n1p8    30106488 18965236 9588868   67% /
[root@hoge packages]# df -h /
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/nvme0n1p8    29G   19G  9.2G   67% /    ★おっけー

2018年11月3日土曜日

Fedora 28 で QR コードを読み取る

最近ほとんど自宅メインマシンとして使っている ThinkPad 25 の Web カメラで、QR コードを読み取りたいと思ったのですが、なぜか Windows10 環境ではカメラが動かず (まったく映らない) でした。
ThinkPad 25 を使い始めてから約1年、今までに1回も Web カメラを使ったことがなかったし、これはもしかすると初期不良だったのかも?
それで、Windows10 の状態 (ドライバの状態や、新しいドライバがリリースされてないか等) を調べたり、BIOS のメニューでカメラが disable になっていたりしないか?を確認したのですが、わからずでした。Windows 環境でのこの手の調査は疲れるー。

しばらく休んで気を取り直したのち、マルチブートで Fedora 28 が動くようにしてあるので、そういえば試したことがありませんでしたが、Linux で Web カメラって使えるの?と、ネット検索してみると、わりと普通に使えるらしいと知りました。まず、そもそもカメラが初期不良なのかを切り分けるため、camorama というツールをインストールして試してみたところ、ちゃんと撮影可能でした。初期不良 (or 故障) だったら lenovo に連絡とるなど面倒臭いので、まずはよかった!

それなら、Fedora で使える QR コードリーダーがあればよいと思い、chrome 用プラグインの ScanQR というのが Linux でも使えそうだったので試しました。しかし、ScanQR では、どういうわけかノイズだらけで使えませんでした。

このように、マトリックス状態です。なんじゃこりゃ です。
なお、dmesg には次のようなメッセージが出ていました。
[15220.355888] uvcvideo: Failed to query (SET_CUR) UVC control 4 on unit 1: -32 (exp. 4).
uvcvideo というドライバが Web カメラの制御に関係するようだとわかり、ArchLinux のページなどを彷徨ったのですが、とうとう ScanQR を正常動作させられませんでした。

もっと他に QR コードリーダーはないか?と、ネット検索して辿りついたのが、zbar というツールです。
この zbar というパッケージに含まれる zbarcam で読み取れそうでしたが、またしても マトリックス 状態。

zbarcam の help を見てみると、こうなってました。
[root@hoge ~]# zbarcam --help
usage: zbarcam [options] [/dev/video?]

scan and decode bar codes from a video stream

options:
    -h, --help      display this help text
    --version       display version information and exit
    -q, --quiet     disable beep when symbol is decoded
    -v, --verbose   increase debug output level
    --verbose=N     set specific debug output level
    --xml           use XML output format
    --raw           output decoded symbol data without symbology prefix
    --nodisplay     disable video display window
    --prescale=x
                    request alternate video image size from driver
    -S[=], --set [=]
                    set decoder/scanner  to  (or 1)

[root@hoge ~]# ls -l /dev/video*
crw-rw----+ 1 root video 81, 0 11月  3 18:57 /dev/video0
crw-rw----+ 1 root video 81, 1 11月  3 18:57 /dev/video1
crw-rw----+ 1 root video 81, 2 11月  3 18:57 /dev/video2
crw-rw----+ 1 root video 81, 3 11月  3 18:57 /dev/video3
これを見て、ThinkPad 25 には赤外線カメラも付いてるし、マトリックス状態になるのは赤外線カメラが選択されているからでは?と試してみたら、video2 を指定することで正常に動きました!

以上、どなたかのご参考に。

2018年9月26日水曜日

Fedora で ThinkPad の BIOS アップデートが降ってきた


タイトルの通りですが、ThinkPad 25 で Fedora28 を使っていたら、まさかの BIOS アップデートが降ってきました。
これは、知らなかった。アップデート実行は止めておきましたが。。。

2018年8月4日土曜日

7z で .lzh を解凍する

姫野ベンチ を使おうとして、ソースをダウンロードしたのですが、どういう意図なのか zip の中に lzh ファイルが入っているという二重包装状態でした。
[root@hoge tmp]# ls -l *.zip
-rw-r--r--. 1 root root 2729  8月  3 00:01 cc_himenobmtxp_m.zip
[root@hoge tmp]# unzip cc_himenobmtxp_m.zip 
Archive:  cc_himenobmtxp_m.zip
 extracting: cc_himenobmtxp_m.lzh    
[root@hoge tmp]# ls -l cc_hime*
-rw-r--r--. 1 root root 2555  6月 10  2015 cc_himenobmtxp_m.lzh
-rw-r--r--. 1 root root 2729  8月  3 00:01 cc_himenobmtxp_m.zip
lzh なんて久しぶりに見ました。解凍は lha でできるとは思いましたが、いまどき lha なんて収録されてませんでした。環境は Fedora です。
[root@hoge tmp]# dnf install lha
メタデータの期限切れの確認は、0:52:24 時間前の 2018年08月04日 07時58分59秒 に実施しました。
一致した引数がありません: lha
エラー: 一致するものが見つかりません
他に頭に浮かんだのは 7z コマンド。しかし、man を見ても lzh の記述はなく、ダメ元で試してみたのですが、解凍できました。
[root@hoge tmp]# 7z x cc_himenobmtxp_m.lzh 

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz (806E9),ASM,AES-NI)

Scanning the drive for archives:
1 file, 2555 bytes (3 KiB)

Extracting archive: cc_himenobmtxp_m.lzh
--
Path = cc_himenobmtxp_m.lzh
Type = Lzh
Physical Size = 2555

Everything is Ok

Files: 2
Size:       7237
Compressed: 2555
[root@hoge tmp]# ls -l *.[ch] Makefile 
-rw-r--r--. 1 root root  237  2月 21  2002 Makefile
-rw-r--r--. 1 root root 7000  2月 21  2002 himenoBMTxps.c
以上、自分と誰かのために備忘録でした。

2018年8月3日金曜日

likwid で 姫野ベンチ を計測してみた

likwid 、姫野ベンチ の導入は make するだけなので、省略します。
[root@hoge Downloads]# likwid-perfctr -C 1 -g FLOPS_SP ./bmt 
--------------------------------------------------------------------------------
CPU name: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
CPU type: Intel Kabylake processor
CPU clock: 2.90 GHz
--------------------------------------------------------------------------------
mimax = 129 mjmax = 129 mkmax = 257
imax = 128 jmax = 128 kmax =256
 Start rehearsal measurement process.
 Measure the performance in 3 times.

 MFLOPS: 5008.406795 time(s): 0.082125 1.733593e-03

 Now, start the actual measurement process.
 The loop will be excuted in 2191 times
 This will take about one minute.
 Wait for a while

 Loop executed for 2191 times
 Gosa : 4.477886e-04 
 MFLOPS measured : 6004.316730 cpu : 50.030231
 Score based on Pentium III 600MHz : 73.223375
--------------------------------------------------------------------------------
Group 1: FLOPS_SP
+------------------------------------------+---------+--------------+
|                   Event                  | Counter |    Core 1    |
+------------------------------------------+---------+--------------+
|             INSTR_RETIRED_ANY            |  FIXC0  | 244033624741 |
|           CPU_CLK_UNHALTED_CORE          |  FIXC1  | 173945548078 |
|           CPU_CLK_UNHALTED_REF           |  FIXC2  | 144661450175 |
| FP_ARITH_INST_RETIRED_128B_PACKED_SINGLE |   PMC0  |  72415611576 |
|    FP_ARITH_INST_RETIRED_SCALAR_SINGLE   |   PMC1  |  11146222208 |
| FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE |   PMC2  |            0 |
+------------------------------------------+---------+--------------+

+----------------------+-----------+
|        Metric        |   Core 1  |
+----------------------+-----------+
|  Runtime (RDTSC) [s] |   50.2231 |
| Runtime unhalted [s] |   59.9028 |
|      Clock [MHz]     | 3491.6156 |
|          CPI         |    0.7128 |
|      SP MFLOP/s      | 5989.4533 |
|    AVX SP MFLOP/s    |         0 |
|    Packed MUOPS/s    | 1441.8797 |
|    Scalar MUOPS/s    |  221.9344 |
|  Vectorization ratio |   86.6611 |
+----------------------+-----------+
このように、ちゃんと近い値が出ました。-g オプションで指定する group name は、-a オプションで表示できます。
[root@hoge Downloads]# likwid-perfctr -a
 Group name Description
--------------------------------------------------------------------------------
       DATA Load to store ratio
 UOPS_ISSUE UOPs issueing
  TLB_INSTR L1 Instruction TLB miss rate/ratio
   TLB_DATA L2 data TLB miss rate/ratio
  FLOPS_AVX Packed AVX MFLOP/s
UOPS_RETIRE UOPs retirement
     BRANCH Branch prediction miss rate/ratio
  UOPS_EXEC UOPs execution
     ICACHE Instruction cache miss rate/ratio
       UOPS UOPs execution info
         L3 L3 cache bandwidth in MBytes/s
   FLOPS_SP Single Precision MFLOP/s
    L2CACHE L2 cache miss rate/ratio
   RECOVERY Recovery duration
    L3CACHE L3 cache miss rate/ratio
         L2 L2 cache bandwidth in MBytes/s
CYCLE_ACTIVITY Cycle Activities
     ENERGY Power and Energy consumption
FALSE_SHARE False sharing
      CLOCK Power and Energy consumption
   FLOPS_DP Double Precision MFLOP/s
なお、姫野ベンチ(static M)のソースを grep するとわかりますが、float で計算しているので、FLOPS_DP ではなく FLOPS_SP を使いました。
[root@hoge Downloads]# grep -w float himenoBMTxps.c 
float jacobi();
static float  p[MIMAX][MJMAX][MKMAX];
static float  a[4][MIMAX][MJMAX][MKMAX],
static float  bnd[MIMAX][MJMAX][MKMAX];
static float  wrk1[MIMAX][MJMAX][MKMAX],
static float omega;
  float  gosa;
        p[i][j][k]=(float)(i*i)/(float)((imax-1)*(imax-1));
float
  float gosa, s0, ss;

2018年6月20日水曜日

CentOS7 の黒いコンソール画面で Caps Lock の LED が光らない

会社のメインマシン用に、東プレの省スペースキーボード R2TLA-JP4-BK を新調し、試し打ちのために、CentOS7 が動作しているマシンに接続しました。
これまでは東プレの旧型省スペースタイプを使っていましたが、新型は今までになかった LED が搭載されており、さっそく Caps Lock で LED 点灯を確かめようとしたのですが。。。
点灯せず(あれ?)。キーを押すと大文字が入力されるので Caps Lock がちゃんと反応はしているようなのですが、なぜか LED が光りませんでした。

これって初期不良?サポートに聞くのは手間だなあなどと思ったのですが、問い合わせる前の切り分けに、別の LED 付フルキーボードを同じマシンに接続してみました。
これで LED が光るようなら、新キーボードの初期不良確定なのですが、なんとそのフルキーボードの LED も光らずでした。フルキーボードは別の CentOS7 マシンに接続していて、そちらでは光ってましたので、マシン環境の違いということになりました。

設定の差分を調べたところ、カーネルコマンドライン vconsole.keymap=jp106 の有無が違ってました。LED が光らなかったマシンにこの設定を入れたところ、コンソール画面で Caps Lock の LED が反応するようになりました。あーよかった。
[root@hoge ~]# vi /etc/default/grub 
...
GRUB_CMDLINE_LINUX="crashkernel=auto vconsole.keymap=jp106"
...
[root@hoge ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@hoge ~]# shutdown -r now
なお、あとで試したら vconsole.keymap=jp106 を指定していなくても、GNOME デスクトップのターミナル等であれば、LED が点灯するようです。
Caps Lock キーなんて、まず使わないわけですが、間違って押した時に LED が光ってすぐ分かるのは利点かなと思います。

いろいろな種類がある東プレキーボードですが、静音タイプは自分としては「何か違う感」があったのと、キー荷重ALL45gが好みなので、R2TLA-JP4-BK(人気薄?)を選択しました。以前、ALL30gのキーボードを使っていたこともあるのですが、自分には軽過ぎました。R2TLA-JP4-BK は、キー刻印が見づらい(黒色に墨)ですが、まったく問題なしです。増田忠先生の練習法は、すばらしいです。かれこれ30年近く前、「ワープロ・パソコンのためのらくらくキーボード練習帳―ブラインド・タッチからワープロ検定まで〈1 ローマ字入力編〉」という本で練習したおかげで、ほとんどキーを見なくても打てるようになりました。おもえば、ブラインドタッチになってから、キーボードにこだわりだしたのでした。速く打てるようになったため、良いキーボードでないと手が痛くて耐えられなくなり。。。

R2TLA-JP4-BK の打ち心地は、かなり気に入りました。ネット上で不評な右上部分のデザインも、色合い(非静音タイプは銀色)のせいか、それほど気になりませんでした。APC は、ちょっと試してみた限りでは、違いが知覚できず。とりあえずは、ノーマル設定(キースイッチ反応位置2.2mm)で利用中です。キーストロークを浅めにできるスペーサーまで付属しますが、キートップを全部とるのが手間なので、試していません。


写真では分かり難いですが、BIOS 設定で電源投入時に Num Lock を on にする設定により、Num Lock の LED を緑色に点灯させています。このキーボードは LED の色も選べるし、輝度を調整できたりもします。写真は輝度を一番低くした状態です。
黄色い S キーは、これまで使っていた 91UBY (NG02Y0) から移植したものです。互換性のない最下段以外を全部移植しようかと思ってましたが、R2TLA-JP4-BK それ自体の美しい佇まいも捨て難く感じ、1ポイントアクセントに留めました。


以上、vconsole.keymap についての備忘録のつもりが、ついつい RealForce のレビューになってしまいました。

2018-11-29追記
せっかく購入した R2TLA-JP4-BK ですが、日本語入力の際に頻繁に使う 変換キー の位置が標準的なものと異なっており、正直使いづらくて自分には耐えられませんでした。このため、メインマシン (Windows PC) での利用は断念して、そのまま Linux サーバで利用しています。RealForce R2 シリーズは、省スペース性が旧シリーズよりも向上している点が良いのに残念です。

2018年6月8日金曜日

Linux の smartctl で NVMe の温度などが見えた

ThinkPad 25 で、初めての NVMe を使い始めて約8ヵ月。
smartctl は SATA の S.M.A.R.T. を採ってくるツールだから、NVMe には使えないと思いこんでいましたが、本日 Fedora28 を使っていて、最新の smartctl ならば、NVMe 向けの拡張が実装済みではないか?っと man を nvme でサーチしたら記述がありました。そして、実際使えました。CentOS7 に収録の smartctl でも使えるようです。

下記は、CentOS7 上での試し打ち結果です。ちょっとした注意点(コツ)があり、/dev/nvme0n1(ネームスペース1)のほうではなく、/dev/nvme0 を指定します。そうしないと、肝心の情報(後半に出力される温度や消耗度を表すデータ)が出力されません。
[root@hoge ~]# smartctl -a /dev/nvme0
smartctl 6.5 2016-05-07 r4318 [x86_64-linux-3.10.0-862.3.2.el7.x86_64] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Number:                       LENSE20512GMSP34MEAT2TA
Serial Number:                      114406730xxxx
Firmware Version:                   2.3.8341
PCI Vendor/Subsystem ID:            0x17aa
IEEE OUI Identifier:                0xa03299
Controller ID:                      1
Number of Namespaces:               1
Namespace 1 Size/Capacity:          512,110,190,592 [512 GB]
Namespace 1 Utilization:            0
Namespace 1 Formatted LBA Size:     512
Local Time is:                      Fri Jun  8 11:05:50 2018 JST
Firmware Updates (0x02):            1 Slot
Optional Admin Commands (0x0007):   Security Format Frmw_DL
Optional NVM Commands (0x0016):     Wr_Unc DS_Mngmt Sav/Sel_Feat
Maximum Data Transfer Size:         32 Pages
Warning  Comp. Temp. Threshold:     70 Celsius

Supported Power States
St Op     Max   Active     Idle   RL RT WL WT  Ent_Lat  Ex_Lat
 0 +     6.50W       -        -    0  0  0  0        0       0
 1 +     4.60W       -        -    1  1  1  1        5       5
 2 +     3.90W       -        -    2  2  2  2        5       5
 3 -   0.1000W       -        -    3  3  3  3    35000    6000
 4 -   0.0100W       -        -    4  4  4  4    35000    6000

Supported LBA Sizes (NSID 0x1)
Id Fmt  Data  Metadt  Rel_Perf
 0 -     512       0         0

=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

SMART/Health Information (NVMe Log 0x02, NSID 0xffffffff)
Critical Warning:                   0x00
Temperature:                        38 Celsius
Available Spare:                    100%
Available Spare Threshold:          3%
Percentage Used:                    0%
Data Units Read:                    5,199,478 [2.66 TB]
Data Units Written:                 3,861,451 [1.97 TB]
Host Read Commands:                 91,143,836
Host Write Commands:                85,539,172
Controller Busy Time:               256
Power Cycles:                       485
Power On Hours:                     2,504
Unsafe Shutdowns:                   146
Media and Data Integrity Errors:    0
Error Information Log Entries:      0
Warning  Comp. Temperature Time:    0
Temperature Sensor 1:               44 Celsius
Temperature Sensor 2:               38 Celsius
Temperature Sensor 3:               35 Celsius

Error Information (NVMe Log 0x01, max 4 entries)
No Errors Logged

[root@hoge ~]# 
なお、同様のデータは nvme コマンドでも出せます。でも、SATA ディスクを扱うことが多くて、現状、NVMe はこの一台しか使っていないため、今のところ覚えられず。smartctl なら、ほぼ SATA と同様なので、ありがたい。
[root@hoge ~]# nvme smart-log /dev/nvme0
Smart Log for NVME device:nvme0 namespace-id:ffffffff
critical_warning                    : 0
temperature                         : 39 C
available_spare                     : 100%
available_spare_threshold           : 3%
percentage_used                     : 0%
data_units_read                     : 5,199,509
data_units_written                  : 3,861,775
host_read_commands                  : 91,144,551
host_write_commands                 : 85,546,279
controller_busy_time                : 256
power_cycles                        : 485
power_on_hours                      : 2,504
unsafe_shutdowns                    : 146
media_errors                        : 0
num_err_log_entries                 : 0
Warning Temperature Time            : 0
Critical Composite Temperature Time : 0
Temperature Sensor 1                : 44 C
Temperature Sensor 2                : 39 C
Temperature Sensor 3                : 36 C
Thermal Management T1 Trans Count   : 0
Thermal Management T2 Trans Count   : 0
Thermal Management T1 Total Time    : 0
Thermal Management T2 Total Time    : 0

2017年7月8日土曜日

systemd-nspawn を使って CentOS7 x86_64 の中に i686版 コンテナを作る

CentOS7 64bit版 を常用しているのですが、ちょっとだけ 32bit環境 に用がありまして、KVM ゲスト上で i686版 CentOS7 を使っていました。それでも良かったのですが、最近、systemd-nspawn でお手軽にコンテナが作れると知りましたので、備忘録です。

まず、KVM ゲスト上で出来るだけ最小の起動イメージを作ります。自分なりに試行錯誤して選定した結果が次です。
[root@cent7vm32 ~]# uname -a
Linux cent7vm32 3.10.0-514.26.2.el7.centos.plus.i686 #1 SMP Tue Jul 4 18:30:46 UTC 2017 i686 i686 i386 GNU/Linux
[root@cent7vm32 ~]# yum --releasever=7 --nogpg --installroot=/srv/mycon32 --disablerepo='*' --enablerepo=base \
install systemd passwd yum vim-minimal rootfiles initscripts dhclient net-tools iproute openssh-clients \
openssh-server NetworkManager bash-completion man
2019-06-22追記、同じ要領で fedora28 x86_64 のコンテナを作ったのですが、yum ではなく dnf を指定しておく必要がありました。
このイメージを tar などで固めて、ホスト環境へ転送します。あとは、起動するだけ。
[root@hoge srv]# uname -a
Linux hoge 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge srv]# systemd-nspawn -D /var/lib/machines/mycon32 --personality=x86
Spawning container mycon32 on /var/lib/machines/mycon32.
Press ^] three times within 1s to kill container.
Failed to create directory /var/lib/machines/mycon32//sys/fs/selinux: No such file or directory
Failed to create directory /var/lib/machines/mycon32//sys/fs/selinux: No such file or directory
[root@mycon32 ~]# passwd
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@mycon32 ~]# exit
logout
Container mycon32 exited successfully.
[root@hoge srv]# systemd-nspawn -b --network-bridge=virbr0 -D /var/lib/machines/mycon32 --personality=x86
Spawning container mycon32 on /var/lib/machines/mycon32.
Press ^] three times within 1s to kill container.
Failed to create directory /var/lib/machines/mycon32//sys/fs/selinux: No such file or directory
Failed to create directory /var/lib/machines/mycon32//sys/fs/selinux: No such file or directory
systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization systemd-nspawn.
Detected architecture x86.

Welcome to CentOS 7 (AltArch)!

Initializing machine ID from random generator.
Cannot add dependency job for unit display-manager.service, ignoring: Unit not found.
[  OK  ] Reached target Remote File Systems.
[  OK  ] Created slice Root Slice.
...
[  OK  ] Reached target Login Prompts.
[  OK  ] Started Cleanup of Temporary Directories.
[  OK  ] Started Login Service.

CentOS 7 (AltArch)
Kernel 3.10.0-514.26.2.el7.x86_64 on an i686

mycon32 login: root
Password: 
[root@mycon32 ~]# uname -a
Linux mycon32 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 i686 i686 i386 GNU/Linux
[root@mycon32 ~]# 
ネットワークは、virbr0 を割り当てましたので、コンテナ内の設定をします。インターフェースは host0 に見えます。
[root@mycon32 ~]# ifconfig host0
host0: flags=4098  mtu 1500
        ether 26:b3:01:6e:42:98  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@mycon32 ~]# touch /etc/sysconfig/network
[root@mycon32 ~]# vi /etc/sysconfig/network-scripts/ifcfg-host0 
...
[root@mycon32 ~]# cat /etc/sysconfig/network-scripts/ifcfg-host0 
#
# network-scripts/ifcfg-host0
#
DEVICE=host0
ONBOOT=yes
BOOTPROTO=dhcp
USERCTL=no
NM_CONTROLLED=no
[root@mycon32 ~]# ifup host0

Determining IP information for host0... done.
[root@mycon32 ~]# ifconfig host0
host0: flags=4163  mtu 1500
        inet 192.168.122.25  netmask 255.255.255.0  broadcast 192.168.122.255
        inet6 fe80::24b3:1ff:fe6e:4298  prefixlen 64  scopeid 0x20
        ether 26:b3:01:6e:42:98  txqueuelen 1000  (Ethernet)
        RX packets 14  bytes 1251 (1.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12  bytes 1416 (1.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@mycon32 ~]# 
あとは、必要なものを入れ放題です。
[root@mycon32 ~]# yum check-update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

audit-libs.i686                         2.6.5-3.el7_3.1                  updates
bash.i686                               4.2.46-21.el7_3                  updates
bind-libs-lite.i686                     32:9.9.4-38.el7_3.3              updates
bind-license.noarch                     32:9.9.4-38.el7_3.3              updates
ca-certificates.noarch                  2017.2.14-70.1.el7_3             updates
chkconfig.i686                          1.7.2-1.el7_3.1                  updates
device-mapper.i686                      7:1.02.135-1.el7_3.5             updates
device-mapper-libs.i686                 7:1.02.135-1.el7_3.5             updates
dracut.i686                             033-463.el7_3.2                  updates
expat.i686                              2.1.0-10.el7_3                   updates
gawk.i686                               4.0.2-4.el7_3.1                  updates
glibc.i686                              2.17-157.el7_3.4                 updates
glibc-common.i686                       2.17-157.el7_3.4                 updates
initscripts.i686                        9.49.37-1.el7_3.1                updates
kpartx.i686                             0.4.9-99.el7_3.3                 updates
krb5-libs.i686                          1.14.1-27.el7_3                  updates
libblkid.i686                           2.23.2-33.el7_3.2                updates
libgcrypt.i686                          1.5.3-13.el7_3.1                 updates
libmount.i686                           2.23.2-33.el7_3.2                updates
libnetfilter_conntrack.i686             1.0.6-1.el7_3                    updates
libsemanage.i686                        2.5-5.1.el7_3                    updates
libuuid.i686                            2.23.2-33.el7_3.2                updates
nspr.i686                               4.13.1-1.0.el7_3                 updates
nss.i686                                3.28.4-1.2.el7_3                 updates
nss-sysinit.i686                        3.28.4-1.2.el7_3                 updates
nss-tools.i686                          3.28.4-1.2.el7_3                 updates
nss-util.i686                           3.28.4-1.0.el7_3                 updates
openssh.i686                            6.6.1p1-35.el7_3                 updates
openssh-clients.i686                    6.6.1p1-35.el7_3                 updates
openssl-libs.i686                       1:1.0.1e-60.el7_3.1              updates
systemd.i686                            219-30.el7_3.9                   updates
systemd-libs.i686                       219-30.el7_3.9                   updates
tzdata.noarch                           2017b-1.el7                      updates
util-linux.i686                         2.23.2-33.el7_3.2                updates
vim-minimal.i686                        2:7.4.160-1.el7_3.1              updates
[root@mycon32 ~]# 
とても軽量(起動/停止が速い、KVM のようなオーバーヘッドが殆どない)で、非常に快適です。

2017-07-09追記、自動起動の設定方法
Arch Linux の wiki を参考にさせてもらいました。ありがたや!
https://wiki.archlinuxjp.org/index.php/Systemd-nspawn
[root@hoge ~]# systemctl enable machines.target
[root@hoge ~]# systemctl enable [email protected]
コンテナ mycon32 の起動パラメータをカスタマイズするには、次のようにします。
[root@hoge ~]# env SYSTEMD_EDITOR=vim systemctl edit systemd-nspawn@mycon32    ★これで vim が立ち上がります
...
[root@hoge ~]# cat /etc/systemd/system/[email protected]/override.conf
[Unit]
After=multi-user.target    ★ここがミソ(秘密の裏技?)です。これをしないと virbr0 の初期化より先にstartされ、起動に失敗します
                           ★network-online.target というのもあり、字面はそちらのほうが適切そうですが、うまく行きませんでした
[Service]
ExecStart=    ★バカバカしいですが、この行も必要なのです。なんでやねん
ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-bridge=virbr0 --machine=%I --personality=x86
再起動後の様子です。コンテナ内に sshd を立てておけば、ホスト側から ssh 接続できるので便利かと思います。
[root@hoge ~]# machinectl  
MACHINE CLASS     SERVICE
conf256 container nspawn    ちなみにこちらは、同様にして作成した fedora25 が入ったコンテナです
mycon32 container nspawn 

2 machines listed.
[root@hoge ~]# machinectl status mycon32
mycon32
           Since: Sun 2017-07-09 09:58:29 JST; 41min ago
          Leader: 5489 (systemd)
         Service: nspawn; class container
            Root: /var/lib/machines/mycon32
           Iface: virbr0
         Address: 192.168.122.25
                  fe80::24b3:1ff:fe6e:4298%5
              OS: CentOS 7 (AltArch)
            Unit: [email protected]
                  |-5471 /usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-bridge=virbr0 --machine=mycon32 --personality=x86
                  |-5489 /usr/lib/systemd/systemd
                  `-system.slice
                    |-console-getty.service
                    | `-5721 /sbin/agetty --noclear --keep-baud console 115200 38400 9600 vt220
                    |-sshd.service
                    | `-5718 /usr/sbin/sshd -D
                    |-network.service
                    | `-6376 /sbin/dhclient -H mycon32 -1 -q -lf /var/lib/dhclient/dhclient--host0.lease -pf /var/run/dhclient-host0.pid host0
                    |-dbus.service
                    | `-5694 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
                    |-systemd-logind.service
                    | `-5687 /usr/lib/systemd/systemd-logind
                    `-systemd-journald.service
                      `-5599 /usr/lib/systemd/systemd-journald

Jul 09 09:58:30 hoge systemd-nspawn[5471]: Starting LSB: Bring up/down networking...
Jul 09 09:58:30 hoge systemd-nspawn[5471]: Starting OpenSSH server daemon...
Jul 09 09:58:30 hoge systemd-nspawn[5471]: [  OK  ] Started Permit User Sessions.
Jul 09 09:58:30 hoge systemd-nspawn[5471]: [  OK  ] Started Console Getty.
Jul 09 09:58:30 hoge systemd-nspawn[5471]: Starting Console Getty...
Jul 09 09:58:30 hoge systemd-nspawn[5471]: [  OK  ] Reached target Login Prompts.
Jul 09 09:58:30 hoge systemd-nspawn[5471]: [  OK  ] Started Login Service.
Jul 09 09:58:30 hoge systemd-nspawn[5471]: [  OK  ] Started OpenSSH server daemon.
Jul 09 09:58:36 hoge systemd-nspawn[5471]: CentOS 7 (AltArch)
Jul 09 09:58:36 hoge systemd-nspawn[5471]: Kernel 3.10.0-514.26.2.el7.x86_64 on an i686
[root@hoge ~]# ssh 192.168.122.25
[email protected]'s password: 
Last login: Sun Jul  9 09:32:39 2017 from gateway
[root@mycon32 ~]# 
[root@mycon32 ~]# exit
logout
Connection to 192.168.122.25 closed.
[root@hoge ~]# lsbond -va    注.自作スクリプトです
DEVICE     IPADDR           HWADDR             PCI          i Link    Mode
================================================================================
team1      192.168.1.5      F0:DE:F1:xx:xx:xx  n/a          . ok  activebackup 
  |  link_watches: ethtool  delay_up=0  
* eth0     .                F0:DE:F1:xx:xx:xx  00:19.0      . ok  1000Mb/s Full

vb-conf256 n/a              FE:57:A1:33:89:1B  n/a          . ok 10000Mb/s Full
vb-mycon32 n/a              96:24:34:0B:FF:29  n/a          . ok 10000Mb/s Full
virbr0     192.168.122.1    52:54:00:BE:C2:87  n/a          . ok       n/a    .
virbr0-nic n/a              52:54:00:BE:C2:87  n/a          d x          -    -
wlan0      n/a              4E:0E:C7:xx:xx:xx  03:00.0      d x          -    -
[root@hoge ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.525400bec287       yes             vb-conf256
                                                        vb-mycon32
                                                        virbr0-nic

2017-07-15追記、名前解決
/etc/nsswitch.conf に mymachines を追加すれば、コンテナ名で ssh できて便利になるようです。
[root@hoge ~]# grep mymachines /etc/nsswitch.conf
hosts:      files mdns4_minimal [NOTFOUND=return] dns myhostname mymachines
[root@hoge ~]# machinectl 
MACHINE CLASS     SERVICE
conf253 container nspawn 
conf256 container nspawn 
conf266 container nspawn 
mycon32 container nspawn 

4 machines listed.
[root@hoge ~]# ssh mycon32
root@mycon32's password: 
Last login: Tue Jul 11 20:43:01 2017 from gateway
[root@mycon32 ~]# 

2013年10月13日日曜日

kernel.pid_max の拡張

デスクトップ用途での Linux 利用では、不要と思いますが、少し大きなサーバ用途では pid の上限値を拡大しておいたほうが良いかもしれません。CentOS では /etc/sysctl.conf で設定します。
kernel.pid_max = 99999  ※デフォルト 32768、同時起動スレッド数も制限されるのでご注意を、、、
いくつまで拡張しておくかは用途次第ですが、pid を画面表示するようなツールで、くずれた表示の原因となるかもしれませんので、不足しなさそうなら、99999 (5桁、デフォルトの約3倍) にしておくと良いのではと思います。pid 管理はビットマップ方式で行われるので、pid_max を増やしてもメモリ消費はほとんどありません。
なお、最近のカーネルでは、サーバ規模に応じて自動的に拡張されるようなので、sysctl.conf に設定する前に、現在の値を確認したほうがいいです。それと、32bit 版では 32768 より大きい値は設定できません。いまどき、サーバで 32bit 版を使うことは少ないと思いますが。

2013-10-14追記
うろ覚えで”サーバ規模に応じて・・・”と書きましたが、CentOS 6 のカーネル 2.6.32-358.el6 を見てみたら、CPU 数が多い場合に拡張されるようになってました。kernel/pid.c の中です。CentOS 5 系のほうは、CPU 数に応じた自動拡張の処理は無いようでした。2.6.18-348.el5 参照。
CentOS 6 / RHEL6 のサーバ構築の際、闇雲に kernel.pid_max を設定すると、意図せず下方修正してしまうかもしれませんので、構築屋さんの方はお気をつけて。まあ、システム設計上下方修正な値で良いならよいわけでしょうけども。

2015-03-08追記
本日、マルチブート環境の FreeBSD 10.0 を 10.1 に upgrade したのですが、その際に、top を眺めていたら、FreeBSD の pid 範囲が 99999 までであるようでした。FreeBSD 付属の top では、どういう意図なのか last pid なる表示項目があり、そこを眺めていたら、99999 で wrap しました。トリビアですが、参考メモです。
補足:ZFS on Linux に強く興味を持っており、FreeBSD 実装との比較用に、マルチブート環境を作ってあります。なので、FreeBSD は殆ど使ってないです。現在は、デスクトップ利用なら CentOS 7 が最も使い易く感じています。systemd のおかげで起動が抜群に速いし。

2016-06-11追記
レッドハットのナレッジに、RHEL6 の pid_max 自動拡張の話しが説明してありましたので、リンク張っておきます。
https://access.redhat.com/solutions/28908
https://access.redhat.com/solutions/874023
CPU 数が 32 より大きいと、1024 x CPU 数 に拡張されますよと。

2019-01-30追記
kernel.pid_max が 99999 以下でないとマズいというソフトウェア (GUARDIANWALL) が実際にあった。
https://security-support.canon-its.jp/info_and_news/show/10?site_domain=GUARDIANWALL
まあ、明日は我が身と気を付けよう。

2013年7月11日木曜日

Btrfs の resize

別記事で Btrfs 化について書きましたが、実験環境とは別に 20G のパーティションに別途 Fedora19 をインストール済みでしたので、これを 10G に縮小する操作を行ってみました。Btrfs は未だ開発途上という状況なので、最悪の場合は、ぶっ壊れるかもねという心象がありますが、まあ、壊れてもさしてダメージが無い環境なので。

縮小操作は、man btrfs の通りで、いたって簡単でした。
# btrfs filesystem resize 9g /
システムデータしか入ってないこともあり、処理は殆ど一瞬で終わりました。サイズ指定は、いったん 9g にしていますが、パーティションを 10G に縮小後に、パーティションサイズまで resize するために、適当に 1G ほど余裕をとりました。
パーティション縮小は fdisk -u で行い、システム再起動後に次のように操作を行いました。
# btrfs filesystem resize max /
Resize '/' of 'max'

# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda10      10240000 2441692   6037316  29% /
devtmpfs         4011116       0   4011116   0% /dev
tmpfs            4017612     156   4017456   1% /dev/shm
tmpfs            4017612     780   4016832   1% /run
tmpfs            4017612       0   4017612   0% /sys/fs/cgroup
tmpfs            4017612      44   4017568   1% /tmp

# btrfs filesystem balance /
Done, had to relocate 7 out of 7 chunks

# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda10      10240000 2442728   7569272  25% /
devtmpfs         4011116       0   4011116   0% /dev
tmpfs            4017612     156   4017456   1% /dev/shm
tmpfs            4017612     780   4016832   1% /run
tmpfs            4017612       0   4017612   0% /sys/fs/cgroup
tmpfs            4017612      48   4017564   1% /tmp
balance という操作が肝で、これを行わないと、空きが少なく見えます(たぶん、balance しなくても、逼迫してくれば使われるのかな??)。

2019-11-16追記
Btrfs raid1 のサイズ拡張を行ったのですが、前述の balance 操作ではダメでした。検索してみると、先人の方がおられましたのでメモ。
https://qiita.com/takaki@github/items/5d96d80dc78b09ea600b
明示的に devid を指定することで、うまくいきました。実施した環境は CentOS7 です。
man btrfs-filesystem を読んでみると、デフォルトの devid は 1 であると記載あるようです。むしろ、devid 指定必須のほうが、分かり易いのではと思ってしまった。先人の方の情報に辿りつくまで、無駄に時間を使ってしまいました。最初から man をちゃんと読めばよかったというのもありますが。

2013年7月7日日曜日

Fedora19 のルートファイルシステムを Btrfs 化する

先日、Fedora19 が正式リリースされましたが、1パーティションに btrfs でインストールしたいと思ったのですが、インストーラでは指定できないようでした。何回か試行錯誤しましたが、まず ext4 でインストールしておいて、そのあと Live メディアから起動して、内容をバックアップして、mkfs.btrfs 後に書き戻すという方法で成功しましたので、自分用のメモも兼ねてご紹介です。

今回は、まっさらな SSD を使って、sda1 にインストールしました。インストーラからパーティションを切っても問題ないと思いますが、事前に 10G ほど sda1 を確保してからインストールしました。10G とは小さめですが、btrfs の透過圧縮機能をあてにしたサイズです。わたしの場合、これまでは Fedora を ext4 に入れるとしたら 20G くらいは割り当てていましたが、圧縮機能があれば半分の 10G くらいでも、わたしの用途では十分かなと。
ソフトウェアの選択を Development and Creative Workstation にして、ext4 にインストールした直後だと、約6G ほど消費した状態でした。

btrfs 化は、ライブメディア Fedora-Live-Desktop-x86_64-19-1.iso を利用して、次のように行いました。
※まずは、ライブメディアを起動して、ターミナルを開く
※root 権限を得る
# sudo bash

※ext4 のバックアップツールとして dump をインストール
# yum install dump

※別の HDD 等にバックアップを行う。わたしの場合は別の ext4 領域を使いました。
# mkdir /mnt_sdb1
# mount /dev/sdb1 /mnt_sdb1
# dump -y -0uf /mnt_sdb1/dump.sda1 /dev/sda1  ※ここで -y は LZO 圧縮するオプションです

※btrfs ファイルシステム作成
# mkfs.btrfs -f /dev/sda1

※バックアップデータを書き戻す
# mkdir /mnt_sda1
# mount -t btrfs -o compress-force=lzo /dev/sda1 /mnt_sda1
# cd /mnt_sda1
# restore -rf /mnt_sdb1/dump.sda1

※/etc/fstab に書かれている UUID とファイルシステム種別等を書き換える
# cd /mnt_sda1
# blkid /dev/sda1
/dev/sda1: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" UUID_SUB="yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" TYPE="btrfs"
# vi etc/fstab
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / btrfs defaults,compress-force=lzo 1 1

※initramfs の再作成と GRUB2 の再インストールのため環境設定
# mount -t devtmpfs devtmpfs /mnt_sda1/dev
# mount -t devpts devpts /mnt_sda1/dev/pts
# mount -t sysfs sysfs /mnt_sda1/sys
# mount -t proc proc /mnt_sda1/proc

※initramfs の再作成
# chroot /mnt_sda1 /bin/bash
# ls /boot/initramfs-3*  
/boot/initramfs-3.9.5-301.fc19.x86_64.img  ※カーネルバージョン確認
# dracut -f /boot/initramfs-3.9.5-301.fc19.x86_64.img  3.9.5-301.fc19.x86_64

※GRUB2 の再インストール
# grub2-mkconfig > /boot/grub2/grub.cfg
# grub2-install /dev/sda
# exit  ※chroot を抜ける
# 
ライブ DVD を抜けて、sda から起動できれば成功です。 現在の私の環境での、ディスク空き状況は次の通りです。
# cat /etc/redhat-release 
Fedora release 19 (Schrödinger’s Cat)
# df -kT /
Filesystem     Type  1K-blocks    Used Available Use% Mounted on
/dev/sda1      btrfs  10240000 3888960   5950044  40% /

2013-07-08追記
btrfs は swapfile には対応していないそうなので、ご注意を。
https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F
実際、fallocate , mkswap までは出来ますが、swapon でエラー(invalid argument)になるようです。わたしのマシンはメモリを 8G 積んでおり、swap の必要性を感じませんので、swap レスでいいやと思いましたが、用途によっては zram を使ってもいいかもしれません。
もちろん、別途swapパーティションを作ってもいいわけですが。

2013-10-12追記
まだアルファ版ですが、Fedora 20 でもインストール時には btrfs は指定できず、上記の手順でいけました。

2013-12-07追記
CentOS 6.5 でも、同様の手順で出来ました。Btrfs は RHEL 6.5 においても、まだ Technology Preview 扱いとなっており、安定性がクエスチョンですが、SSD の節約に compress-force=lzo が役立ちます。

2014-04-27追記
RHEL7 beta をインストールしたのですが、やはりインストーラからは btrfs を指定できず。Fedora 19/20 と同様に、いったん ext4 でインストールしたあとに btrfs 化しました。
ただし、今回は試しに btrfs-convert を使ってみました。使い方はいたって簡単で、レスキューモードで起動後に、ext4 としてインストールしたパーティションを指定して実行するだけです。あっという間に変換が完了します。変換すると UUID が変わってしまうので、この記事の手順の fstab の変更の箇所から同様に操作して、btrfs 化に成功しました。
compress-force=lzo を活用したければ、やはりバックアップからリストアしないといけませんが、透過圧縮を使わないなら btrfs-convert のほうが手っ取り早いかと思います。btrfs-convert の仕組みは、次の URL に解説があります。すごい、賢いです。
https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3
このように、変換前のイメージが、サブボリューム ext2_saved に保持される方式になっているので、btrfs-convert を利用した場合には、ext2_saved の削除をお忘れなく。

2013年6月11日火曜日

バックアップの暗号化運用手法

ZFS on Linux 上に、バックアップを採っているのですが、暗号化のため sparse ZVOL + cryptsetup + ext4 を使っていました。
しかし、ZVOL 直上の ext4 ならば fstrim が使えるのですが、cryptsetup を挟んだ場合は fstrim を利用できず、使いまわしていると、ZVOL が肥大化してしまいます。ZVOL を再作成するという運用もできますが、ZVOL の解放 (zfs destroy) に結構な時間がかかるようです。わたしの環境では、100GiB 解放するのに 7 分程度かかるようでした。

というわけで、別の方法に切り替えることにしました。

いろいろと調べ、考えた挙句に辿りついた方式は、sparse file + losetup + cryptsetup + xfs です。 sparse file の作成には、truncate コマンドが利用できます。操作手順は、次のようになります。
# truncate -s $((65*1024*1024*1024)) /tank1/backup/vault-2013-06-11
# losetup /dev/loop0 /tank1/backup/vault-2013-06-11
# cryptsetup create -y vault-2013-06-11 /dev/loop0
# mkfs -t xfs /dev/mapper/vault-2013-06-11
# mkdir /mnt_vault-2013-06-11
# mount /dev/mapper/vault-2013-06-11 /mnt_vault-2013-06-11
ファイルシステムには、mkfs が高速で、スペース効率が良い xfs を使うことにしました。
わたしの当該バックアップ運用では、1回のバックアップデータ量が 60GiB ほどで、過去3世代保存できればよいので、毎回、上記操作で 65GiB の暗号化スペースを作って利用することにしました。
なお、バックアップ後には、次の操作を行います。
# umount /mnt_vault-2013-06-11
# cryptsetup remove /dev/mapper/vault-2013-06-11
# losetup -d /dev/loop0
比較的多くのコマンドを、順序を違えずに実行する必要があり、実際やってみると誤操作しがちでしたので、簡単な支援スクリプトを3つ作成しました。ご参考まで。
#!/bin/bash
#
# Name: my-vault-setup
#
# Authors: luna2 <blue3waters at gmail dot com>
#
# This file is subject to the GNU General Public License.
# It comes with NO WARRANTY.
#

usage_exit() {
        echo "Usage: my-vault-setup [-d dir] [-t fs-type] size" 1>&2
        exit 1
}

FS_TYPE=xfs
TARGET_DIR=.

while getopts ":d:t:" opt
do
  case $opt in
  d)
        TARGET_DIR=${OPTARG%/}
        ;;
  t)
        FS_TYPE=$OPTARG
        ;;
  *)    usage_exit
  esac
done

shift $((OPTIND - 1))

if [ $# -ne 1 ] ; then
        usage_exit
elif expr "$1" : '[0-9]*' > /dev/null ; then
        TARGET_SIZE=$1
else
        usage_exit
fi

if [ ! -d $TARGET_DIR ] ; then
        usage_exit
fi

TARGET_NAME=vault-`date +%F-%H%M`
TARGET=$TARGET_DIR/$TARGET_NAME

echo "TARGET=$TARGET  SIZE=$TARGET_SIZE (GiB)"

truncate -s $((${TARGET_SIZE}*1024*1024*1024)) $TARGET
if [ $? -ne 0 ] ; then
        echo "ERROR: truncate fail" 1>&2
        exit 1
fi

losetup -f $TARGET
if [ $? -ne 0 ] ; then
        echo "ERROR: losetup fail" 1>&2
        exit 1
fi

LOOP_DEV=`losetup -j $TARGET | egrep -o '/dev/loop[0-9]+'`

echo "LOOP_DEV=$LOOP_DEV"

cryptsetup create -y $TARGET_NAME $LOOP_DEV
if [ $? -ne 0 ] ; then
        echo "ERROR: cryptsetup fail" 1>&2
        exit 1
fi

mkfs -t $FS_TYPE /dev/mapper/$TARGET_NAME >/dev/null 2>&1
if [ $? -ne 0 ] ; then
        echo "ERROR: mkfs fail" 1>&2
        exit 1
fi

mkdir /mnt_$TARGET_NAME
mount /dev/mapper/$TARGET_NAME /mnt_$TARGET_NAME
if [ $? -ne 0 ] ; then
        echo "ERROR: mount fail" 1>&2
        exit 1
fi

echo "/mnt_$TARGET_NAME is usable for your backup"

exit 0
#!/bin/bash
#
# Name: my-vault-umount
#
# Authors: luna2 <blue3waters at gmail dot com>
#
# This file is subject to the GNU General Public License.
# It comes with NO WARRANTY.
#

usage_exit() {
        echo "Usage: my-vault-umount target_dir" 1>&2
        exit 1
}

if [ $# -ne 1 ] ; then
        usage_exit
fi

TARGET=${1%/}

if [[ $TARGET != /mnt_vault-* ]] ; then
        usage_exit
fi

TARGET_NAME=${TARGET#/mnt_}

if ! grep -wq $TARGET /proc/mounts ; then
        echo "ERROR: $TARGET is not a mount point" 1>&2
        exit 1
fi

umount $TARGET
if [ $? -ne 0 ] ; then
        echo "ERROR: umount fail" 1>&2
        exit 1
fi

LOOP_DEV=`cryptsetup status /dev/mapper/$TARGET_NAME | awk '$1 == "device:" {print $2}'`

cryptsetup remove /dev/mapper/$TARGET_NAME
if [ $? -ne 0 ] ; then
        echo "ERROR: cryptsetup fail" 1>&2
        exit 1
fi

VAULT_FILE=`losetup $LOOP_DEV | awk '{print $NF}'`
VAULT_FILE=${VAULT_FILE#(}
VAULT_FILE=${VAULT_FILE%)}

losetup -d $LOOP_DEV
if [ $? -ne 0 ] ; then
        echo "ERROR: losetup fail" 1>&2
        exit 1
fi

rmdir $TARGET

echo "$VAULT_FILE was locked"

exit 0
#!/bin/bash
#
# Name: my-vault-mount
#
# Authors: luna2 <blue3waters at gmail dot com>
#
# This file is subject to the GNU General Public License.
# It comes with NO WARRANTY.
#

usage_exit() {
        echo "Usage: my-vault-mount vault_file" 1>&2
        exit 1
}

if [ $# -ne 1 ] ; then
        usage_exit
fi

TARGET=$1
if [ ! -f $TARGET ] ; then
        usage_exit
fi

TARGET_NAME=${TARGET##*/}

losetup -f $TARGET
if [ $? -ne 0 ] ; then
        echo "ERROR: losetup fail" 1>&2
        exit 1
fi

LOOP_DEV=`losetup -j $TARGET | egrep -o '/dev/loop[0-9]+'`

echo "LOOP_DEV=$LOOP_DEV"

cryptsetup create $TARGET_NAME $LOOP_DEV
if [ $? -ne 0 ] ; then
        echo "ERROR: cryptsetup fail" 1>&2
        exit 1
fi

mkdir /mnt_$TARGET_NAME
mount /dev/mapper/$TARGET_NAME /mnt_$TARGET_NAME
if [ $? -ne 0 ] ; then
        echo "ERROR: mount fail" 1>&2
        exit 1
fi

echo "/mnt_$TARGET_NAME is usable"

exit 0

2013-06-22追記
上に書いたバックアップ運用に加えて、圧縮処理について、最終格納先 ZFS の透過圧縮 (compression=on) に期待するとうまく行きません。暗号化後のデータは圧縮しにくいためです。そこで、dm-crypt デバイスの上で使うファイルシステムを xfs から Btrfs に変更して、compress=lzo オプションで圧縮を試みました。しかし、残念ながら現状の Btrfs では全くといっていいほど圧縮できませんでした(圧縮オプションを zlib に変えても結果は同じ)。
他に透過圧縮できるファイルシステムは何があるだろ?とサーチしてみて、ntfs-3g でも透過圧縮できるようなので、試してみました。
# mkntfs -Q -C /dev/mapper/vault-xxx
# mount -t ntfs -o compression /dev/mapper/vault-xxx /mnt
# mkdir /mnt/compress_folder
# setfattr -h -v 0x10080000 -n system.ntfs_attrib /mnt/compress_folder
ntfs-3g の場合、こんな具合にセットアップするようです。実際動かしてみると、圧縮はそこそこ出来たのですが、処理スピードは相当に遅めでした。Windows で NTFS 圧縮した経験からも遅いだろうとは予想してましたが、ちょっと、自分の運用には耐えらないほど遅かったです。

2013-06-23追記
ZFS 二段重ねは重いような気がしてましたが、dm-crypt デバイス上で使うファイルシステムも ZFS にして、compression=lz4 を使うとなかなか良好な結果でした。一時もうそれで十分と思いましたが、さらに調べたところ、Btrfs には compress-force というオプションもあることを知りました。試してみると、ZFS 二段重ねよりも高速に処理可能で、compress-force=zlib が最も良好な結果(処理時間が短くて圧縮率高い)でした。compress-force=lzo も試しましたが、処理時間はさほど短くならず、圧縮率も ZFS (compression=lz4) より下でした。なお、Btrfs (compress-force=zlib) の圧縮率は、ZFS (compression=gzip-1) とほぼ同じでした。
以上から、Btrfs (compress-force=zlib) を利用しようかと思います。初めて Btrfs に利点を感じました。

2013年5月31日金曜日

ZFS on Linux 0.6.1 の性能を OpenIndiana 151a7 と比較

ZFS on Linux を使い始めて約1年、始祖の Solaris 実装とどの程度性能が違うのか知りたくなり、試してみました。

Solaris 系は、初挑戦でしたが、インストールはさほど難しくなかった印象です。むしろ、その前準備(マルチブートのためのパーティション構成変更作業)に手間がかかりました。特に、ディスク先頭の Windows7 のパーティションをいじるのに苦労しました。実験に使ったマシンは ThinkPad T510 ですが、プリインストールされていた Windows7 環境では、C: の他にシステムパーティションと呼ばれる領域がもう1つ確保されていて、これを削除するのが手間でした。ZFS本(ISBN-13: 978-4048676540)によると、OpenSolaris は、基本パーティションにインストールする必要があるということで、Windows7 のシステムパーティションが邪魔になったのです。そこは本題ではないので、詳細は割愛しますが、最終的に次のようなパーティション構成となりました。

今回の測定環境は ThinkPad T510 + 古い SAMSUNG SSD (eSATA接続) です。
# zdb
tankM:
    version: 23
    name: 'tankM'
    state: 0
    txg: 194345
    pool_guid: 17978947249853082376
    hostid: 8323328
    hostname: 'my42'
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: 17978947249853082376
        children[0]:
            type: 'disk'
            id: 0
            guid: 2831835469869973055
            path: '/dev/disk/by-id/ata-SAMSUNG_MCCOE64G8MPP-0VA_SE809N0057-part1'
            phys_path: '/dev/ada1s1'
            whole_disk: 0
            metaslab_array: 24
            metaslab_shift: 29
            ashift: 12
            asize: 64017399808
            is_log: 0
            DTL: 73
            create_txg: 4
    features_for_read:
# zpool get all tankM
NAME   PROPERTY               VALUE                  SOURCE
tankM  size                   59.5G                  -
tankM  capacity               32%                    -
tankM  altroot                -                      default
tankM  health                 ONLINE                 -
tankM  guid                   17978947249853082376   local
tankM  version                23                     local
tankM  bootfs                 -                      default
tankM  delegation             on                     default
tankM  autoreplace            off                    default
tankM  cachefile              -                      default
tankM  failmode               wait                   default
tankM  listsnapshots          off                    default
tankM  autoexpand             off                    default
tankM  dedupditto             0                      default
tankM  dedupratio             1.00x                  -
tankM  free                   39.9G                  -
tankM  allocated              19.6G                  -
tankM  readonly               off                    -
tankM  ashift                 12                     local
tankM  comment                -                      default
tankM  expandsize             0                      -
tankM  freeing                0                      local
tankM  feature@async_destroy  disabled               local
tankM  feature@empty_bpobj    disabled               local
tankM  feature@lz4_compress   disabled               local
# zfs get all tankM -s local
NAME   PROPERTY              VALUE                  SOURCE
tankM  mountpoint            /tankM                 local
tankM  atime                 off                    local
zpool の構成は前記のとおりのシングル構成です。

SAMSUNG SSD の基本性能は次のような具合(Disk Utility のベンチマーク結果)です。

以下、bonnie++ 1.96 のデータです。

■CentOS 6.4
# uname -a
Linux xxxx 2.6.32-358.6.2.el6.x86_64 #1 SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
# bonnie++ -u root -d /tankM
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
xxxx         15464M   151  99 68485  12 40237   9   319  84 108505  11 910.6  26
Latency             73426us     146ms    1240ms     842ms     302ms     480ms
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 17826  84 +++++ +++  4228  29 19977  85 +++++ +++ 21914  96
Latency             31300us     332us   77141us   31685us      67us     912us
1.96,1.96,xxxx,1,1369835550,15464M,,151,99,68485,12,40237,9,319,84,108505,11,910.6,26,16,,,,,17826,84,+++++,+++,4228,29,19977,85,+++++,+++,21914,96,73426us,146ms,1240ms,842ms,302ms,480ms,31300us,332us,77141us,31685us,67us,912us

■OpenIndiana 151a7
# uname -a
SunOS xxxx 5.11 oi_151a7 i86pc i386 i86pc Solaris
# ./bonnie++ -u root -d /tankM
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
xxxx            16G   209  96 75797  12 42079  10   606  99 102241  10  2499  34
Latency             43718us     190ms    1469ms   18081us     545ms   45179us
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16  5706  15 +++++ +++ +++++ +++ 24358  53 +++++ +++ +++++ +++
Latency              1686ms     144us     102us    7317us      27us      92us
1.96,1.96,xxxx,1,1369836787,16G,,209,96,75797,12,42079,10,606,99,102241,10,2499,34,16,,,,,5706,15,+++++,+++,+++++,+++,24358,53,+++++,+++,+++++,+++,43718us,190ms,1469ms,18081us,545ms,45179us,1686ms,144us,102us,7317us,27us,92us

■FreeBSD 9.1
# uname -a
FreeBSD xxxx 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec  4 09:23:10 UTC 2012     [email protected]:/usr/obj/usr/src/sys/GENERIC  amd64
# bonnie++ -u root -d /tankM
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
xxxx            16G   174  99 69411  11 38889   7   414  91 104735   5  1040   8
Latency             50405us    3339ms    2989ms     628ms     620ms    1002ms
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 31430  95 +++++ +++ 16114  62 32265  96 +++++ +++  4389  93
Latency             13375us     118us     118ms   13380us     115us     447us
1.96,1.96,xxxx,1,1369838677,16G,,174,99,69411,11,38889,7,414,91,104735,5,1040,8,16,,,,,31430,95,+++++,+++,16114,62,32265,96,+++++,+++,4389,93,50405us,3339ms,2989ms,628ms,620ms,1002ms,13375us,118us,118ms,13380us,115us,447us

■Fedora18
# uname -a
Linux xxxx 3.9.3-201.fc18.x86_64 #1 SMP Tue May 21 17:02:24 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
# bonnie++ -u root -d /tankM
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
xxxx         15688M   149  95 74100  13 42477  10   362  87 108047  11 946.6  30
Latency             98607us     170ms    1224ms     733ms     433ms     621ms
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 13264  56 +++++ +++ 10665  70 19831  85 +++++ +++ 24615  94
Latency               310ms    7156us   49153us   39069us      80us     551us
1.96,1.96,xxxx,1,1369840982,15688M,,149,95,74100,13,42477,10,362,87,108047,11,946.6,30,16,,,,,13264,56,+++++,+++,10665,70,19831,85,+++++,+++,24615,94,98607us,170ms,1224ms,733ms,433ms,621ms,310ms,7156us,49153us,39069us,80us,551us

測ってみた感想としては、わたしの利用範囲においては、OpenIndiana , FreeBSD と比較して、Linux 実装のパフォーマンスは遜色ない(若干劣る程度)と感じました。ただ、普段使いは CentOS6 なのですが、最新カーネルの恩恵を受けられる Fedora18 のほうがパフォーマンス発揮できるようです。

Fedora, CentOS 等の iso イメージ格納庫、調査用ソース展開場所(主にカーネル)、自作開発ソース格納庫、バックアップイメージ格納庫、KVM ゲスト用ディスク割り当て(スパース zvol)が、わたしの現在の用途です。

本格的に使っている zpool の形態は、RAIDZ(HDDx4 , バックアップ, iso格納用)、RAIDZ2(HDDx6+zram(L2ARC), ソースコード格納用)、mirror+stripe(HDDx2+HDDx2+SSDx2(ZIL&L2ARC), 大容量バックアップ用NFS)、HW-RAID上のシングル(KVM ゲスト向けzvol切り出し用)といったところです。すっかり、どっぷりと使っています。
仕事では、SAN ストレージ+multipath+LVM2+ext4 領域も使っていますが、ZFS と比べて、運用・操作性が格段にヤヤコシイく感じます。

■関連記事
3つのOSでZFSの性能を比較

2011年12月24日土曜日

Fedora 16 で久々に Xen を試してみる

KVM の登場で、ほとんど触ることが無くなっていた Xen ですが、Linux 3.0 以降で Dom0 動作可能になっており、Fedora 16 なら簡単に Xen を動かせるので、試してみました。

■準備
yum install xen を実行して、Xen 関連のパッケージを導入します。grub2 のメニューは、自動で追加されるので、特に何もすることはなく、導入は簡単でした。再起動して、
Linux, with Xen 4.1 and Linux 3.1.2-1.fc16.x86_64
このように with Xen 4.1 がついたメニューを選択して起動すれば OK でした。

■実験内容
ホストには Fedora 16 x86_64 、ゲストには CentOS 6.2 x86_64 を使い、Xen 準仮想化、Xen 完全仮想化、KVM の3つの場合で、パフォーマンスがどの程度違うものかを比較。ハードは、ThinkPad X301 (Core2 Duo U9400 1.40GHz) です。
個人設備の関係上、ディスク性能が貧弱なため、ベンチマークには姫野ベンチを使いました。
なお、CentOS 6 では、DomU 用カーネルというのは無いので、カーネルの種類を切り替えるようなことはしなくて済みます。CentOS 5 の場合は、準仮想化で動くには xen カーネルを使う必要がありましたし、CentOS 4 では xenU カーネルを使う必要がありました。

■実験結果
単位MFLOPS
 84.511594  Xen 完全仮想化 ゲスト (CentOS 6.2 x86_64)
 86.336558  Xen 準仮想化 ゲスト   (CentOS 6.2 x86_64)
 96.247089  Xen Dom0   (Fedora16 x86_64、ゲストとは OS 環境が異なります)
106.986019  KVM ゲスト (CentOS 6.2 x86_64)
101.272400  KVM ホスト (Fedora16 x86_64、ゲストとは OS 環境が異なります)
姫野ベンチの結果のみですが、KVM のほうがパフォーマンス (CPU, メモリ周り) が良いという結果になりました。

■所感
ベンチを実行する前の段階で、体感上 Xen のほうがもっさりしていると感じました。普段、ネイティブ環境 (KVM ホスト側) で作業して、たまに仮想マシンを使うという私の利用形態だと、わざわざ性能劣化した Dom0 で通常作業はしたくないですし、Xen のメリットは全く無いという感想を持ちました。また個人的に Xen で気になる点として、Dom0 上で標準の性能ツール (sar 等) を採取しても、Xen ゲストの性能データを得られない点が挙げられます。KVM であれば、ホスト側の sar には、ゲストの値も計上されます。また、KVM ゲストは、KVM ホストからはプロセスに見えるため、top コマンドでも、KVM ゲスト毎の負荷状況を簡単にモニターできます。

■個人的結論
現時点で、Xen を使うメリットは全くないと感じました。Hyper-V のハイパーバイザー部分は Xen と共有しているそうですし、Oracle VM も Xen ベースだとのこと。それらがいくらチューニングしようとも、KVM よりもレイヤーが厚い分だけ、性能面で不利なのではないかと思われます。

2012-02-19追記
古い VT(CPUの仮想化支援機能)非対応のPC(P4 3.6G)を再利用しようとして、そんな時には Xen が役立つと再認識しました。Fedora 16 で (KVM無しの) QEMU を試しましたが、実用的に使うには無理がありました。QEMU では、ゲストが起動するのに 30 分かかるのが、Xen であれば許せる時間内(数分)でゲスト起動できました。

2011年11月27日日曜日

mawk は確かに速い(2倍くらい)

AWK Users JP の次の記事を読んで、手持ちのよく使う awk スクリプトを mawk で実行してみたところ、確かに速かったです。軒並み2倍速かった。

awk のパフォーマンス

試しは、Fedora 16 上で行いましたが、常用している CentOS 5 (or RHEL5) でも簡単に利用できるかどうか EPEL を見てみたら、有難いことに提供されてました。
というわけで、まず、インストールを。
[root@centos5 ~]# uname -a
Linux centos5 2.6.18-274.7.1.el5 #1 SMP Thu Oct 20 16:21:01 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
[root@centos5 ~]# yum install mawk --enablerepo=epel
Loaded plugins: downloadonly, fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.jaist.ac.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mawk.x86_64 0:1.3.4-5.20100625.el5 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================
 Package         Arch              Version                          Repository       Size
==========================================================================================
Installing:
 mawk            x86_64            1.3.4-5.20100625.el5             epel            104 k

Transaction Summary
==========================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 104 k
Is this ok [y/N]: y
Downloading Packages:
mawk-1.3.4-5.20100625.el5.x86_64.rpm                               | 104 kB     00:00     
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : mawk                                                               1/1 

Installed:
  mawk.x86_64 0:1.3.4-5.20100625.el5                                                      

Complete!
[root@centos5 ~]# 

次のテスト用の awk スクリプトは、a から zzzz までの文字列 (Linux の SCSI ディスク名の sdXX の XX 部分に使われている) を出力するものです。適度に重いかと。。
#
# Note: This awk script prints
#       a, b, ... z, aa, ab, ... zz, aaa, aab, ... zzz
#
function get_sdstr(n,   r,ret) {
        for (;;) {
                if (n <= 26) {
                        return letter[n]""ret

                } else {
                        r = n % 26 ; r = r ? r : 26
                        ret = letter[r]""ret
                        n = (n-r)/26
                }
        }
}

BEGIN {
        for (i=1; i <= 26; i++) {
                letter[i] = substr("abcdefghijklmnopqrstuvwxyz",i,1)
        }

        for (i=1; i <= (26+26*26+26*26*26+26*26*26*26); i++) {
                print get_sdstr(i)
        }
        exit(0)
}
これを、gawk と mawk でそれぞれ実行して、/usr/bin/time でパフォーマンス測定した結果が、次の通りです。
[root@centos5 ~]# md5sum test.awk 
ee228358d1513e48e0495e1e79f3956c  test.awk
[root@centos5 ~]# rpm -q gawk
gawk-3.1.5-14.el5
[root@centos5 ~]# rpm -q mawk
mawk-1.3.4-5.20100625.el5
[root@centos5 ~]# 
[root@centos5 ~]# /usr/bin/time gawk -f ./test.awk | md5sum
3.43user 0.01system 0:03.47elapsed 99%CPU (0avgtext+0avgdata 3824maxresident)k
0inputs+0outputs (0major+279minor)pagefaults 0swaps
a9de67bf77dec1b5285ee27f71ab3564  -
[root@centos5 ~]# 
[root@centos5 ~]# /usr/bin/time mawk -f ./test.awk | md5sum
1.48user 0.00system 0:01.49elapsed 99%CPU (0avgtext+0avgdata 2976maxresident)k
0inputs+0outputs (0major+220minor)pagefaults 0swaps
a9de67bf77dec1b5285ee27f71ab3564  -
このように、2倍くらい速いです。
まあ、処理内容によるでしょうけど、わたしが日頃使う手持ちスクリプトは軒並み2倍速かったので、これからは有難く常用させてもらおうと思います。作者さん&メンテナー様に感謝。

EPEL の使い方については、次の記事を参照ください。
CentOS 6 で ntfs をマウントする
なお、CentOS 6 (or RHEL6) 用の EPEL チャネルにも mawk ありました。

gawk で性能足りないということがあったら、最後の切り札に使える場合があるかも。ただし、GNU 拡張等、互換性に注意する必要がある。

2011年11月5日土曜日

経過時間の計測方法

最近、スクリプト言語の恩恵により、C で書く機会というのは滅多にないのですが、ふと経過時間測定のための bash 用 builtin を書きたいと思い、その基礎として、現在の Linux で利用できるインタフェースについて調べました。

わたしの過去の C プログラミング経験 (某UNIX,10年くらい前) では、経過時間の計測には gettimeofday() を使っていました。たぶんそれしか無かった (?) ので。
しかし、その場合、システム時間が遡ってしまう可能性 (システム管理者が日時設定する時など) を考慮する必要があります。
2011-11-06追記、省みると、その当時,その UNIX でも times() はあったでしょうから、わたしが無知だったということですね。wrap への考慮は必要としても。

調べてみると、現在の Linux であれば、clock_gettime(CLOCK_MONOTONIC,) を使えば良さそうだと知りました。
このシステムコールを使えば、システム起動からの経過時間を高精度で得られるようです。
つまり、(カーネルソースまで調べてないですが、おそらくは) /proc/uptime の左側数字の情報源を高精度で得られます。
これなら、システム時刻が遡るタイミングであっても、経過時間を高精度で計測できます。
よく、times() システムコールの戻り値を、経過時間の計測に使ってバグっている (wrap のタイミングで) のを見かけますが、こちらを使えば、そんなバグも作らずに済みそうです。(Solaris やら HP-UX も対応しようとして、共通に使えるものを探した結果そうなるのでしょうけど … )

以下が、サンプルプログラムです。コンパイル時には、librt をリンクするため、リンクオプション -lrt を付加する必要があります。
/*
    gcc -o monotonic monotonic.c -lrt
*/
#include <time.h>
#include <stdio.h>

main()
{
        struct timespec tp ;
        clock_gettime(CLOCK_MONOTONIC, &tp) ;
        printf("%llu %llu\n", tp.tv_sec, tp.tv_nsec) ;
}
実行結果は次の通りです。
# cat /etc/redhat-release 
CentOS release 5.7 (Final)
# uname -a
Linux xxx 2.6.18-274.3.1.el5 #1 SMP Tue Sep 6 20:13:52 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
# gcc -o monotonic monotonic.c -lrt
# ./monotonic ; cat /proc/uptime 
10714 102582089
10714.10 10559.35
このように、/proc/uptime の値が高精度で得られている様子が見えます。

2011-11-06追記
実際に、clock_gettime(CLOCK_MONOTONIC) を呼び出す bash ビルトインを自作してみました。次の記事を参照ください。

ビルトインを自作して、bash で処理時間をミリ秒単位で計測

2011-11-12追記
ソースから、/proc/uptime と clock_gettime(CLOCK_MONOTONIC) の情報源が同じであることを確かめました。参照したのは、kernel-2.6.18-274.el5 です。
まず、/proc/uptime は次のようになっています。
     97 static int uptime_read_proc(char *page, char **start, off_t off,
     98                                  int count, int *eof, void *data)
     99 {
    100         struct timespec uptime;
    101         struct timespec idle;
    102         int len;
    103         cputime_t idletime = cputime_add(init_task.utime, init_task.stime);
    104 
*   105         do_posix_clock_monotonic_gettime(&uptime);
    106         cputime_to_timespec(idletime, &idle);
    107         len = sprintf(page,"%lu.%02lu %lu.%02lu\n",
    108                         (unsigned long) uptime.tv_sec,
    109                         (uptime.tv_nsec / (NSEC_PER_SEC / 100)),
    110                         (unsigned long) idle.tv_sec,
    111                         (idle.tv_nsec / (NSEC_PER_SEC / 100)));
    112 
    113         return proc_calc_metrics(page, start, off, count, eof, len);
    114 }
"fs/proc/proc_misc.c"
105行目の do_posix_clock_monotonic_gettime() は、もう名前からして、clock_gettime(CLOCK_MONOTONIC) に対応していそうですが、その通りです。
    114 #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
"include/linux/time.h"
    157 /*
    158  * Call the k_clock hook function if non-null, or the default function.
    159  */
*   160 #define CLOCK_DISPATCH(clock, call, arglist) \
    161         ((clock) < 0 ? posix_cpu_##call arglist : \
    162          (posix_clocks[clock].call != NULL \
    163           ? (*posix_clocks[clock].call) arglist : common_##call arglist))
...
    218 /*
    219  * Get monotonic time for posix timers
    220  */
    221 static int posix_ktime_get_ts(clockid_t which_clock, struct timespec *tp)
    222 {
*   223         ktime_get_ts(tp);
    224         return 0;
    225 }
    226 
    227 /*
    228  * Initialize everything, well, just everything in Posix clocks/timers ;)
    229  */
    230 static __init int init_posix_timers(void)
    231 {
    232         struct k_clock clock_realtime = {
    233                 .clock_getres = hrtimer_get_res,
    234         };
    235         struct k_clock clock_monotonic = {
    236                 .clock_getres = hrtimer_get_res,
*   237                 .clock_get = posix_ktime_get_ts,
    238                 .clock_set = do_posix_clock_nosettime,
    239         };
    240 
    241         register_posix_clock(CLOCK_REALTIME, &clock_realtime);
*   242         register_posix_clock(CLOCK_MONOTONIC, &clock_monotonic);
    243 
    244         posix_timers_cache = kmem_cache_create("posix_timers_cache",
    245                                         sizeof (struct k_itimer), 0, 0, NULL, NULL);
    246         idr_init(&posix_timers_id);
    247         return 0;
    248 }
...
    920 asmlinkage long
    921 sys_clock_gettime(const clockid_t which_clock, struct timespec __user *tp)
    922 {
    923         struct timespec kernel_tp;
    924         int error;
    925 
    926         if (invalid_clockid(which_clock))
    927                 return -EINVAL;
*   928         error = CLOCK_DISPATCH(which_clock, clock_get,
    929                                (which_clock, &kernel_tp));
    930         if (!error && copy_to_user(tp, &kernel_tp, sizeof (kernel_tp)))
    931                 error = -EFAULT;
    932 
    933         return error;
    934 
    935 }
"kernel/posix-timers.c"
モノトニック時刻の実装詳細は、ktime_get_ts() の先にありますが、この記事では情報源の確認までにします。jiffies_64 に帰着するのかと思ってましたが、そうでは無いようでした。興味のある方は、先を追ってみては。
以上から、10ミリ秒精度で十分であれば、モノトニック時刻の取得は、/proc/uptime の読み出しで代用できるということが確かめられました。各種スクリプト言語から、簡単に利用できて便利と思います。
なお、主要スクリプト言語について、clock_gettime() を呼び出すインターフェースがあるか調べてみました。以下。

perl
http://perldoc.perl.org/Time/HiRes.html

Ruby
見つけられませんでした。2011-11-13追記、Ruby にも perl と同様な syscall() が用意されていますので、強引に呼び出すことはできました。

Python
http://stackoverflow.com/questions/1205722/how-do-i-get-monotonic-time-durations-in-python
同様にして、ほとんど何でも C ライブラリを呼び出せそうです。すごいな Python は。
perl でも、システムコールであれば、syscall() を使って無理すれば呼べますが、こんなにキレイにはできません。2011-11-13追記、実際動かしてみると、CentOS 5 の python 2.4 では動かず、CentOS 6 の python 2.6 なら動きました。CentOS 5 では ctypes が足りませんでした。
2012-10-14追記、CentOS 5.8 で python-ctypes が追加されていたようです。

Ruby については、システムコール直呼び出しはやったことないので不明です。今度、調べてみよう。


■関連記事
bash で処理時間を 10 ミリ秒単位で計測する方法
ビルトインを自作して、bash で処理時間をミリ秒単位で計測
perlでサブルーチンを動的に定義しようとしてハマりました
人気ブログランキングへ にほんブログ村 IT技術ブログへ