我对 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
参数来改变脚本运行的点,但我不知道该怎么做。
有人能指出我正确的方向吗?
我已经在我的 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 单元文件中的设置?(这是我现在所做的临时修复,尽管如果更新包最终会恢复)
我正在构建一个基于 Arch Linux 的自定义 Live Linux 启动映像。我修改了股票 initrd 以包含一个自定义脚本,它执行以下操作:
/image
./ro
./rw
创建目录。data
work
/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
,然后该脚本创建rw
,ro
以及work
内部目录 …
我正在尝试使用 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) 我有一个这样的目录结构:
Project/
|
+--Part1/
| |
| +--audio.mp3
|
+--Part2/
| |
| +--audio.mp3
|
+--Part3/
| |
| +--audio.mp3
...
Run Code Online (Sandbox Code Playgroud)
我想最终得到名为 Part1.mp3、Part2.mp3 等的文件。
每个文件夹只包含一个文件,因此不存在破坏文件或处理多个同名文件的风险。
我觉得我可以用某种find
/xargs
命令加上cut
andmv
但我无法弄清楚如何实际形成命令。
我得到的很好的例子:
尝试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)假设我有四个非常大的文本文件,都用 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 命令来执行此操作?
shell-script ×2
systemd ×2
alpine-linux ×1
bash ×1
columns ×1
files ×1
find ×1
initramfs ×1
livecd ×1
pipe ×1
rename ×1
whitespace ×1
xz ×1