そのうち記事にするが、急いでCentOS8をインストールする用事があったので、リリース直後のCentOS8を物理マシンにセットアップしてみた。するとなんだかいろいろ奇妙なことが起こるので、一覧にしていくことにした。もしかしたら随時アップデートするハメになるかもしれない。というか備忘録を作らないと最終的な調整のために追い付かないような気がするので。
1. tarがない
古いマシンからのリプレースなので、古いマシンのディレクトリをコピーしようと
ssh origin 'cd /home/north ; tar cf - .' | ( cd /home/north ; tar xpf - )
したら、tar
がないと怒られた。Minimumにtar
を入れない判断はどうなのか。まあdnf
で入れたけどさ。
2. lsの挙動が変
なんか左側にへんなスペースが入るなーおかしいなと思っていたら、こんな事情だった。ファイル名にメタ文字が入るとシングルクォートで括るのだが、そのときクォートの分だけパディングが入って、そのせいで段組みが1文字分ずれるのだ。
これについてはTwitterでコメントを頂いた。
-N
オプションについてCentOS7のls (8.22)のmanpageを見ると、実は載っているが微妙に異なる。
-N, --literal
print raw entry names (don't treat e.g. control characters spe‐
cially)
CentOS8のls (8.30)はこうだ。
-N, --literal
print entry names without quoting
manpageには以前のバージョンから-Q
や--quoting-style
などのオプションはあるが、そもそもメタ文字をクォートする動作そのものについては何の説明もない。いつどのタイミングか分からないが、メタ文字の扱いが突然変更になったようだ。
-N
による動作の違いを比較してみると、
クォートされたファイルを含むと、有無を言わさずすべてのカラムにパディングが入るようだ。
とりあえず自分が言いたいのはこうだ。
- クォートしたい気持ちは分かるが、それはオプション動作であるべきでは?
- 指定したときにクォートしてほしい
- デフォルトでは「これまで通り」に動いてほしい
- クォートしたときに、されなかった行にパディングを入れる意味が分からない
- それは必要か? それは美しいのか?
- いずれにせよそれはオプションにして、デフォルトは「これまで通り」にしてほしい
- 何でもかんでも「新しく、変える」のはヤメてほしい
とにかくワークアラウンドとして、-N
をつけるしかないようだ。
3. .vimrcを読まなくなった(.vircに変わった)
自分はOSインストールのごく初期のステップで.vimrc
にset compatible
と書くのだが、それなのに画面の端に --INSERT--
と出るのに気づいた。つまり.vimrc
を読み込めていないのだ。なんでそんなことが起こるのか分からず、.vimrc
を読むルールを改めて調べてみたが、たとえばvimのマニュアルを見ても、特に何も書いていない。そこで「vimがどの.vimrcを読んだか」を調べる方法を調べた。すると :version
で分かる、と分かった。
system vimrc file: "/etc/virc"
user vimrc file: "$HOME/.virc"
2nd user vimrc file: "~/.vim/virc"
user exrc file: "$HOME/.exrc"
defaults file: "$VIMRUNTIME/defaults.vim"
ということで、CentOS8のvim(8.0)は .virc
を読むそうだ。このような記述はvimのマニュアルにはまったく書いてないので、どうしてこうなったのか理解できない。何かの拍子にコロっと.vimrc
に戻ることも考えられるので、symlinkを置いておくのがよいのではないかと思っている。
【9/28追記】
Twitterでこんな情報を見つけた。
示されたbugzillaはこちら。
- Bug 623654– vi (vim-minimal) chokes on .vimrc
vim-minimalは他のvimパッケージ用に書かれた.vimrcを読むとエラーを吐くので、.vimrcを読むべきではないという結論に至ったようだ。そしてCentOS8になり、デフォルトのvim-minimalは.vimrcを読まなくなったわけである。
vimに対する自分の態度は以前も記事にしたので繰り返さない。vim自身の互換性の問題についても特にコメントはない。自分は平和なrcしか書かないので、対応としては
ln -s .vimrc .virc
で大丈夫だと思う。
4. インストーラでWifiを使ったのにWifiドライバはインストールしてくれない
Minimumインストールが元凶なのかもしれないが、一応メモ。
GUIインストーラでWifiを設定してインストールし、DHCPでIPアドレスを貰い、NTPも受信でき、timezoneも設定でき、特に問題なくインストールが終わってリブートしてみると、NetworkManager-wifi
パッケージが入っていないのでネットに繋がらない。ネットに繋がらないのでdnfが動かず(一時的に)詰んでしまう。インストールメディアをマウントして/BaseOS/Packages
からwpa_supplicant
と NetworkManager-wifi
を手動でインストールしなければならない。
Wifiの設定はインストール時に作ったものが残っているので、そのままズバっと繋がる。たぶんインストーラのバグなのではないかと思う。
5. リゾルバの振る舞いが変わった(っぽい)
【9/30追加】
自宅LAN環境で、ルータをCentOS8に変えたら、名前解決に5200msぐらい時間がかかるようになってしまった。どうもIPv6がらみの問題っぽいが、徹底的にIPv6設定を排除しているにも関わらず事態が改善しない。問題はリゾルバっぽいなと思い立ち、/etc/resolv.conf
に次の設定を追記したら直った。
options single-request
これはglibcに対して「問い合わせの際にIPv4/IPv6アドレスを同時に問い合わせるのを抑制し、順に問い合わせる」という動作に変える。manpageにはこうある。
single-request (since glibc 2.10)
Sets RES_SNGLKUP in _res.options. By default, glibc per‐
forms IPv4 and IPv6 lookups in parallel since version
2.9. Some appliance DNS servers cannot handle these
queries properly and make the requests time out. This
option disables the behavior and makes glibc perform the
IPv6 and IPv4 requests sequentially (at the cost of some
slowdown of the resolving process).
当初、記述を見て「IPv6を問い合わせちゃうんだから事態は解決しないのでは…」と思っていたのだが、職場のHさんの助言で試したら改善したというオチだった。自宅のアクセス回線事業者が提供するDNSサーバが、この問題に当たっていたことが根本の原因だったようだ。クラウドのVMでは再現しないのでだいぶ首をひねることになった。
というわけでどうやらglibcのアップデートに伴いリゾルバの動作が変わったようなのだが、CentOS7のglibcのバージョンをチェックしてみると2.17だという(CentOS8は2.28)。なんか言ってることが合致しない…が、問題は解決したのでワークアラウンドということで示しておくことにする。
蛇足だが、resolv.confはNetworkManagerが上書きしてしまうので、固定化するために/etc/NetworkManager/NetworkManager.conf
の以下のセクションに追記しなければならない。
[main]
dns=none
6. nftablesがdisabled
【10/4追記】
CentOS8では、iptablesが廃止されnftablesに移行になったことがハイライトのひとつだった。nftablesでいろいろルールを作ったら、当然リブートに備えてセーブしておき、起動時にはちゃんとロードされるようにしておきたい。そのためにはたいていsysconfigディレクトリを見ればよい。案の定、/etc/sysconfig/nftables.confがあって、ご丁寧にこんな風に書いてあった。
#
# This this will contain your nftables rules and
# is read by the systemd service when restarting
#
# These provide an iptables like set of filters
# (uncomment to include)
# include "/etc/nftables/bridge-filter.nft"
# include "/etc/nftables/inet-filter.nft"
# include "/etc/nftables/ipv4-filter.nft"
# include "/etc/nftables/ipv4-mangle.nft"
# include "/etc/nftables/ipv4-nat.nft"
# include "/etc/nftables/ipv6-filter.nft"
# include "/etc/nftables/ipv6-mangle.nft"
# include "/etc/nftables/ipv6-nat.nft"
好きなルールを追記するとか、デフォルトのルールをコメントアウトしてロードできるというわけだ。
ところが、標準インストールではこの仕組みは働かない。
[root@c8 ~]# systemctl status nftables
● nftables.service - Netfilter Tables
Loaded: loaded (/usr/lib/systemd/system/nftables.service; enabled; vendor pr>
Active: inactive (dead)
Docs: man:nft(8)
[root@c8 ~]# systemctl is-enabled nftables
disabled
disabledになっているのだ。このためブート時のロード機構も動かず、ファイルにいくら記述しても無駄、ということになってしまう。ロードを有効にするなら
[root@c8 ~]# systemctl enable nftables
Created symlink /etc/systemd/system/multi-user.target.wants/nftables.service → /usr/lib/systemd/system/nftables.service.
しておかなければならない。ついでに言うと、firewalldと衝突しないように注意が必要だ。