Linux kernelの起動オプションとsystemd設定で自分がよく使うものです。CGroup V2 (解説スライド)使用前提です。
CGroup 2 への対応状況
Linux kernel 起動オプション
再設定方法
-
/etc/default/grub
のGRUB_CMDLINE_LINUX_DEFAULT
に指定したいカーネルオプションを追加する -
update-grub
をroot
で実行する
CGroup V2 の使用
systemd.unified_cgroup_hierarchy=1
を追加する。cgroup_no_v1=all
を同時に指定してもよい
IOMMU の使用
IOMMUが付属するハードウェアではIOMMUを使用したほうがCPUによるDMA転送を回避できるし、ソフトウェアTLBバッファーの不足による入出力の失敗が起きないためよいと思われる
iommu=force,merge,nopanic,nopt intel_iommu=on amd_iommu=on swiotlb=noforce
を追加する
CPUの脆弱性に対する防御をやめて高速化する(自己責任で)
mitigations=off
Panasonic Let's Note
i8042.reset=1 psmouse.synaptics_intertouch=1
systemd の設定
ログの保存
[Journal]
Storage=persistent
と書かないとログが残らないので上記のように設定する。
Accounting
/etc/systemd/system.conf.d/myconf.conf
と /etc/systemd/user.conf.d/myconf.conf
に下記内容を追加してサービスの実行情報を収集・記録する
DefaultCPUAccounting=On
DefaultMemoryAccounting=On
DefaultTasksAccounting=On
DefaultIOAccounting=On
DefaultIPAccounting=On
ネットワークスピードメーター (systemd-networkd利用時)
[Network]
SpeedMeter=yes
SpeedMeterIntervalSec=10sec
スピード確認は networkctl status
ログアウトしたときにそのユーザーのプロセスを全部殺す
[Login]
KillUserProcesses=yes
一般ユーザーがログアウト後も実行され続けるプロセスを立ち上げたいときにはloginctl enable-linger
をそのユーザーが呼び出してから、例えば systemd-run --user --nice=19 --remain-after-exit --unit=好きな名前 /usr/bin/sleep 10000
などのように起動する。環境変数の内容はほとんど引き継がれないので、環境変数を引き継ぎたいときは --scope
を付けるか、-E
を使う。
ユーザーごとの占有リソース制限(systemd 240以降)
[Slice]
MemoryHigh=90%
TasksMax=70%
で特定のユーザーがシステムの実メモリーやプロセスをすべて使い切ってシステムを使用不可能にすることを回避できる
CGroup2コントローラーの一般ユーザーによる使用
[Service]
AllowedCPUs=0-15 # systemd 244 以降。
# 15は/proc/cpuinfoの最大のCPU番号にする
Delegate=yes
で、systemd-run --user
や systemctl --user
で開始するサービスがCGroup2 のすべてのリソースコントローラーを使えるようになる。LXCを一般ユーザーから開始するときにはこれをやっておかないとコンテナが全部のCGroupコントローラーを使えない。
ディスクスケジューラーの変更(Fedora 31だと不要)
udevの話ですがudevがsystemdに取り込まれているのでメモします
-
/etc/initramfs-tools/modules
にbfq
を追加し、update-initramfs -u
する -
/etc/udev/rules.d/60-block-scheduler.rules
にACTION=="add|change", SUBSYSTEM=="block", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="bfq", ATTR{queue/iosched/low_latency}="0"
と書く(low_latency
のところは好みで) - 再起動
rpcbind.socket の依存関係修正
rpcbind.socketの立ち上がりが早すぎてコンテナ内の systemd-sysusers.service
がハングアップすることがある。これを阻止するには下記の設定ファイルを作る。
[Unit]
After=systemd-sysusers.service
物理インターフェースの上にipvlanインターフェースを立ててそこで通信する
Avahi, Network Manager, netplan, isc-dhcp-client, ifupdown など他のネットワーク関連パッケージでやることをsystemd に一元化することも可能。
systemd-nspawn
でコンテナを立ててそのコンテナに独自のIPアドレスを与えてホストと同一のLANに接続するときにはmacvlanを使う必要がある(systemd-nspawn --network-macvlan=物理インターフェース
)。しかし無線LANの上にmacvlanを立ててもプロミシャスモードが使えずまともに動作しないため、ipvlanを用いる必要がある。そのようば場合の設定ファイルは以下のようになる。物理無線インターフェースの名前は wl
で始まるとする。
[Match]
Name=wl*
[Network]
IPVLAN=ipvlan0 # この行を名前を変えて繰り返せば複数のipvlanを作れる
# ipvlan を複数作るならNameの部分を変えて複数のファイルを作る
[NetDev]
Name=ipvlan0
Kind=ipvlan
[IPVLAN]
Mode=L2
Flags=bridge
[Match]
Name=ipvlan0*
[Network]
DHCP=no #ipvlan のMACアドレスはホストと同じなのでDHCPは
# うまく動作しないことが多い。動作させるには工夫が必要
Address=192.168.1.200/24 # 手動でIPアドレスを振る。
# このアドレスが他のマシンに振られないようにDHCPサーバーを設定する
Gateway=192.168.1.1
DNS=192.168.1.1
MulticastDNS=yes
NTP=ntp.nict.jp