2017年5月19日金曜日

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

フルHD (1920x1024) の 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技術ブログへ