技術者になりたい何か

技術者になりたい何かの覚書的な何かです

ファイルの同一性を確認するためのハッシュ値計算あれこれ

そのファイルほんとに同一ですか?ってときに使うハッシュ値による確認方法まとめ

■どんなときに使う?

インストールメディアとか、パッチとかが正しいものかの確認したいとき
でかいファイルの転送テストとかのときに、中断して再開して転送完了したけど、そのファイル壊れてないか確認したいとき

■種類

cksum CRC 基本32bit?
md5sum md5 128bit
sha1sum SHA1 160bit
sha256sum SHA256 256bit

他にも下記があって、それぞれ数字がbit長
sha224sum
sha256sum
sha384sum
sha512sum

当然ハッシュ値が長いほうが信頼性が高いです。
出力結果のハッシュ値が同一ならば、そのファイルは同一ですが、各アルゴリズムによって信頼性は変わります。
※短ければ短いほど衝突の可能性が高くなる
ので、確認したい対象と求められる正確性に応じて適宜適当なものを選ぶのが良い気がします。
※大量のファイルをチェックするなら衝突の可能性が一番高いcksumはやめたほうがいいけど、数個のファイルの同一性を確認したいときにそんなに衝突するかという話。

■実行結果と時間

対象をCentOSのインストール用ISO(DVD版)として、各コマンドでハッシュ値を計算してみます。
ついでにtimeコマンドで時間も測ってみます。

実行環境はメイン機のArch。

$ cat /proc/cpuinfo | grep 'model name'
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor

実行結果

$ time cksum CentOS-7-x86_64-DVD-1810.iso 
2792377078 4588568576 CentOS-7-x86_64-DVD-1810.iso

real	0m47.911s
user	0m15.538s
sys	0m1.453s
$ time md5sum CentOS-7-x86_64-DVD-1810.iso 
5b61d5b378502e9cba8ba26b6696c92a  CentOS-7-x86_64-DVD-1810.iso

real	0m47.165s
user	0m8.858s
sys	0m1.454s
$ 
$ time sha1sum CentOS-7-x86_64-DVD-1810.iso 
7ac72a080ce8ca79d39804f713684119b908941a  CentOS-7-x86_64-DVD-1810.iso

real	0m46.512s
user	0m3.903s
sys	0m1.766s
$ 
$ time sha256sum CentOS-7-x86_64-DVD-1810.iso 
6d44331cc4f6c506c7bbe9feb8468fad6c51a88ca1393ca6b8b486ea04bec3c1  CentOS-7-x86_64-DVD-1810.iso

real	0m48.070s
user	0m4.953s
sys	0m1.993s
$ 
$ 
$ time sha512sum CentOS-7-x86_64-DVD-1810.iso 
332cfc3593b091ac0e157a800fb1c1599f9f72e69441e46b50ed84f5ab053b7681ebf4ed660a6a8bfccbf8e3ae9266e3c6016f08439fc36e157ef7aa8be7b14a  CentOS-7-x86_64-DVD-1810.iso

real	0m53.131s
user	0m9.130s
sys	0m1.366s
$ 

意外と時間は変わりませんでした。
realが結構かかってるのは他のいろいろ作業しながらかもしれないけども。

スペックがアレなサーバ機でやってみます。

$ cat /proc/cpuinfo | grep 'model name'
model name	: AMD Athlon(tm) 64 X2 Dual Core Processor 4800+
model name	: AMD Athlon(tm) 64 X2 Dual Core Processor 4800+
$ 
$ time cksum CentOS-7-x86_64-DVD-1810.iso 
2792377078 4588568576 CentOS-7-x86_64-DVD-1810.iso

real	0m31.085s
user	0m19.724s
sys	0m3.812s
$ 
$ time md5sum CentOS-7-x86_64-DVD-1810.iso 
5b61d5b378502e9cba8ba26b6696c92a  CentOS-7-x86_64-DVD-1810.iso

real	0m30.702s
user	0m13.716s
sys	0m4.680s
$ 
$ time sha1sum CentOS-7-x86_64-DVD-1810.iso 
7ac72a080ce8ca79d39804f713684119b908941a  CentOS-7-x86_64-DVD-1810.iso

real	0m30.768s
user	0m19.320s
sys	0m4.420s
$ 
$ time sha256sum CentOS-7-x86_64-DVD-1810.iso 
6d44331cc4f6c506c7bbe9feb8468fad6c51a88ca1393ca6b8b486ea04bec3c1  CentOS-7-x86_64-DVD-1810.iso

real	0m40.900s
user	0m36.628s
sys	0m3.452s
$ 
$ time sha512sum CentOS-7-x86_64-DVD-1810.iso 
332cfc3593b091ac0e157a800fb1c1599f9f72e69441e46b50ed84f5ab053b7681ebf4ed660a6a8bfccbf8e3ae9266e3c6016f08439fc36e157ef7aa8be7b14a  CentOS-7-x86_64-DVD-1810.iso

real	0m30.863s
user	0m24.856s
sys	0m3.876s
$ 

これまた意外と時間変わりませんね。256より512が短くなってるのは何かのタイミングの問題でしょう。たぶん。

■ちなみに1

Linux系のインストールイメージとかは検証用に各DLページあたりにハッシュ値が書いてあることが多いです。
指定されたアルゴリズムでDL後のISOファイルを検証してね。
https://www.debian.org/CD/verify
https://wiki.centos.org/Manuals/ReleaseNotes/CentOS7.1810?action=show&redirect=Manuals%2FReleaseNotes%2FCentOS7

■ちなみに2

opensslでも同じことができます。

$ openssl md5 CentOS-7-x86_64-DVD-1810.iso 
MD5(CentOS-7-x86_64-DVD-1810.iso)= 5b61d5b378502e9cba8ba26b6696c92a
$ 

使えるのは下記

$ openssl list -digest-commands
blake2b512        blake2s256        gost              md4               
md5               mdc2              rmd160            sha1              
sha224            sha256            sha3-224          sha3-256          
sha3-384          sha3-512          sha384            sha512            
sha512-224        sha512-256        shake128          shake256          
sm3               

$ 

実際のところ、簡単なファイル同一性確認ならcksumかmd5sum使うことが多いし、メディアやパッチの同一性確認ならDLページの指定形式使いますね。
ファイルの同一性の確認というだけならそんなにこだわらなくてもよいかと思います。

rsyslogのローテートを設定する

やること

rsyslogでローテート設定

状況

t-min.hatenablog.com

上記のときに設定したDHCPサーバのログがローテートされてない。ので一つのファイルにひたすらログ出力されていた。

使ってるのはisc-dhcp-server。
dhcpd.confでファシリティを7に設定→rsyslog.confでファシリティ7のログを/var/log/dhcp.logとして出力するように設定。

/etc/dhcp/dhcpd.confの該当箇所

authoritative;
log-facility local7;

/etc/rsyslog.confの該当箇所

※syslogに出力しない

*.*;auth,authpriv.none;local7.none		-/var/log/syslog

※messagesに出力しない

*.=info;*.=notice;*.=warn;\
	auth,authpriv.none;\
	cron,daemon.none;\
	mail,news.none;local7.none	-/var/log/messages

※/var/log/dhcp.logに出力

# isc-dhcp-server
local7.* /var/log/dhcpd.log

ある日なんとなく/var/logを眺めていると

dhcpd.logが一つしかないです。他のは番号付きでローテートされてるのに。
やな予感がして行数。

$ cat /var/log/dhcpd.log | wc -l
2862889

ちょっと!!

というわけでローテートの設定します。
rsyslogのローテート設定は/etc/logrotate.conf と /etc/logrotate.d/rsyslog。
デフォルトで勝手に専用ファイル作られるのもいくつかあります。

 ls /etc/logrotate.d
apache2  apt  cups-daemon  dpkg  exim4-base  exim4-paniclog  minidlna  mysql-server  nginx  pure-ftpd-common  rkhunter	rsyslog   samba  squid  vsftpd

/etc/etc/logrotate.d/rsyslog に定義を書いてあげれば、rsyslogでログ出力制御しているものは記述に従ってローテーとしてくれます。
今回はローテートに特にこだわりはないので(日付つけて毎日ローテとか別にしない)普通にsyslogなんかと合わせてローテさせます。
/etc/logrotate.d/rsyslog

/var/log/syslog
/var/log/iptables
/var/log/dhcpd.log ## ここ書き加え
{
	rotate 30
	daily
	missingok
	notifempty
	delaycompress
	compress
	postrotate
		invoke-rc.d rsyslog rotate > /dev/null
	endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
	rotate 30
	weekly
	missingok
	notifempty
	compress
	delaycompress
	sharedscripts
	postrotate
		invoke-rc.d rsyslog rotate > /dev/null
	endscript
}

これで毎日ローテ、30世代までとっとく、2個前のログは圧縮という動きをしてくれるはず。

設定できたら手動で強制ローテ

rsyslog再起動

$ sudo systemctl restart rsyslog

手動ローテ

$ sudo logrotate -f /etc/logrotate.conf

これで定義されてる全ログローテが手動実行のタイミングで行われます。
今回はdhcpd.logがちゃんとローテされていればおk。

このコマンドだと他のログも全部ローテされてしまうのがビミョーなとこですね。
一回設定ファイルでローテさせたくないログはコメントアウトしてから手動ローテかけて、その後にコメントアウト解除すれば大丈夫です。ちょっとめんどいですが。

conkyでCPUのコアごとのクロックを表示する

conkyとは

デスクトップに常に表示できるシステムモニター。

とはいえ単純にシステムモニタだけでなく、メディアと連動させたり天気予報やRSSフィード、メールなどと連動もできるすごい高機能なやつ。

wiki.archlinux.jp

設定は~/.conkyrcに記述するんだけど、かなりめんどいのでなにかベースをいじっていくのがよさげ。

 

conkyのCPUクロック表示をコアごとにしたい

僕が使ってるconkyは10年位前に設定ファイル作って、なにか変更するたびにちょいちょい設定ファイル書き換えたりして使ってきた盆栽のようなやつなのですが、CPUのクロック表示がコアごとになってなかったのです。

そもそも最初に設定作ったときはAthlon 64 x2だったので、クロック変動はCPU全体だったのですね。その後いろいろ構成変えたときに設定ファイルはいじったものの、どうやらコアごとのクロックは拾ってくれてませんでした。

 

これを解決。

askubuntu.com

もとの記述

 

Core1:$alignr ${cpu cpu1}%@${freq_g cpu1}GHz ${color #4B625A}${cpubar cpu1 7,76} ${color black}
Core2:$alignr ${cpu cpu2}%@${freq_g cpu2}GHz ${color #4B625A}${cpubar cpu2 7,76} ${color black}
Core3:$alignr ${cpu cpu3}%@${freq_g cpu3}GHz ${color #4B625A}${cpubar cpu3 7,76} ${color black}
Core4:$alignr ${cpu cpu4}%@${freq_g cp43}GHz ${color #4B625A}${cpubar cpu4 7,76} ${color black}
Core5:$alignr ${cpu cpu5}%@${freq_g cpu5}GHz ${color #4B625A}${cpubar cpu5 7,76} ${color black}
Core6:$alignr ${cpu cpu6}%@${freq_g cpu6}GHz ${color #4B625A}${cpubar cpu6 7,76} ${color black}
Core7:$alignr ${cpu cpu7}%@${freq_g cpu7}GHz ${color #4B625A}${cpubar cpu7 7,76} ${color black}
Core8:$alignr ${cpu cpu8}%@${freq_g cpu8}GHz ${color #4B625A}${cpubar cpu8 7,76} ${color black}

 

変更後

Core1:$alignr ${cpu cpu1}% @ ${exec awk '/cpu MHz/{i++}i==1{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu1 7,76} ${color black}
Core2:$alignr ${cpu cpu2}% @ ${exec awk '/cpu MHz/{i++}i==2{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu2 7,76} ${color black}
Core3:$alignr ${cpu cpu3}% @ ${exec awk '/cpu MHz/{i++}i==3{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu3 7,76} ${color black}
Core4:$alignr ${cpu cpu4}% @ ${exec awk '/cpu MHz/{i++}i==4{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu4 7,76} ${color black}
Core5:$alignr ${cpu cpu5}% @ ${exec awk '/cpu MHz/{i++}i==5{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu5 7,76} ${color black}
Core6:$alignr ${cpu cpu6}% @ ${exec awk '/cpu MHz/{i++}i==6{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu6 7,76} ${color black}
Core7:$alignr ${cpu cpu7}% @ ${exec awk '/cpu MHz/{i++}i==7{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu7 7,76} ${color black}
Core8:$alignr ${cpu cpu8}% @ ${exec awk '/cpu MHz/{i++}i==8{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu8 7,76} ${color black}

 

これでコアごとのクロック表示(Mhz)が可能に。

 

仕組み

仕組みは簡単で、/proc/cpuinfoからcpu Mhzの行を取得して整形しているだけですね。

 

[tmin@tmin_Arch ~]$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 23
model : 1
model name : AMD Ryzen 5 1500X Quad-Core Processor
stepping : 1
microcode : 0x8001137
cpu MHz : 2868.184
cache size : 512 KB
physical id : 0
siblings : 8
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate sme ssbd sev ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca
bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 6988.16
TLB size : 2560 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]
~~以下略〜〜

 

ちなみにlua構文

いつの間にかconkyのバージョンが変わってlua構文になっていました。

自力で書き直そうとしたけどめんどくさかったので、スクリプト使いました。

github.com

Usage: convert.lua old_conkyrc [new_conkyrc]

とあるように、もとの.conkyrcをスクリプトに読ませればおk。

 

Sponsored Link