小编fdm*_*ion的帖子

导致在网络启动后执行脚本?

我对 systemd 比较陌生,正在学习它的架构。

现在,我正试图弄清楚如何使自定义 shell 脚本运行。该脚本需要运行后,网络层已启动。

我正在运行 Arch,使用 systemd 和 netctl。

为了测试,我编写了一个简单的脚本,它只执行ip addr list > /tmp/ip.txt. 我为此脚本创建了以下服务文件。

(/etc/systemd/system/test.service)
[Unit]
Description=test service

[Service]
ExecStart=/root/test.script

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

然后我启用了脚本,

systemctl enable test
Run Code Online (Sandbox Code Playgroud)

重新启动后,脚本确实会运行,但它会在网络启动之前运行。换句话说,中的输出ip.txt显示没有分配给主接口的 IPv4 地址。到我登录时,IPv4 地址确实已分配并且网络已启动。

我猜我可以通过弄乱WantedBy参数来改变脚本运行的点,但我不知道该怎么做。

有人能指出我正确的方向吗?

networkmanager systemd

125
推荐指数
3
解决办法
17万
查看次数

如何覆盖 systemd 单元文件设置?

我已经在我的 Arch Linux 服务器上安装了 MySQL。我将数据目录移动到 /home 下的一个位置,我的 RAID 卷安装在该位置。我注意到默认情况下 mysqld 不会在此配置中启动,因为 systemd 单元包含设置ProtectHome=true

我要重写只是此设置。我不想重新指定ExecStart或类似的命令,以防它们在软件包升级时发生变化。

我尝试在/etc/systemd/system调用时创建一个简单的文件mysqld.service并只添加了以下几行:

[Service]
ProtectHome=false
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它看起来像是 /etc 中的服务替换而不是覆盖系统服务。

有没有办法在不直接修改 /usr/lib/systemd/system 中的文件的情况下以这种方式覆盖 systemd 单元文件中的设置?(这是我现在所做的临时修复,尽管如果更新包最终会恢复)

systemd

33
推荐指数
2
解决办法
3万
查看次数

使用overlayfs时切换root后释放initramfs ram?

我正在构建一个基于 Arch Linux 的自定义 Live Linux 启动映像。我修改了股票 initrd 以包含一个自定义脚本,它执行以下操作:

  • 启动后,只有 initramfs 存在。我首先在/image.
  • 然后,我在/ro.
  • 然后,我挂载 tmpfs并在该目录中/rw创建目录。datawork
  • 最后,我使用/ro作为底层、/rw/data顶层和/rw/work工作目录安装了一个overlayfs 。我在/new_root.
  • 我现在使用switch_root切换到/new_root并继续启动。

这种方法的问题在于,initramfs 内容在系统启动后仍会很好地保留在 RAM 中。

有什么办法可以重新处理这个过程,以便在切换到真正的根目录后,可以从内存中删除 initramfs?这很重要的原因是因为我试图在一个小内存占用机器 (192MB) 上启动我的实时 Linux 并且 initrd 的大小(我基于 initramfs-fallback)意味着在一切都启动后,我只有大约30MB 可用内存。相比之下,典型安装的 Arch Linux 将仅使用大约 18MB 的 RAM。这向我表明解压后的 initramfs(大约 66MB)肯定仍在 RAM 中,还有另外 66MB 左右的 RAM,我无法从中弄清楚使用情况。(也许出于某种原因,initramfs 实际上在 RAM 中是重复的?)

我显然可以缩小我的 initramfs(我正在研究如何指定要包含在包中的特定模块),但即便如此,在低内存系统上启动后仍将使用大量 RAM。


编辑:我想我返工initramfs中简单地安装上一个tmpfs的/image,然后该脚本创建rwro以及work内部目录 …

livecd initramfs

7
推荐指数
1
解决办法
2616
查看次数

Alpine:即使会破坏依赖关系,如何强行删除包?

我正在尝试使用 Alpine 构建一个超小型的 Linux。我不需要,linux-firmware因为它为所有东西都安装了固件,占用了 300+MB 的空间。这是一个库存安装。但是我无法卸载任何 linux-firmware 软件包:

dev-alpine:~# apk del --force --force-broken-world linux-firmware
World updated, but the following packages are not removed due to:
  linux-firmware: linux-vanilla

OK: 504 MiB in 122 packages
Run Code Online (Sandbox Code Playgroud)

超过一半的库存安装是固件!

除了删除文件本身(这将在更新时恢复!),我如何强制 Alpine 删除我不需要的所有固件文件?

(鉴于固件文件似乎已经被分离出来,似乎在某些时候认为您只想有选择地安装您需要的固件……但即使这样也行不通:)

dev-alpine:~# apk del --force --force-broken-world linux-firmware-amdgpu
World updated, but the following packages are not removed due to:
  linux-firmware-amdgpu: linux-firmware linux-vanilla

OK: 504 MiB in 122 packages
Run Code Online (Sandbox Code Playgroud)

alpine-linux

6
推荐指数
1
解决办法
3388
查看次数

使用 find/xargs 命令根据其父目录重命名文件?

我有一个这样的目录结构:

Project/
  |
  +--Part1/
  |    |
  |    +--audio.mp3
  |
  +--Part2/
  |    |
  |    +--audio.mp3
  |
  +--Part3/
  |    |
  |    +--audio.mp3
...
Run Code Online (Sandbox Code Playgroud)

我想最终得到名为 Part1.mp3、Part2.mp3 等的文件。

每个文件夹只包含一个文件,因此不存在破坏文件或处理多个同名文件的风险。

我觉得我可以用某种find/xargs命令加上cutandmv但我无法弄清楚如何实际形成命令。

bash find shell-script rename files

5
推荐指数
3
解决办法
3024
查看次数

使用 grep 过滤后,是否有在终端中重新对齐表格数据的技巧?

我得到的很好的例子:

  • 尝试ss -axl显示正在侦听的 UNIX 域套接字。例如,这可能会给出:

      Netid     State      Recv-Q     Send-Q                                                                Local Address:Port              Peer Address:Port     
      u_str     LISTEN     0          0                                                              /run/systemd/private 9683                         * 0        
      u_str     LISTEN     0          0                                                        /run/systemd/fsck.progress 9690                         * 0        
      u_str     LISTEN     0          0                                                       /run/systemd/journal/stdout 9705                         * 0        
      u_str     LISTEN     0          0                                                   /var/run/dbus/system_bus_socket 13830                        * 0        
      u_str     LISTEN     0          0                                                                   /run/thd.socket 13833                        * 0        
      u_str     LISTEN     0          0                                                              /var/run/docker.sock 13835                        * 0        
      u_str     LISTEN     0          0                                                          /run/avahi-daemon/socket 13837                        * 0        
      u_str     LISTEN     0          0                                                    /run/user/1000/systemd/private 16088                        * 0        
      u_str …
    Run Code Online (Sandbox Code Playgroud)

whitespace columns text-formatting

3
推荐指数
1
解决办法
72
查看次数

如何在没有中间文件的情况下将多个命令的结果和管道连接到另一个?

假设我有四个非常大的文本文件,都用 xz 压缩。

file1.log.xz
file2.log.xz
file3.log.xz
file4.log.xz
Run Code Online (Sandbox Code Playgroud)

我想做的是将这四个文件的未压缩内容连接成一个新文件file.xz。问题是,我希望不必通过中间文件。

这些文件是非常大的日志文件,大小为千兆字节。压缩后,它们小于 100MB,但如果我要扩展所有四个文件然后重新连接,我至少需要 30GB 的存储空间来存储未压缩的文件。当然,我可以将cat所有未压缩的文件xz重新压缩:

cat file1.log file2.log file3.log file4.log | xz -ve9 - > newfile.log.xz
Run Code Online (Sandbox Code Playgroud)

我知道如何在没有中间件的情况下在命令行中连接两个文件,假设一个未压缩,一个已压缩:

xz -d -c file2.log.xz | cat file1.log - | xz -ve9 - > files1and2.log.xz
Run Code Online (Sandbox Code Playgroud)

但这仅适用于一个文件,其中之一必须已经解压缩。

我不确定我是否可以cat将各种 .xz 文件放在一起 - 让我们假设它们可能已经用不同的参数进行了压缩。

在更高的层次上,可以问这个问题本身:您能否获取多个(超过两个)命令的输出,连接这些输出,并将它们通过管道传输到另一个进程而无需中间文件?(假设场景:假设我正在使用输出到 stdout 的脚本对所有四个非常大的文件进行某种处理,并希望将输出放入另一个压缩文件中。)

是否可以仅使用 shell 命令来执行此操作?

pipe shell-script xz

1
推荐指数
1
解决办法
1536
查看次数