web-dev-qa-db-ja.com

udevがデバイスノードを作成するまでsystemdがユニットを起動しないようにする方法

ブート中にUBIファイルシステムをマウントしたい。構成に応じて、MTDデバイス番号はビルドごとに異なる場合がありますが、常にaddと呼ばれるパーティションになります。

次のファイルを追加しました

# /usr/lib/udev/rules.d/76-mtd-alias.rules
ACTION!="add", GOTO="mtd_alias_end"
SUBSYSTEM=="mtd", SYMLINK="mtd-byname/$attr{name}", TAG+="systemd"
LABEL="mtd_alias_end"

これにより、/dev/mtd-by-name/addなどのファイルが、関連する/dev/mtdblockXファイルへのシンボリックリンクとして作成されます(Xは構成に依存します)。

# /usr/lib/systemd/system/mnt-data.mount
[Unit]
Description=Mount data partition
Requires=data-attach.service
After=data-attach.service
[Mount]
What=ubi0_0
Where=/mnt/data
Type=ubifs

一緒に

#/usr/lib/systemd/system/data-attach.service
[Unit]
Description=Attach data ubi partition

[Service]
Type=oneshot
RemainAfterExit=yes
Requires=dev-mtd\x2dbyname-add.device
After=dev-mtd\x2dbyname-add.device
ExecStart=/usr/sbin/ubiattach /dev/ubi_ctrl -p /dev/mtd-byname/add
ExecStop=/usr/sbin/ubidetach /dev/ubi_ctrl -p /dev/mtd-byname/add

問題は、systemddoesdata-attach.serviceを開始しますが、udevがシンボリックリンクを作成する前にそれを実行することです。

システムの起動後、マウントは失敗しましたが、deviceが開始されたことがわかります。

# systemctl status data-attach.service
● data-attach.service - Attach data ubi partition
   Loaded: loaded (/lib/systemd/system/data-attach.service; static; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2018-06-22 11:11:50 UTC; 7min ago
  Process: 164 ExecStart=/usr/sbin/ubiattach /dev/ubi_ctrl -p /dev/mtd-byname/add (code=exited, status=255)
 Main PID: 164 (code=exited, status=255)

Jun 22 11:11:50 LogiPeru ubiattach[164]: libubi: error!: cannot stat "/dev/mtd-byname/add"
Jun 22 11:11:50 LogiPeru ubiattach[164]:         error 2 (No such file or directory)
Jun 22 11:11:50 LogiPeru ubiattach[164]: ubiattach: error!: cannot attach "/dev/mtd-byname/add"
Jun 22 11:11:50 LogiPeru ubiattach[164]:            error 2 (No such file or directory)
Jun 22 11:11:50 LogiPeru systemd[1]: Starting Attach data ubi partition...
Jun 22 11:11:50 LogiPeru systemd[1]: data-attach.service: Main process exited, code=exited, status=255/n/a
Jun 22 11:11:50 LogiPeru systemd[1]: data-attach.service: Failed with result 'exit-code'.
Jun 22 11:11:50 LogiPeru systemd[1]: Failed to start Attach data ubi partition.

しかし、deviceはロードされました:

# systemctl status 'dev-mtd\x2dbyname-add.device'
● dev-mtd\x2dbyname-add.device - /dev/mtd-byname/add
   Follow: unit currently follows state of sys-devices-virtual-mtd-mtd10.device
   Loaded: loaded
   Active: active (plugged) since Fri 2018-06-22 11:11:50 UTC; 10min ago
   Device: /sys/devices/virtual/mtd/mtd10
# ls -l /dev/mtd-byname/add
lrwxrwxrwx    1 root     root             8 Jun 22 11:11 /dev/mtd-byname/add -> ../mtd10

どこで私は間違えましたか? data-attach.serviceRequiresおよびAfterラベルが無視されるのはなぜですか?ログインできるようになるまで待つと、systemctl start mnt-data.mountを実行でき、マウントが成功します。

2
NickStoughton
[Service]
<...>
Requires=dev-mtd\x2dbyname-add.device
After=dev-mtd\x2dbyname-add.device

Requires= および After= ディレクティブをユニットファイルの[Unit]セクションに配置する必要があります。 [Service]またはその他のセクションでは機能しません。

将来の診断のためのアドバイス:systemctl daemon-reloadは、他のsystemctl動詞と同様に、その警告とエラーをシステムログのみに書き込み、systemctlのstdout/stderr(コンソールなど)には書き込みません。特に、systemctl daemon-reloadは、systemdと通信できないなどの重大なエラーの失敗のみを報告します。したがって、systemctlコマンドの後にjournalctl -e _PID=1のようなものを使用してシステムログを手動で確認することが有益な場合があります。

2
intelfx