2017年12月15日金曜日

bashスクリプトの if 文で ==

自作 bash スクリプトの if 文で、== で書いてしまっていた箇所があり、間違いではないか(正しく動作していないのでは?)という疑念を持ち調べたところ、bash の [ ] の中では、== も受け付けてくれると知りました。でもまあ、疑惑のタネになると思うので、旧来のBシェルの記述に従って == の箇所は = に直しました。
man bash より抜粋。
...
       string1 == string2
       string1 = string2
              True if the strings are equal.  = should be used with the test command for POSIX conformance.
...
bash 組み込みの help だと、man のような記述はありませんでした。
[root@hoge ~]# help test
test: test [expr]
    Evaluate conditional expression.
...

      -n STRING
         STRING      True if string is not empty.
    
      STRING1 = STRING2
                     True if the strings are equal.
      STRING1 != STRING2
                     True if the strings are not equal.
...
なお、test コマンド(bash 組み込みではないほう)の man だと記述はありませんが、== も受け付けるようです。
...
       -z STRING
              the length of STRING is zero

       STRING1 = STRING2
              the strings are equal

       STRING1 != STRING2
...
[root@hoge ~]# /usr/bin/test "a" == "b" ; echo $?
1
[root@hoge ~]# /usr/bin/test "a" == "a" ; echo $?
0
[root@hoge ~]# /usr/bin/[ "a" == "a" ] ; echo $?
0
[root@hoge ~]# /usr/bin/[ "a" == "b" ] ; echo $?
1
[root@hoge ~]# ls -li /usr/bin/test /usr/bin/[
2296639 -rwxr-xr-x. 1 root root 41496 Nov  6  2016 /usr/bin/[
2296722 -rwxr-xr-x. 1 root root 37328 Nov  6  2016 /usr/bin/test
[root@hoge ~]# rpm -qlv coreutils | egrep "/usr/bin/(\[|test)"
-rwxr-xr-x    1 root    root                    41496 Nov  6  2016 /usr/bin/[
-rwxr-xr-x    1 root    root                    37328 Nov  6  2016 /usr/bin/test
ちなみに、/usr/bin/test と /usr/bin/[ の実体は同じかと思ってたのですが、ls -li の結果は食い違ってました。いったい何なんだろう。環境は CentOS7 。

2017年12月9日土曜日

シェルスクリプトで端末から実行された場合だけメッセージを出したい

とあるシェルスクリプトを書いていて、端末から実行された場合だけメッセージを出したいと思いました。
tty コマンドで制御端末があるかどうか確認してから、/dev/tty へ書き込めば良いものとは思いましたが、ネット上に用例がないか調べたところ、ありました。AIX ではありますが。。
https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_71/com.ibm.aix.cmds5/tty.htm
これを参考に、次のようなコードを書きました。
...
if [ $? -ne 0 ] && tty -s ; then
        echo "..." >/dev/tty
fi
...
なぜ、こうしたいのか? 標準エラーではダメなのか? と思われるかもしれませんが、世の中いろいろありますね。
ちょっと、ここには書けませんが。

2017年12月2日土曜日

CentOS7 で TrackPoint が重い(ThinkPad X300 の場合)

今も動く ThinkPad のうちで最古の X300 では、前に書いた方法では、TrackPoint の調整ができませんでした。sysfs の sensivity などのエントリーが無いです。
[root@hoge ~]# find /sys | grep sensivity
[root@hoge ~]# 
しかし、マルチブートの Windows では調整できるのであるから、何か方法があるものとネットを彷徨った結果。下記の「Device Accel Adaptive Deceleration」の値を調整すればよいことがわかりました。
root@hoge ~]# xinput list
⎡ Virtual core pointer                     id=2 [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
⎜   ↳ DualPoint Stick                          id=11 [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad         id=12 [slave  pointer  (2)]
⎣ Virtual core keyboard                    id=3 [master keyboard (2)]
    ↳ Virtual core XTEST keyboard              id=5 [slave  keyboard (3)]
    ↳ Power Button                             id=6 [slave  keyboard (3)]
    ↳ Video Bus                                id=7 [slave  keyboard (3)]
    ↳ Sleep Button                             id=8 [slave  keyboard (3)]
    ↳ UVC Camera (17ef:4807)                   id=9 [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard             id=10 [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                   id=13 [slave  keyboard (3)]
[root@hoge ~]# xinput list-props 11
Device 'DualPoint Stick':
 Device Enabled (127): 1
 Coordinate Transformation Matrix (129): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
 Device Accel Profile (254): 0
 Device Accel Constant Deceleration (255): 1.000000
 Device Accel Adaptive Deceleration (256): 1.000000
 Device Accel Velocity Scaling (257): 10.000000
 Device Product ID (250): 2, 8
 Device Node (251): "/dev/input/event5"
 Evdev Axis Inversion (258): 0, 0
 Evdev Axes Swap (260): 0
 Axis Labels (261): "Rel X" (137), "Rel Y" (138)
 Button Labels (262): "Button Left" (130), "Button Middle" (131), "Button Right" (132), "Button Wheel Up" (133), "Button Wheel Down" (134), "Button Horiz Wheel Left" (135), "Button Horiz Wheel Right" (136)
 Evdev Scrolling Distance (263): 0, 0, 0
 Evdev Middle Button Emulation (264): 1
 Evdev Middle Button Timeout (265): 50
 Evdev Middle Button Button (266): 2
 Evdev Third Button Emulation (267): 0
 Evdev Third Button Emulation Timeout (268): 1000
 Evdev Third Button Emulation Button (269): 3
 Evdev Third Button Emulation Threshold (270): 20
 Evdev Wheel Emulation (271): 1
 Evdev Wheel Emulation Axes (272): 6, 7, 4, 5
 Evdev Wheel Emulation Inertia (273): 10
 Evdev Wheel Emulation Timeout (274): 200
 Evdev Wheel Emulation Button (275): 2
 Evdev Drag Lock Buttons (276): 0
整数しか指定できないと勘違いして、しばらく格闘してしまいましたが、実は小数も指定でき、0.4 くらいにすると、マシになりました。
[root@hoge ~]# xinput set-float-prop "DualPoint Stick" "Device Accel Constant Deceleration" 0.4
ちなみに、X300 で CentOS7 は、いちおう使えるレベルです。さすがに GNOME が重めで、CPU のパワー不足を顕著に感じます。
でも、このマシンは液晶ディスプレイの発色が良くて、キーボードが打ちやすいです。
最近、ThinkPad 25 を入手したので、新旧のキーボードを使い較べています。ThinkPad 25 については、そのうちにレビューしてみようと思っています。

2017年10月19日木曜日

CentOS7 で TrackPoint が重い

ThinkPad W520 で Win7 と CentOS7 をデュアルブートして使用しているのですが、Win7 を使った直後に CentOS7 に切り替えて使用すると、TrackPoint が重く(反応鈍い、スピード遅い)感じます。このマシンは長い期間使っていて、今まであまり気にならなかったのですが、急に我慢できなくなり、調べました。

まず、そういえば X301 を常用していた頃は、gpointing-device-settings というツールを利用していたので、今回もこれを使えばよいやと思いました。それで、CentOS7 向けの RPM をネットで探したわけですが、これが出てきません。
仕方がないので、少し古くてもいいので Fedora の .src.rpm から rebuild すればいいかと、実行してみたのですが、残念ながらコンパイルが通りません。
[root@hoge ~]# rpmbuild --rebuild gpointing-device-settings-1.5.1-8.fc18.src.rpm
gpointing-device-settings-1.5.1-8.fc18.src.rpm をインストール中です。
警告: gpointing-device-settings-1.5.1-8.fc18.src.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID fb4b18e6: NOKEY
...
/usr/include/gnome-settings-daemon-3.0/gnome-settings-daemon/gnome-settings-plugin.h:63:16: error: unknown type name 'GsdMouseExtensionPluginManager'
...
このエラーの解決方法もサーチしてみたのですが、見つからずでした。それなら、GitHub から持ってくればいけるかもと思ったのですが、2010年で開発が止まっているようです。最近の Fedora に入ってないのは、そういうことか。。。

という具合に遠回りしてしまいましたが、別の方法を探したところ、
http://www.thinkwiki.org/wiki/How_to_configure_the_TrackPoint
こちらに udev で設定する方法がありました。感謝。
写経ですが、こんな感じです。
[root@hoge ~]# ls -l /etc/conf.d/trackpoint 
-rwxr-xr-x 1 root root 884 10月 18 07:32 /etc/conf.d/trackpoint
[root@hoge ~]# cat /etc/conf.d/trackpoint 
#! /bin/bash

## Trackpoint settings

# When run from a udev rule, DEVPATH should be set
if [ ! -z $DEVPATH ] ; then
    TPDEV=/sys/$( echo "$DEVPATH" | sed 's/\/input\/input[0-9]*//' )
else
# Otherwise just look in /sys/
    TPDEV=$(find /sys/devices/platform/i8042 -name name | xargs grep -Fl TrackPoint | sed 's/\/input\/input[0-9]*\/name$//')
fi

# http://www.thinkwiki.org/wiki/How_to_configure_the_TrackPoint
# http://wwwcssrv.almaden.ibm.com/trackpoint/files/ykt3eext.pdf
#------------------------------------------------------------
if [ -d "$TPDEV" ]; then
    echo "Configuring Trackpoint"
    echo -n 255     > $TPDEV/sensitivity     # Integer  128   Sensitivity
    echo -n 97      > $TPDEV/speed           # Integer  97   Cursor speed
    echo -n 4       > $TPDEV/inertia         # Integer  6   Negative intertia
else
    echo "Couldn't find trackpoint device $TPDEV"
fi
[root@hoge ~]# cat /etc/udev/rules.d/
10-trackpoint.rules        70-persistent-ipoib.rules  
[root@hoge ~]# cat /etc/udev/rules.d/10-trackpoint.rules 
SUBSYSTEM=="input", ATTR{name}=="*TrackPoint*", RUN+="/etc/conf.d/trackpoint"
/etc/conf.d というディレクトリは、CentOS7 には無いのですが、下手にパスを変えるとネットの情報とつき合わせたりする場合に不便になるので、そのまま採用しました。

備考:この調査の過程で、真ん中ボタンを使ったスクロール設定の方法を見つけたので、ついでに設定しました。感謝。
https://qiita.com/naiasin/items/09f27faef8a8f92ad179

2017-12-03追記
手持ちの中で最古の X300 の場合は、上記設定方法では NG でした。

2017年9月24日日曜日

中古SSDの初期確認

某ショップから、中古で SanDisk 製 SSD を入手しました。その初期確認結果、備忘録です。

まず、Win7 環境から定番ソフトで確認した結果です。

中古ということで、どのくらい消耗しているのかが気がかりでしたが、SanDisk SSD Dashboard で「余寿命」が 100% でした。入手価格からすれば、よい買い物であったように感じます。

次は、CentOS6 環境で採取した smartctl -a の結果です。
smartctl 5.43 2016-09-28 r4347 [x86_64-linux-2.6.32-696.10.1.el6.x86_64] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Model Family:     Marvell based SanDisk SSDs
Device Model:     SanDisk SDSSDXPS240G
Serial Number:    xxxxxxxxx143
LU WWN Device Id: 5 001b44 yyyyyyyyy
Firmware Version: X21100RL
User Capacity:    240,057,409,536 bytes [240 GB]
Sector Size:      512 bytes logical/physical
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   8
ATA Standard is:  ACS-2 revision 3
Local Time is:    Sat Sep 23 18:53:25 2017 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

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

General SMART Values:
Offline data collection status:  (0x00) Offline data collection activity
     was never started.
     Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
     without error or no self-test has ever 
     been run.
Total time to complete Offline 
data collection:   (    0) seconds.
Offline data collection
capabilities:     (0x11) SMART execute Offline immediate.
     No Auto Offline data collection support.
     Suspend Offline collection upon new
     command.
     No Offline surface scan supported.
     Self-test supported.
     No Conveyance Self-test supported.
     No Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
     power-saving mode.
     Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
     General Purpose Logging supported.
Short self-test routine 
recommended polling time:   (   2) minutes.
Extended self-test routine
recommended polling time:   (  10) minutes.

SMART Attributes Data Structure revision number: 4
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0032   100   100   ---    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   253   100   ---    Old_age   Always       -       707
 12 Power_Cycle_Count       0x0032   100   100   ---    Old_age   Always       -       421
166 Min_W/E_Cycle           0x0032   100   100   ---    Old_age   Always       -       1
167 Min_Bad_Block/Die       0x0032   100   100   ---    Old_age   Always       -       45
168 Maximum_Erase_Cycle     0x0032   100   100   ---    Old_age   Always       -       45
169 Total_Bad_Block         0x0032   100   100   ---    Old_age   Always       -       606
171 Program_Fail_Count      0x0032   100   100   ---    Old_age   Always       -       0
172 Erase_Fail_Count        0x0032   100   100   ---    Old_age   Always       -       0
173 Avg_Write/Erase_Count   0x0032   100   100   ---    Old_age   Always       -       14
174 Unexpect_Power_Loss_Ct  0x0032   100   100   ---    Old_age   Always       -       76
184 End-to-End_Error        0x0032   100   100   ---    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   ---    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   ---    Old_age   Always       -       3
194 Temperature_Celsius     0x0022   070   046   ---    Old_age   Always       -       30 (Min/Max 16/46)
199 SATA_CRC_Error          0x0032   100   100   ---    Old_age   Always       -       0
212 SATA_PHY_Error          0x0032   100   100   ---    Old_age   Always       -       0
230 Perc_Write/Erase_Count  0x0032   100   100   ---    Old_age   Always       -       46
232 Perc_Avail_Resrvd_Space 0x0033   100   100   004    Pre-fail  Always       -       100
233 Total_NAND_Writes_GiB   0x0032   100   100   ---    Old_age   Always       -       3815
241 Total_Writes_GiB        0x0030   253   253   ---    Old_age   Offline      -       2895
242 Total_Reads_GiB         0x0030   253   253   ---    Old_age   Offline      -       4817
244 Thermal_Throttle        0x0032   000   100   ---    Old_age   Always       -       0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]


Device does not support Selective Self Tests/Logging
次は、hdparm -I の結果です。
ATA device, with non-removable media
        Model Number:       SanDisk SDSSDXPS240G                    
        Serial Number:      xxxxxxxxx143        
        Firmware Revision:  X21100RL
        Media Serial Num:   
        Media Manufacturer: 
        Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
Standards:
        Used: unknown (minor revision code 0x0110) 
        Supported: 9 8 7 6 5 
        Likely used: 9
Configuration:
        Logical         max     current
        cylinders       16383   65535
        heads           16      1
        sectors/track   63      63
        --
        CHS current addressable sectors:    4128705
        LBA    user addressable sectors:  268435455
        LBA48  user addressable sectors:  468862128
        Logical  Sector size:                   512 bytes
        Physical Sector size:                   512 bytes
        Logical Sector-0 offset:                  0 bytes
        device size with M = 1024*1024:      228936 MBytes
        device size with M = 1000*1000:      240057 MBytes (240 GB)
        cache/buffer size  = unknown
        Form Factor: 2.5 inch
        Nominal Media Rotation Rate: Solid State Device
Capabilities:
        LBA, IORDY(can be disabled)
        Queue depth: 32
        Standby timer values: spec'd by Standard, no device specific minimum
        R/W multiple sector transfer: Max = 1   Current = 1
        Advanced power management level: 128
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4 
             Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
        Enabled Supported:
           *    SMART feature set
                Security Mode feature set
           *    Power Management feature set
           *    Write cache
           *    Look-ahead
           *    Host Protected Area feature set
           *    WRITE_BUFFER command
           *    READ_BUFFER command
           *    DOWNLOAD_MICROCODE
           *    Advanced Power Management feature set
                SET_MAX security extension
           *    48-bit Address feature set
           *    Device Configuration Overlay feature set
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    SMART error logging
           *    SMART self-test
           *    General Purpose Logging feature set
           *    WRITE_{DMA|MULTIPLE}_FUA_EXT
           *    64-bit World wide name
           *    WRITE_UNCORRECTABLE_EXT command
           *    {READ,WRITE}_DMA_EXT_GPL commands
           *    Segmented DOWNLOAD_MICROCODE
           *    Gen1 signaling speed (1.5Gb/s)
           *    Gen2 signaling speed (3.0Gb/s)
           *    Gen3 signaling speed (6.0Gb/s)
           *    Native Command Queueing (NCQ)
           *    Host-initiated interface power management
           *    Phy event counters
           *    unknown 76[15]
           *    DMA Setup Auto-Activate optimization
           *    Device-initiated interface power management
           *    Software settings preservation
                unknown 78[8]
           *    Data Set Management TRIM supported (limit 16 blocks)
           *    Deterministic read ZEROs after TRIM
Security: 
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
                frozen
        not     expired: security count
                supported: enhanced erase
        2min for SECURITY ERASE UNIT. 18min for ENHANCED SECURITY ERASE UNIT. 
Logical Unit WWN Device Identifier: 5001b44yyyyyyyyy
        NAA             : 5
        IEEE OUI        : 001b44
        Unique ID       : yyyyyyyyy
Checksum: correct
次は、diskutility での読み込みベンチマーク結果です。

おそらくですが、全領域ゼロ書き込みした状態と思われるので、SecureErase を行いました。
次は、SecureErase 後の diskutility ベンチマークの結果です。ちょっとだけ数値がアップしています。

なお、思わず盲目的に SecureErase をやってしまいましたが、blkdiscard で十分だったかもしれません。

2017年9月18日月曜日

何日前に作成されたファイルか調べる方法

ときどきですが、何日前に作成されたファイルなのかを、知りたい場合があります。
正確に知る必要がなければ、頭の中でだいたいの計算をしたりしますが、bashとdateコマンドで次のようにして計算できるようです。備忘録。
[root@hoge ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1125 May  2  2015 anaconda-ks.cfg
[root@hoge ~]# declare -i d_diff=($(date -d now +%s)-$(date -r ./anaconda-ks.cfg +%s))/24/3600
[root@hoge ~]# echo $d_diff
870
[root@hoge ~]#

2017年8月18日金曜日

ThinkPad W520 + CentOS 7 夏対策(省電力設定)

このところ、firefox でブラウズしているだけでも、冷却ファンが回り続けてしまい耳障りなので、夏対策を少々。
定番的なものだけですが、備忘録です。

まず、NVIDIA のドライバを nouveau から kmod-nvidia に変更しました(elrepo 利用)。最近は安定していて、それほど不満ないので、nouveau を使ってましたが、おそらくは NVIDIA 謹製ドライバでないと、省電力制御が働かないのではと思ったので。
[root@hoge ~]# yum list kmod-nvidia --enablerepo=elrepo --showduplicates
読み込んだプラグイン:fastestmirror, langpacks, nvidia
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * elrepo: elrepo.org
 * extras: download.nus.edu.sg
 * updates: download.nus.edu.sg
利用可能なパッケージ
kmod-nvidia.x86_64                 367.57-1.el7.elrepo                   elrepo 
kmod-nvidia.x86_64                 367.57-2.el7.elrepo                   elrepo 
kmod-nvidia.x86_64                 367.57-3.el7.elrepo                   elrepo 
kmod-nvidia.x86_64                 375.66-1.el7.elrepo                   elrepo 
kmod-nvidia.x86_64                 384.59-1.el7.elrepo                   elrepo ※こっちを利用
kmod-nvidia.x86_64                 384.59-2.el7_4.elrepo                 elrepo 
※↑あいにく RHEL7.4 カーネル向けが出ていて、まだ CentOS 7.4 が出てないので、こっちは NG (シンボルエラーになる)
[root@hoge ~]# yum install kmod-nvidia-384.59-1.el7.elrepo.x86_64 --enablerepo=elrepo
...
あとは、CPU と SSD の省電力設定を行いました。
[root@hoge ~]# cpupower frequency-set -g powersave
Setting cpu: 0
Setting cpu: 1
Setting cpu: 2
Setting cpu: 3
Setting cpu: 4
Setting cpu: 5
Setting cpu: 6
Setting cpu: 7
[root@hoge ~]# find /sys/ | grep link_power
/sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/link_power_management_policy
/sys/devices/pci0000:00/0000:00:1f.2/ata2/host1/scsi_host/host1/link_power_management_policy
/sys/devices/pci0000:00/0000:00:1f.2/ata3/host2/scsi_host/host2/link_power_management_policy
/sys/devices/pci0000:00/0000:00:1f.2/ata4/host3/scsi_host/host3/link_power_management_policy
/sys/devices/pci0000:00/0000:00:1f.2/ata5/host4/scsi_host/host4/link_power_management_policy
/sys/devices/pci0000:00/0000:00:1f.2/ata6/host5/scsi_host/host5/link_power_management_policy
[root@hoge ~]# lsdisk
DEVICE   Driver        PCI           Description
================================================================================
scsi0    ahci          00:1f.2       +
  sda    sd                 .        scsi0 ch=0 id=0 lun=0  size=240.0GB
scsi1    ahci          00:1f.2       +
  sdb    sd                 .        scsi1 ch=0 id=0 lun=0  size=240.0GB
scsi2    ahci          00:1f.2       +
scsi3    ahci          00:1f.2       +
scsi4    ahci          00:1f.2       +
scsi5    ahci          00:1f.2       +

[root@hoge ~]# echo min_power > /sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/link_power_management_policy
[root@hoge ~]# echo min_power > /sys/devices/pci0000:00/0000:00:1f.2/ata2/host1/scsi_host/host1/link_power_management_policy
... 約10分後 ...
[root@hoge ~]# hddtemp 
/dev/sda: INTEL SSDSC2BW240A4: 40°C  ※だいたい、マイナス2度ほど下がりました
/dev/sdb: INTEL SSDSC2BW240A4: 35°C  ※だいたい、マイナス2度ほど下がりました
[root@hoge ~]# sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:        +57.0°C  (crit = +99.0°C)

thinkpad-isa-0000
Adapter: ISA adapter
fan1:        2532 RPM  ※この回転数だと、それほど耳障りではなかったです

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +57.0°C  (high = +86.0°C, crit = +100.0°C)
Core 0:         +57.0°C  (high = +86.0°C, crit = +100.0°C)
Core 1:         +54.0°C  (high = +86.0°C, crit = +100.0°C)
Core 2:         +53.0°C  (high = +86.0°C, crit = +100.0°C)
Core 3:         +54.0°C  (high = +86.0°C, crit = +100.0°C)
これらの対策により、冷却ファンは鎮まりました。こうやって、マニュアル操作でいじくれるのが Linux のよいところですね。

2017年8月6日日曜日

RHEL7.4 リリースノートに Btrfs has been deprecated を発見

先週、RHEL7.4 がリリースされたのを思い出し、リリースノートをパラ読みしていたら、、、発見しました。

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/7.4_Release_Notes/chap-Red_Hat_Enterprise_Linux-7.4_Release_Notes-Deprecated_Functionality.html
〜抜粋〜
The Btrfs file system has been in Technology Preview state since the initial release of
Red Hat Enterprise Linux 6. Red Hat will not be moving Btrfs to a fully supported feature
and it will be removed in a future major release of Red Hat Enterprise Linux. 

The Btrfs file system did receive numerous updates from the upstream in
Red Hat Enterprise Linux 7.4 and will remain available in the Red Hat Enterprise Linux 7 series.
However, this is the last planned update to this feature. 
〜
raid1 と 透過圧縮(LZO) は、有益な機能と思っていたのですが、打ち切りとは残念です。ますます ZFS に傾倒しそうです。

実は、本日、手持ちの CentOS 7.3 が動いているマシンの Btrfs raid1 領域で、2番目の HDD を見失う (熱のせい?) という障害があり、Btrfs の記事を漁っているところでした。

以下、障害対応の備忘録です。
2番目の HDD は完全に壊れたわけではなく、SATA コントローラが見失っただけのようでした。ルートファイルシステムに使っていたため、syslog 等のログ出力の I/O で、さらにエラーが出るという悪循環になっているようでした。しかたなく、SysRq s, SysRq u, SysRq b の3連打で再起動しました。
てっきり、デグレードして1番目の HDD だけで立ち上がるのかと思ったら、起動して来ませんでした(systemd が2番ディスクを永久待ち合わせしてしまうらしく)。md RAID1 や ZFS mirror と同様だろうと思ったのですが、ややこしい操作(下記)を経ないと復旧できませんでした。なお、中身のデータは完全に無事でした。これぞ Btrfs の利点なんですけどねえ。
1. GRUB2 をマニュアル操作して、ブートパラメータに rd.break=pre-mount を追加して起動
2. degraded オプションでマウント
  # mkdir /mnt_temp
  # mount -o degraded /dev/sdXX /mnt_temp
3. 代替 HDD を追加
  # btrfs device add /dev/sdYY /mnt_temp
4. 見失った HDD を削除
  # btrfs device delete missing /mnt_temp
  ※これで、代替 HDD にリバランスされるようです。この場合、特殊キーワード missing を使えます
というわけで、まだまだ、故障時の運用性に難があるなあと思った矢先の発見でした。おわり。
今後は、CentOS 7 のルートファイルシステムも ZFS を使おうかと思いまーす。

■関連記事
CentOS 6 の root ファイルシステムに ZFS を使う
CentOS 7 の root ファイルシステムに ZFS を使う

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 systemd-nspawn@mycon32.service
コンテナ mycon32 の起動パラメータをカスタマイズするには、次のようにします。
[root@hoge ~]# env SYSTEMD_EDITOR=vim systemctl edit systemd-nspawn@mycon32    ★これで vim が立ち上がります
...
[root@hoge ~]# cat /etc/systemd/system/systemd-nspawn@mycon32.service.d/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: systemd-nspawn@mycon32.service
                  |-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
root@192.168.122.25'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 ~]# 

2017年5月19日金曜日

CentOS 7 でコンソールのフォントを大きくする

フルHD (1920x1080) の ThinkPad W520 で CentOS 7 を使っているのですが、コンソールのフォントが小さすぎてしんどいので、大きいフォントに変更。備忘録です。
[root@hoge ~]# vi /etc/default/grub 
...
GRUB_CMDLINE_LINUX="elevator=deadline vconsole.keymap=jp106 vconsole.font=latarcyrheb-sun32 rd.auto crashkernel=auto"
...
[root@hoge ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
...
[root@hoge ~]# shutdown -r now
もともと vconsole.font=latarcyrheb-sun16 になってましたが、これを sun32 に変更しました。これで、columns x rows = 120 x 33 になり、目に優しくなりました。

[root@hoge ~]# stty -a
speed 38400 baud; rows 33; columns 120; line = 0;
...

2017年4月25日火曜日

中古 HDD の初期確認、5個目(2017年4月)

これまで4個の中古 HDD を購入しましたが、先日、2個目 (2015年10月購入) が壊れてしまったため、交換用に5個目を購入しました。

いつもの初期確認、まずは S.M.A.R.T. の値です。
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-2.6.32-642.15.1.el6.x86_64] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   075   063   044    Pre-fail  Always       -       40541387
  3 Spin_Up_Time            0x0003   098   091   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       192
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   061   060   030    Pre-fail  Always       -       30075995649
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       635
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   037   020    Old_age   Always       -       100
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   069   048   045    Old_age   Always       -       31 (Min/Max 26/31)
194 Temperature_Celsius     0x0022   031   052   000    Old_age   Always       -       31 (0 17 0 0 0)
195 Hardware_ECC_Recovered  0x001a   043   033   000    Old_age   Always       -       40541387
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
なんと、稼働時間は 635 時間 (約26日) でした。ただ、HDD のラベルに書いてある Date Code: が 09421 で、製造年月は2009年4月ということになります。8年間、ほとんど眠っていたわけです。

次は hdparm -i の出力です。
[root@hoge ~]# hdparm -i /dev/sdd

/dev/sdd:

 Model=ST31000340NS, FwRev=SN06, SerialNo=9xxxxxx7
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=unknown, MaxMultSect=16, MultSect=off
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=1953525168
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=no WriteCache=enabled
 Drive conforms to: unknown:  ATA/ATAPI-4,5,6,7

 * signifies the current active mode
ファームウェア番号が SN06 (3個目に入手したのと同じ)、Write キャッシュは有効でした。

次は、smartctl -a の出力です。
[root@hoge ~]# smartctl -a /dev/sdd
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-2.6.32-642.15.1.el6.x86_64] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda ES.2
Device Model:     ST31000340NS
Serial Number:    9xxxxxx7
LU WWN Device Id: 5 000c50 0yyyyyyy1
Firmware Version: SN06
User Capacity:    1,000,204,886,016 bytes [1.00 TB]
Sector Size:      512 bytes logical/physical
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 4
Local Time is:    Mon Apr 24 14:37:59 2017 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

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

General SMART Values:
Offline data collection status:  (0x82) Offline data collection activity
                                        was completed without error.
                                        Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever 
                                        been run.
Total time to complete Offline 
data collection:                (  642) seconds.
Offline data collection
capabilities:                    (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine 
recommended polling time:        (   1) minutes.
Extended self-test routine
recommended polling time:        ( 237) minutes.
Conveyance self-test routine
recommended polling time:        (   2) minutes.
SCT capabilities:              (0x103d) SCT Status supported.
                                        SCT Error Recovery Control supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   075   063   044    Pre-fail  Always       -       40407787
  3 Spin_Up_Time            0x0003   098   091   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       192
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   061   060   030    Pre-fail  Always       -       30075995322
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       635
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   037   020    Old_age   Always       -       100
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   071   048   045    Old_age   Always       -       29 (Min/Max 26/29)
194 Temperature_Celsius     0x0022   029   052   000    Old_age   Always       -       29 (0 17 0 0 0)
195 Hardware_ECC_Recovered  0x001a   043   033   000    Old_age   Always       -       40407787
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%         6         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

次は、hdparm -I の出力です。
[root@hoge ~]# hdparm -I /dev/sdd

/dev/sdd:

ATA device, with non-removable media
 Model Number:       ST31000340NS                            
 Serial Number:      9xxxxxx7
 Firmware Revision:  SN06    
 Transport:          Serial
Standards:
 Used: unknown (minor revision code 0x0029) 
 Supported: 8 7 6 5 
 Likely used: 8
Configuration:
 Logical  max current
 cylinders 16383 16383
 heads  16 16
 sectors/track 63 63
 --
 CHS current addressable sectors:   16514064
 LBA    user addressable sectors:  268435455
 LBA48  user addressable sectors: 1953525168
 Logical/Physical Sector size:           512 bytes
 device size with M = 1024*1024:      953869 MBytes
 device size with M = 1000*1000:     1000204 MBytes (1000 GB)
 cache/buffer size  = unknown
 Nominal Media Rotation Rate: 7200
Capabilities:
 LBA, IORDY(can be disabled)
 Queue depth: 32
 Standby timer values: spec'd by Standard, no device specific minimum
 R/W multiple sector transfer: Max = 16 Current = ?
 Recommended acoustic management value: 254, current value: 0
 DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
      Cycle time: min=120ns recommended=120ns
 PIO: pio0 pio1 pio2 pio3 pio4 
      Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
 Enabled Supported:
    * SMART feature set
      Security Mode feature set
    * Power Management feature set
    * Write cache
    * Look-ahead
    * Host Protected Area feature set
    * WRITE_BUFFER command
    * READ_BUFFER command
    * DOWNLOAD_MICROCODE
      SET_MAX security extension
    * 48-bit Address feature set
    * Device Configuration Overlay feature set
    * Mandatory FLUSH_CACHE
    * FLUSH_CACHE_EXT
    * SMART error logging
    * SMART self-test
    * General Purpose Logging feature set
    * 64-bit World wide name
      Write-Read-Verify feature set
    * WRITE_UNCORRECTABLE_EXT command
    * {READ,WRITE}_DMA_EXT_GPL commands
    * Segmented DOWNLOAD_MICROCODE
    * Gen1 signaling speed (1.5Gb/s)
    * Native Command Queueing (NCQ)
    * Phy event counters
    * Software settings preservation
    * SMART Command Transport (SCT) feature sets
    * SCT Write Same (AC2)
    * SCT Error Recovery Control (AC3)
    * SCT Features Control (AC4)
    * SCT Data Tables (AC5)
      unknown 206[12] (vendor specific)
Security: 
 Master password revision code = 65534
  supported
 not enabled
 not locked
 not frozen
 not expired: security count
  supported: enhanced erase
 202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT. 
Logical Unit WWN Device Identifier: 5000c500yyyyyyy1
 NAA  : 5
 IEEE OUI : 000c50
 Unique ID : 0yyyyyyy1
Checksum: correct

4台で RAIDZ 構成を組んでまして、このあと zpool replace で、無事に故障ディスクを置き換えて、冗長性回復できました。この状態で2年ぐらい安定してくれるといいな。

2017年1月27日金曜日

シェルスクリプトで時刻をミリ秒まで出したい

シェルスクリプトで、ログの時刻をミリ秒まで出したい箇所があり、date コマンドでは出せないという思い込み (UNIXの古い経験) から、perl で小さなツール (gettimeofday を呼ぶ程度) を書きました。そして、いちおう動くようになった、そのあとに、date コマンドで出せることを知りました。orz
最初のリサーチは大事ですね。
[root@hoge tmp]# date +"%F %T 0.%3N" ; ./mydate.pl ; date +"%F %T 0.%3N" ; ./mydate.pl
2017-01-27 07:53:22 0.131
2017-01-27 07:53:22 0.133
2017-01-27 07:53:22 0.133
2017-01-27 07:53:22 0.135
[root@hoge tmp]# /usr/bin/time -v date +"%F %T 0.%3N"
2017-01-27 07:53:36 0.230
 Command being timed: "date +%F %T 0.%3N"
 User time (seconds): 0.00
 System time (seconds): 0.00
 Percent of CPU this job got: 93%
 Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
 Average shared text size (kbytes): 0
 Average unshared data size (kbytes): 0
 Average stack size (kbytes): 0
 Average total size (kbytes): 0
 Maximum resident set size (kbytes): 724
 Average resident set size (kbytes): 0
 Major (requiring I/O) page faults: 0
 Minor (reclaiming a frame) page faults: 228
 Voluntary context switches: 1
 Involuntary context switches: 1
 Swaps: 0
 File system inputs: 0
 File system outputs: 8
 Socket messages sent: 0
 Socket messages received: 0
 Signals delivered: 0
 Page size (bytes): 4096
 Exit status: 0
[root@hoge tmp]# /usr/bin/time -v ./mydate.pl 
2017-01-27 07:53:46 0.445
 Command being timed: "./mydate.pl"
 User time (seconds): 0.00
 System time (seconds): 0.00
 Percent of CPU this job got: 100%
 Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
 Average shared text size (kbytes): 0
 Average unshared data size (kbytes): 0
 Average stack size (kbytes): 0
 Average total size (kbytes): 0
 Maximum resident set size (kbytes): 2300
 Average resident set size (kbytes): 0
 Major (requiring I/O) page faults: 0
 Minor (reclaiming a frame) page faults: 634
 Voluntary context switches: 1
 Involuntary context switches: 1
 Swaps: 0
 File system inputs: 0
 File system outputs: 8
 Socket messages sent: 0
 Socket messages received: 0
 Signals delivered: 0
 Page size (bytes): 4096
 Exit status: 0
[root@hoge tmp]# time date +"%F %T 0.%3N"
2017-01-27 07:56:18 0.292

real 0m0.001s
user 0m0.000s
sys 0m0.001s
[root@hoge tmp]# time ./mydate.pl 
2017-01-27 07:56:30 0.545

real 0m0.002s
user 0m0.001s
sys 0m0.001s
[root@hoge tmp]# 
このように、当然、perl で書いたら重い (と言ったって2ミリくらいだけど) ですね。手持ちの新旧VM環境を調べたところ、現在の RHEL/CentOS系 (RHEL3 以降) なら %N を使えるようです。というわけで、せっかく書いた mydate.pl は、お蔵入り。

2017-02-02追記
お手軽に性能計測と言えば、昔から time コマンドを使ってましたが、最近は perf stat が使えるので、備忘録です。
time コマンドよりも精細な計測が出来るので、今回のように処理時間が極く短いモノを測る場合は、こちらを利用すると良いようです。
[root@hoge tmp]# perf stat ./mydate.pl 
2017-02-02 03:21:50 0.747

 Performance counter stats for './mydate.pl':

          1.504866      task-clock (msec)         #    0.886 CPUs utilized          
                 0      context-switches          #    0.000 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               592      page-faults               #    0.393 M/sec                  
         4,952,896      cycles                    #    3.291 GHz                      (33.77%)
         2,461,931      stalled-cycles-frontend   #   49.71% frontend cycles idle   
         2,461,430      stalled-cycles-backend    #  49.70% backend cycles idle     
         4,000,101      instructions              #    0.81  insn per cycle         
                                                  #    0.62  stalled cycles per insn
           760,869      branches                  #  505.606 M/sec                  
            31,136      branch-misses             #    4.09% of all branches          (88.50%)

       0.001698771 seconds time elapsed

[root@hoge tmp]# perf stat date +"%F %T 0.%3N"
2017-02-02 03:39:52 0.612

 Performance counter stats for 'date +%F %T 0.%3N':

          0.355000      task-clock (msec)         #    0.658 CPUs utilized          
                 0      context-switches          #    0.000 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               193      page-faults               #    0.544 M/sec                  
         1,193,873      cycles                    #    3.363 GHz                    
           800,322      stalled-cycles-frontend   #   67.04% frontend cycles idle   
           636,341      stalled-cycles-backend    #  53.30% backend cycles idle     
           785,182      instructions              #    0.66  insn per cycle         
                                                  #    1.02  stalled cycles per insn
           144,848      branches                  #  408.023 M/sec                  
           branch-misses                                               

       0.000539333 seconds time elapsed

[root@hoge tmp]# 
time コマンドによる計測では、mydate.pl は、date コマンドより2倍程度の重さに見えてましたが、perf stat で計ると、4倍程度重いという結果が見てとれました。

2017年1月20日金曜日

/var/log/cron に crond[xxxx]: (CRON) bad minute (/etc/cron.d/hoge.crontab) メッセージが出る

CentOS 7.3 で crontab を書いていて、/var/log/cron に謎のエラーが出て、しばし格闘したので備忘録です。
出力されたのは、次のメッセージです。
Jan 20 07:19:01 hoge crond[2587]: (CRON) bad minute (/etc/cron.d/hoge.crontab)
hoge.crontab の中身は、こちらです。例示のため、エッセンスに絞ってます。
OP=
30 7 * * * root [ -z "$OP" ] && true
実際に作成していた crontab は、もっと長いもので、どこに問題があるか分からず、徐々に削っていったら、OP= の行が原因とわかりました。おそらく、cronie に誤認されているものと思います。次のように書き換えたらエラー出なくなりました。
OP=""
30 7 * * * root [ -z "$OP" ] && true
やれやれ、こんなところで凝ったことをしようとしないほうが良いですね。

調査の過程で、次のページを参考にさせてもらいました。綺麗&上手にまとめてらっしゃるもんだなあと、感心してしまいました。
http://www.server-memo.net/tips/etc-crontab.html

ついでに、その他のハマりどころとして、環境変数 (例では OP=) の後半にコメント (#) は書けないという事を知りました。man 5 crontab に記述ありました。みなさまも、お気をつけください。

2017年1月18日水曜日

ロングオプションの罠

とある自作 bash スクリプトにて、fallocate コマンドを使ったのですが、これまた、とあるサーバで --length オプションがエラーに。。。
[root@hoge ~]# fallocate --keep-size --length 1m /tmp/fuga
fallocate: unrecognized option '--length'
Usage: fallocate [options] <filename>

Options:
 -h, --help          this help
 -n, --keep-size     don't modify the length of the file
 -p, --punch-hole    punch holes in the file
 -o, --offset   offset of the allocation, in bytes
 -l, --length   length of the allocation, in bytes

For more information see fallocate(1).
おかしい、他のサーバでは、大丈夫なのに。。。
CentOS 6 用の最新の util-linux-ng の .src.rpm を展開して、さぐってみたら、ありました typo バグ。
[root@hoge SOURCES]# cat util-linux-ng-2.17-opts-typos.patch 
diff -up util-linux-ng-2.17.2/misc-utils/findmnt.c.kzak util-linux-ng-2.17.2/misc-utils/findmnt.c
--- util-linux-ng-2.17.2/misc-utils/findmnt.c.kzak 2016-03-08 11:39:00.996400246 +0100
+++ util-linux-ng-2.17.2/misc-utils/findmnt.c 2016-03-08 11:44:49.598921954 +0100
@@ -586,7 +586,10 @@ int main(int argc, char *argv[])
      { "output",       1, 0, 'o' },
      { "raw",          0, 0, 'r' },
      { "types",        1, 0, 't' },
-     { "fsroot",       0, 0, 'v' },
+
+     { "nofsroot",     0, 0, 'v' },
+     { "fsroot",       0, 0, 'v' }, /* RHEL6: typo, backward compatibility */
+
      { "submounts",    0, 0, 'R' },
      { "source",       1, 0, 'S' },
      { "target",       1, 0, 'T' },
diff -up util-linux-ng-2.17.2/sys-utils/fallocate.c.kzak util-linux-ng-2.17.2/sys-utils/fallocate.c
--- util-linux-ng-2.17.2/sys-utils/fallocate.c.kzak 2016-03-08 11:39:01.028400021 +0100
+++ util-linux-ng-2.17.2/sys-utils/fallocate.c 2016-03-08 11:43:28.799496864 +0100
@@ -125,7 +125,10 @@ int main(int argc, char **argv)
      { "keep-size", 0, 0, 'n' },
      { "punch-hole", 0, 0, 'p' },
      { "offset",    1, 0, 'o' },
-     { "lenght",    1, 0, 'l' },
+
+     { "length",    1, 0, 'l' },
+     { "lenght",    1, 0, 'l' },  /* RHEL6: typo, backward compatibility */
+
      { NULL,        0, 0, 0 }
  };

[root@hoge SOURCES]# cat ../SPECS/util-linux-ng.spec
...
# 1122839 - fallocate and findmnt have wrong options according to man pages
Patch114: util-linux-ng-2.17-opts-typos.patch
...
* Mon Jan 11 2016 Karel Zak  2.17.2-12.19
...
- fix #1122839 - fallocate and findmnt have wrong options according to man pages
https://bugzilla.redhat.com/show_bug.cgi?id=1122839

というわけで、エラーが出ていたサーバの util-linux-ng が古かったというオチでした。やはり、ほとんどの場合、常に最新を使うのが吉ですね。もちろんです。

今回、--keep-size オプションを使おうとして、なんとなくロングオプションを選んでしまいましたが、こういった間違いが起きてる可能性を考えると、ショートオプションを使ったほうが吉かもしれませんね。自作スクリプトは、古い環境も対象にしているので、ショートオプションに修正しました。
人気ブログランキングへ にほんブログ村 IT技術ブログへ