๐ง Linux systemd ๆทฑๅ ฅ่งฃๆ่ๅๅๆต็จ็ฎก็
ๅจ็พไปฃ Linux ็ผ่ก็ไธญ,systemd ๅนพไนๆฏ้ ่จญ็ๅๅงๅ็ณป็ตฑ(init),่ฒ ่ฒฌ ้ๆฉๆต็จ、ๆๅ็ฎก็、ๆฅ่ช、ๅฎๆไปปๅ ่ ่ณๆบๆงๅถ ็ญๅทฅไฝ。ๆฌๆๅพ ๅๅ้ ๅฐ ๅฎๅ (unit)่จญ่จ、ๆ้ฏ、ๅฎๅ จๅผทๅ ่ ๆไฝณๅฏฆๅ,ๅธถไฝ ๅฎๆดๆๆก。
๐ ็ฎ้
- ไธ、้ๆฉๅๅ้(Boot Chain)
- ไบ、Unit ๅบ็ค:้กๅ、็ฎๆจ่ไพ่ณด
- ไธ、Service ่จญ่จ:Type、Restart、Environment
- ๅ、่ฆๅฏซ่ Drop-in:ไธๅๅๆชไน่ฝๅฎข่ฃฝ
- ไบ、Timer vs cron:ไบไปถๅผๆ็จ็ๅชๅข
- ๅ ญ、Socket/Path/Device ๅๅ:ๆ้่ผๅ ฅ
- ไธ、ๆฅ่ช่้ๆฉๅๆ:journalctl ่ systemd-analyze
- ๅ ซ、่ณๆบๆงๅถ่ๆฒ็ฎฑ:cgroups ่ Hardening
- ไน、ๅธธ่ฆ้ฏ่ชค่ๆๆฅๆธ ๅฎ
- ๅ、ๅฏฆ็จ Recipes(ๅฏ็ดๆฅๅฅ็จ)
- ๐ ๅปถไผธ้ฑ่ฎ
ไธ、้ๆฉๅๅ้(Boot Chain)
- Firmware/UEFI → Bootloader(GRUB):่ผๅ ฅๆ ธๅฟ่ initramfs。
- kernel:ๆ่ผ root、ๅๅ
PID 1(systemd)。 - systemd:่งฃๆ้ ่จญ target(ๅคไฝฟ็จ
default.targetๆๅgraphical.targetๆmulti-user.target)。 - ไพ่ณด่งฃๆ:ไพๅฎๅ
(unit)้็
Requires/Wants、Before/After、Conflictsๅท่ก。
# ๆฅ็็ฎๅ้ ่จญ target ่ๅๆ
systemctl get-default
sudo systemctl set-default multi-user.target
sudo systemctl isolate rescue.target # ็ซๅณๅๅฐ็ถญ่ญทๆจกๅผ
ไบ、Unit ๅบ็ค:้กๅ、็ฎๆจ่ไพ่ณด
ๅธธ่ฆๅฎๅ ้กๅ:
- service:ๅธธ้งๆไธๆฌกๆงๆๅ。
- socket:socket-activated ๆๅ(ๆ้ๅๅ)。
- timer:ๅไปฃๆ่ฃๅผท cron ็ๆ็จ。
- target:ไธ็ตๅฎๅ ็้ๅ(้ๆฎตๆ็ๆ )。
- path:ๆชๆก/็ฎ้่ฎๅ่งธ็ผ。
- mount/automount、device:ๆ่ผๆ่ฃ็ฝฎไบไปถ。
# ๆฅไพ่ณด่ๅท่ก้ไฟ
systemctl list-dependencies multi-user.target
systemctl cat sshd.service
systemctl status NetworkManager.service
ไธ、Service ่จญ่จ:Type、Restart、Environment
Type ๅฝฑ้ฟ systemd ๅคๅฎ「ๆๅๅทฒๅฐฑ็ท」็ๆนๅผ:
simple(้ ่จญ):ไธป่ก็จไธ daemonize。forking:่ก็จfork()ๅพๅจ่ๆฏๅธธ้ง(ๅณ็ตฑ daemon)。notify:็จๅผ้้ sd_notify ๅ็ฅ「ๅฐฑ็ท」。oneshot:ไธๆฌกๆงไปปๅ,ๅธธๆญ้ RemainAfterExit=yes。
็ฏไพ:็ฉฉๅฎ่ชๅ้ๅ็ๅธธ้งๆๅ
[Unit]
Description=My Web App
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure
RestartSec=3
Environment="ENV=prod" "PORT=8080"
# ๅฎๅ
จๅปบ่ญฐ(่ฆไธ็ฏ Hardening)
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.target
ๅ、่ฆๅฏซ่ Drop-in:ไธๅๅๆชไน่ฝๅฎข่ฃฝ
ไธ่ฆ็ดๆฅๆนๅฅไปถๆไพ็ /usr/lib/systemd/system/*.service。ๆน็จ่ฆๅฏซ:
sudo systemctl edit myapp.service # ๆๅจ /etc/systemd/system/myapp.service.d/ ๅปบ็ฝฎ drop-in
# ็ทจๅฏซๅ
งๅฎน(ๅชๆพๅทฎ็ฐ):
[Service]
Environment="DEBUG=false"
Restart=always
ๅฅ็จไธฆๆฅ็:
sudo systemctl daemon-reload
sudo systemctl restart myapp.service
systemctl cat myapp.service
ไบ、Timer vs cron:ไบไปถๅผๆ็จ็ๅชๅข
- ่ service ็ถๅฎ:ๆ็จ่งธ็ผๅฐๆ service,็ฎก็ไธ่ด。
- ๆฏๆดๆๆๆ้(RandomizedDelay):้ฟๅ ๅฐๅณฐ。
- ็ผบๆผ่ฃ่ท(Persistent):ๆฉๅจ้ๆฉๆ้็ไปปๅๆ่ฃๅท่ก。
็ฏไพ:ๆฏๅคฉ 02:15 ๅท่กๅไปฝ,่ฅ้ฏ้ๅ้ๆฉ่ฃ่ท
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily
[Timer]
OnCalendar=*-*-* 02:15:00
Persistent=true
RandomizedDelaySec=120
[Install]
WantedBy=timers.target
# ๅ็จ
sudo systemctl enable --now backup.timer
systemctl list-timers --all
ๅ ญ、Socket/Path/Device ๅๅ:ๆ้่ผๅ ฅ
socket ๅๅ่ฎๆๅๅจ้ฃ็ท็ผ็ๆๅๅ็จ,้ไฝๅธธ้ง่ณๆบ。
# ่งๅฏ socket ่ๅฐๆ service
systemctl list-sockets
systemctl status ssh.socket
ไธ、ๆฅ่ช่้ๆฉๅๆ:journalctl ่ systemd-analyze
# ๅช็ๆฌๆฌก้ๆฉ、้่ฆ็ญ็ดไปฅไธ
journalctl -b -p warning
# ่ฟฝๆๅๆฅ่ช(ๅณๆ)
journalctl -u myapp.service -f
# ๅๅ่ๆ็ธฝ่ฆฝ่้้ต้
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
# ็ข็ SVG(ๆผๆก้ข้ๅๆชข่ฆ)
systemd-analyze plot > boot.svg
ๅ ซ、่ณๆบๆงๅถ่ๆฒ็ฎฑ:cgroups ่ Hardening
- CPU/่จๆถ้ซ้ๅถ:
CPUQuota=50%、MemoryMax=1G - ๆฒ็ฎฑๅ้ธ้
:
NoNewPrivileges=true、PrivateTmp=true、ProtectSystem=full、ProtectHome=true、CapabilityBoundingSet= - ่จๆๆๅ:
systemd-run --scope/--unitๅฟซ้ๆ้ๅถ่ทไปปๅ。
# ไปฅ 50% CPU、1G ่จๆถ้ซ้ๅถๅท่กไปปๅ
sudo systemd-run --unit=limit-job --scope -p CPUQuota=50% -p MemoryMax=1G /usr/bin/some-task
ไน、ๅธธ่ฆ้ฏ่ชค่ๆๆฅๆธ ๅฎ
- ๆๅๅๅๅกไฝ:ๆชขๆฅ
After=network-online.targetๆฏๅฆ็ผบWants=network-online.target;็ขบ่ชsystemd-networkd-wait-onlineๆ NetworkManager ้ฃ็ท็ญๅพ ่จญๅฎ。 - ๆฌ้ๅ้ก:ๆๅ
User=ๆๅฎ็จๆถไนๆชๆก/็ฎ้ๆฌ้(ๅ่chmod/chownๅบ็ค)。 - ่ทฏๅพๆชๅฐฑ็ท:ไฝฟ็จ
pathunit ๆๅจExecStartPreๅ ๅ ฅๆชขๆฅ/ๅปบ็ซ。 - Daemonize ่ Type ไธ็ฌฆ:ๅณ็ตฑ daemon ่จญ
Type=forking,ๅฆๅ systemd ่ชคๅค็ๆ 。 - ้ฏ่ชคๅพฉ็ผ:่จญๅฎ
Restart=on-failure่RestartSec=,ไธฆๅ ๅผทๆฅ่ชๅๆ(journalctl -xeu)。
ๅ、ๅฏฆ็จ Recipes(ๅฏ็ดๆฅๅฅ็จ)
๐งฉ 1) ๆๅ้็ญ「็ถฒ่ทฏๅฏ็จ」ๅๅๅ
[Unit]
After=network-online.target
Wants=network-online.target
๐งฉ 2) oneshot ๅๅงๅ + ๅธธ้งๆๅไธฒ่ฏ
# init.service ๅๆบๅ;myapp.service ็ๆญฃๅๅ
[Unit]
Description=Initialize directories
Before=myapp.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/init_dirs.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
๐งฉ 3) ่ชๅ้ๅไธฆ้ๅถ้่ฉฆ้ ป็
[Service]
Restart=on-failure
RestartSec=3
StartLimitIntervalSec=60
StartLimitBurst=5
๐งฉ 4) ็กฌๅไธๅ็ถฒ้ ๆๅ(ๆๅฐ็นๆฌ)
[Service]
User=www-data
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
CapabilityBoundingSet=
AmbientCapabilities=
ReadWritePaths=/var/lib/myapp
๐ ๅปถไผธ้ฑ่ฎ(็ซๅ ง)
- Linux ๆ ธๅฟๅๆธ่ I/O ่ชฟๆ ก(sysctl)
- Linux ๆ่ฝ็ฃๆง:top、htop、iotop、nmon
- sed ๆๅญ่็้ๆฅ
- Netplan ่ ifcfg ็ถฒ่ทฏ่จญๅฎ
- ๆชๆกๆฌ้ rwx、chmod、chown ๅ ฅ้
- Samba Server ๅฎ่ฃ่่จญๅฎ
- Linux Proxy(Squid)ๅปบ็ฝฎ่่จญๅฎ
- ไฝฟ็จ GoAccess ้ฒ่ก็ถฒ็ซๆต้ๅๆ
ๆๅพๆดๆฐ:2025-10-23 · ไฝ่ :WWFandy
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ