技術者になりたい何か

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

ip link set [DEV] up/down とifup/downの挙動の違い

RHEL7系でNetworkManagerを無効にしてある環境下で特定のネットワークインターフェイスのダウン・アップをするときに
ip link set [DEV] down → ip link set [DEV] up するとデフォルトゲートウェイが消える。
ifdown [DEV] → ifup [DEV] だと大丈夫。

■結論

ipコマンドでやってるのは単純にインターフェイスのダウン・アップのみであり、アップ時に設定ファイル(/etc/sysconfig/network-script/配下のifcfg-e* は読み込んでない。
設定ファイル読み込ませてダウン・アップするにはnmcli使わなきゃいけない。
nmcliコマンドはNetworkManagerのコマンドなので、無効にしてあると使えない。
NetworkManager無効にしてある環境ではifdown → ifup すれば設定ファイル読み込んで起動してくれる。

■とある環境で

NetworkManager無効、/etc/sysconfig/network-script/ifcfg-ethX の設定ファイル直接書き換えでネットワーク設定済み。
ifup,ifdownはnet-tools系と同じく古くて非推奨になったものだと思い込み、今までifdown,ifupでやってた手順をip link set [ethX] down|up してみたところ、
デフォルトゲートウェイの設定が消失。

いろいろ調べてみると、どうもipコマンドでのリンクUPは単にネットワークのリンクをダウン/アップさせるだけで、設定ファイルは読み込まない模様。

serverfault.com


>>ifup is a command that reads the /etc/network/interfaces (or other files depending on distro) brings the link up and correctly configures the interfaces as specified.
>>Running ip link only changes or shows the link status. It does not read the configuration file, it does not make any other changes.

unix.stackexchange.com

確かにmanコマンド叩いても、ipコマンドのとこには設定ファイルどうこうの記述はないっぽい。

$ man ip
~~途中省略~~
       ip link set x up
           Bring up interface x.

       ip link set x down
           Bring down interface x.
~~以下省略~~

ifupの方は設定ファイル使うよ、っていう記述あり。

$ man ifup
~~途中省略~~

       The ifup and ifdown commands may be used to configure (or, respec- tively, deconfigure) network interfaces based on interface definitions in
       the files /etc/sysconfig/network and /etc/sysconfig/network-scripts/ifcfg-<configuration>
~~以下省略~~

■どうしてこうなった

以下多分。
ipコマンドはそもそも最近ちゃんとメンテされてないnet-toolsの中のifconfigコマンドを置き換える形で入ったものだった。
ifconfigによるUP/DOWNとifup/downの違いは下記。

>>ifconfig <デバイス名> down
>>単にネットワークのリンクをダウンさせます。よってipアドレスが設定されていた場合、ipアドレスは保持されます。


>>ifdown <デバイス名>
>>以下のファイルに従い処理が実行されます。
>>/etc/sysconfig/network-scripts/ifdown

tooljp.com

なのでipコマンドは単純にネットワークのリンクをダウン/アップさせるだけのもの、なのかな?

■そうしてどうなった

RHEL7系の場合、nmcliを使用してダウン/アップさせれば設定ファイルを読み込んでUPしてくれる模様。

milestone-of-se.nesuke.com

nmcliコマンドを使用するにはNetworkManager必須。NetworkManager管理下のインターフェイスに対してしか使えない模様。

本来はRHEL7系ではNetworkManagerを有効にして使われることが想定されているので、
ip コマンドでは一時的な設定、nmcliでは恒久的な設定(設定ファイルを書き換える)という使い分けをするのが推奨の手順のようです。

■そうはいっても

6系まではnet-toolsと設定ファイル直接編集がメジャーな設定だったわけで、NetworkManagerは設定ファイル勝手に書き換えたり、設定ファイル無視して立ち上がることがあったりとビミョーな挙動をとることも少なくなく、そのため嫌われ者だったりもしますね。
今更NetworkManager有効にしてこれを中心の運用にするのはそれはそれで慣れないやり方をみんなが取ることになって、別の意味で危なかったりする気がします。

簡単に移行できる方々は移行したらいいと思うし、抵抗がある方々は併用すればいいんじゃないでしょうか。

■ちなみに

/etc/sysconfig/network-scripts/配下にifup,ifdownのスクリプトがおいてあって、それぞれ/usr/sbin/配下の同コマンドへのシンボリックリンクになっています。

$ ls -l /etc/sysconfig/network-scripts/ifup
lrwxrwxrwx. 1 root root 22 Feb 22 13:49 /etc/sysconfig/network-scripts/ifup -> ../../../usr/sbin/ifup
$ ls -l /etc/sysconfig/network-scripts/ifdown
lrwxrwxrwx. 1 root root 24 Feb 22 13:49 /etc/sysconfig/network-scripts/ifdown -> ../../../usr/sbin/ifdown

これらはただのスクリプトなので、catで見ることができます。

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

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

■どんなときに使う?

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

■種類

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。

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

Sponsored Link