LoginSignup
11
5

More than 3 years have passed since last update.

systemd設定とLinux起動オプションでよく使うもの(個人メモ)

Last updated at Posted at 2019-11-23

Linux kernelの起動オプションとsystemd設定で自分がよく使うものです。CGroup V2解説スライド)使用前提です。

CGroup 2 への対応状況

Linux kernel 起動オプション

再設定方法

  1. /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT に指定したいカーネルオプションを追加する
  2. update-grubrootで実行する

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 の設定

ログの保存

/etc/systemd/journald.conf
[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利用時)

/etc/systemd/networkd.conf
[Network]
SpeedMeter=yes
SpeedMeterIntervalSec=10sec

スピード確認は networkctl status

ログアウトしたときにそのユーザーのプロセスを全部殺す

/etc/systemd/logind.conf
[Login]
KillUserProcesses=yes

一般ユーザーがログアウト後も実行され続けるプロセスを立ち上げたいときにはloginctl enable-linger をそのユーザーが呼び出してから、例えば systemd-run --user --nice=19 --remain-after-exit --unit=好きな名前 /usr/bin/sleep 10000 などのように起動する。環境変数の内容はほとんど引き継がれないので、環境変数を引き継ぎたいときは --scope を付けるか、-E を使う。

ユーザーごとの占有リソース制限(systemd 240以降)

/etc/systemd/system/user-.slice.d/myuser.conf
[Slice]
MemoryHigh=90%
TasksMax=70%

で特定のユーザーがシステムの実メモリーやプロセスをすべて使い切ってシステムを使用不可能にすることを回避できる

CGroup2コントローラーの一般ユーザーによる使用

/etc/systemd/system/user@.service.d/myuser.conf
[Service]
AllowedCPUs=0-15 # systemd 244 以降。
# 15は/proc/cpuinfoの最大のCPU番号にする
Delegate=yes

で、systemd-run --usersystemctl --user で開始するサービスがCGroup2 のすべてのリソースコントローラーを使えるようになる。LXCを一般ユーザーから開始するときにはこれをやっておかないとコンテナが全部のCGroupコントローラーを使えない。

ディスクスケジューラーの変更(Fedora 31だと不要)

udevの話ですがudevがsystemdに取り込まれているのでメモします

  1. /etc/initramfs-tools/modulesbfq を追加し、update-initramfs -u する
  2. /etc/udev/rules.d/60-block-scheduler.rulesACTION=="add|change", SUBSYSTEM=="block", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="bfq", ATTR{queue/iosched/low_latency}="0" と書く(low_latencyのところは好みで)
  3. 再起動

rpcbind.socket の依存関係修正

rpcbind.socketの立ち上がりが早すぎてコンテナ内の systemd-sysusers.service がハングアップすることがある。これを阻止するには下記の設定ファイルを作る。

/etc/systemd/system/rpcbind.socket.d/after.conf
[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 で始まるとする。

/etc/systemd/network/wl.network
[Match]
Name=wl*

[Network]
IPVLAN=ipvlan0 # この行を名前を変えて繰り返せば複数のipvlanを作れる
/etc/systemd/network/ipvlan0.netdev
# ipvlan を複数作るならNameの部分を変えて複数のファイルを作る
[NetDev]
Name=ipvlan0
Kind=ipvlan

[IPVLAN]
Mode=L2
Flags=bridge
/etc/systemd/network/ipvlan0.network
[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 
11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5