如何删除 sysV 服务的 systemd 包装器脚本并改用单元文件?

6 linux arm debian systemd

我正在尝试取消配置或删除systemd旧 sysV 服务的包装器脚本。包装器由 Debian 软件包提供,所以我不能删除它。

包装器显示为工件并列为“生成”:

$ systemctl list-unit-files | grep -i -E 'rng|rand'
rng-tools.service                      generated
systemd-random-seed.service            static
urandom.service                        static
Run Code Online (Sandbox Code Playgroud)

我systemd根据创建和修改 systemd 单元文件添加了一个新服务来替换它:

# touch /etc/systemd/system/rng-tools.service
# chmod 664 /etc/systemd/system/rng-tools.service
# emacs /etc/systemd/system/rng-tools.service
<edit file>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试启用新的服务文件时,将使用旧的 sysV 脚本:

# systemctl enable rng-tools
Synchronizing state of rng-tools.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable rng-tools
Run Code Online (Sandbox Code Playgroud)

搜索结果为 0 次命中以删除旧包装器。我得到了很多类似的点击,比如创建一个包装脚本。但我还没有找到有关从systemd的数据库中删除一个的信息。

如何取消配置或删除 sysV 服务的 systemd 包装器脚本?


这是斯蒂芬建议后的结果。rng-tools.service正在使用新的:

$ systemctl status rng-tools
? rng-tools.service - Entropy daemon for /dev/random using a hardware RNG
   Loaded: loaded (/etc/systemd/system/rng-tools.service; enabled; vendor preset
   Active: failed (Result: exit-code) since Mon 2018-10-15 07:19:32 EDT; 20min a
 Main PID: 674 (code=exited, status=1/FAILURE)
Run Code Online (Sandbox Code Playgroud)

和:

# journalctl -b -u rng-tools.service
-- Logs begin at Mon 2018-10-15 07:19:29 EDT, end at Mon 2018-10-15 07:49:13 EDT. --
Oct 15 07:19:31 beaglebone systemd[1]: Started Entropy daemon for /dev/random using a hardware RNG.
Oct 15 07:19:31 beaglebone rngd[674]: can't open /dev/hwrng: No such file or directory
Oct 15 07:19:32 beaglebone systemd[1]: rng-tools.service: Main process exited, code=exited, status=1/FAILURE
Oct 15 07:19:32 beaglebone systemd[1]: rng-tools.service: Unit entered failed state.
Oct 15 07:19:32 beaglebone systemd[1]: rng-tools.service: Failed with result 'exit-code'.
Run Code Online (Sandbox Code Playgroud)

和:

# dd if=/dev/hwrng count=16 bs=1
??????3?? ??#16+0 records in
16+0 records out
16 bytes (16 B) copied, 0.00942799 s, 1.7 kB/s
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这是新的rng-tools.service:

# cat /etc/systemd/system/rng-tools.service
# ...

[Unit]
Description=Entropy daemon for /dev/random using a hardware RNG
After=syslog.target
Requires=syslog.target

[Service]
Type=simple
ExecStart=/usr/sbin/rngd -r /dev/hwrng -f

[Install]
WantedBy=basic.target
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 7

Synchronizing state of rng-tools.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable rng-tools
Run Code Online (Sandbox Code Playgroud)

仅意味着 systemd “知道”存在sysvinit-style init 脚本,并且在考虑rng-tools服务状态时需要将其考虑在内。这并不意味着它将使用init 脚本来管理服务。

如果 init 脚本和单元文件都存在,systemd 将使用后者(至少,当服务未运行时)。

您可以通过运行查看哪个文件用于启动服务systemctl status;“已加载”行将显示使用了哪个脚本。例如,这是一个同时具有 systemd 单元和 init 脚本的服务:

? infnoise.service - Wayward Geek InfNoise TRNG driver
   Loaded: loaded (/lib/systemd/system/infnoise.service; enabled; vendor preset: enabled)
Run Code Online (Sandbox Code Playgroud)

这是一个只有 init 脚本的服务:

? sensord.service - LSB: lm-sensors daemon
   Loaded: loaded (/etc/init.d/sensord; generated; vendor preset: enabled)
Run Code Online (Sandbox Code Playgroud)

检查您的服务应该表明 systemd 正在使用您的新单元。

如果所有其他方法都失败了,您可以删除/etc/init.d/rng-tools:它应该作为 conffile 进行跟踪,并且dpkg会注意到它已被删除并且不会在软件包升级时恢复它。/etc归系统管理员所有,而不是打包系统,即使包可以在那里安装文件。