저는 데비안을 자주 설치합니다. 이를 위해 완전히 자동화된 preseed.cfg가 있습니다. 프로비저닝이 끝나면 TFTP 서버에서 postinstall.sh 스크립트를 다운로드하고 실행하여 몇 가지 추가 사용자 정의를 수행합니다.
GNOME에서 LXQTE로 전환하고 GDM 대신 SDDM을 사용하고 있습니다. 그러나 SDDM은 내 하드웨어에 비해 너무 빨리 부팅을 시도합니다. 이 문제를 해결하기 위해 systemctl edit sddm
다음을 추가 했습니다 .
[Service]
ExecStartPre=/bin/sleep 5
이것은 매우 잘 작동하므로 postinstall.sh 스크립트에 추가하여 이 프로세스를 자동화하고 싶습니다. 그러나 systemctl edit
bash 스크립트를 통해 파일 내용을 전달하는 방법을 모르겠습니다 . 어떻게 해야 하나요?
답변1
재정의할 수 있습니다$SYSTEMD_EDITOR
환경 변수를 실행할 때 편집기 이외의 명령을 사용하십시오 systemctl edit
.
예를 들어, 이와 같은 것을 사용하면 SYSTEMD_EDITOR='cp /path/to/source.file'
잘 작동하는 것 같습니다(비록 매우 추악하지만 마지막 매개변수가 systemd에 의해 추가될 것으로 기대합니다!)
특정 경우에는 다음을 사용할 수 있습니다.
$ { echo "[Service]";
echo "ExecStartPre=/bin/sleep 5";
} >~/tmp/sddm-override.conf
$ sudo env SYSTEMD_EDITOR="cp $HOME/tmp/sddm-override.conf" systemctl edit sddm
하지만 실제로 해야 할 일은 systemctl edit
디렉터리 아래에 오버레이 파일(이 경우 name override.conf
) 을 생성하고 /etc/systemd/system/<service>.service.d/
, 존재하지 않는 경우 오버레이 파일을 생성하는 것뿐입니다. 따라서 직접 방법으로 수행하는 것도 완벽하게 허용됩니다. ("삽입" 및 "덮어쓰기"에 대한 참조를 참조하세요.systemd.unit의 매뉴얼 페이지자세한 내용은. )
따라서 귀하의 경우 이것이 적합한 솔루션이 될 것입니다.
$ sudo mkdir -p /etc/systemd/system/sddm.service.d/
$ { echo "[Service]";
echo "ExecStartPre=/bin/sleep 5";
} | sudo tee /etc/systemd/system/sddm.service.d/10-startup-delay.conf
$ sudo systemctl daemon-reload
이렇게 하면 장치의 "드롭" 디렉터리에 예상되는 내용이 포함된 파일이 배치되며, 이 경우 수행하려는 작업에 따라 적절하게 이름을 지정할 수도 있습니다.
고쳐 쓰다:@GracefulRestart가 지적했듯이 systemctl daemon-reload
플러그인을 직접 추가한 후에 이 작업을 수행해야 합니다.
답변2
systemctl edit
스크립트에서 이를 사용하는 방법을 알지 못했기 때문에 systemctl edit sddm
/usr/lib/systemd/system의 서비스 단위가 변경될 수 있으므로 명령을 에뮬레이션하고 /etc/systemd/system 디렉터리에 재정의하는 것이 가장 좋습니다. 패키지가 업그레이드될 때:
UNIT='sddm.service'
DIR="/etc/systemd/system/${UNIT}.d"
mkdir $DIR
echo -e "[Service]\nExecStartPre=/bin/sleep 5" > ${DIR}/override.conf
systemctl daemon-reload
systemctl edit sddm
이는 수행 중인 작업 과 대략 동일해야 합니다 .
답변3
어떤 편집기를 변경할 수 있나요?systemctl(8)
그것의 목적edit
하위 명령 및SYSTEMD_EDITOR
바꾸다. 이는 본질적으로 최종 인수가 항상 systemctl(8)
작성된 임시 파일이고 일단 작성되면 override.conf
.
이 때문에 우리는 사용할 수 있습니다tee(1)
그런 다음 SYSTEMD_EDITOR
쉘에서 원하는 텍스트를 systemctl(8)
표준 입력의 전체 명령으로 리디렉션하십시오. 예를 들어 리디렉션여기 문서:
SYSTEMD_EDITOR=tee systemctl edit sddm <<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF
/etc/systemd/system/sddm.service.d/override.conf
이렇게 하면 "단어" 사이에 내용이 포함된 포함된 파일이 생성됩니다 EOF
.
하위 명령 은 edit
다음과 같습니다.
# Create drop-in directory for service
mkdir -p /etc/systemd/system/sddm.service.d
# Create empty temporary file
touch /etc/systemd/system/sddm.service.d/.
# Pass temporary file as last argument of SYSTEMD_EDITOR
tee /etc/systemd/system/sddm.service.d/.\#override.conf846580011dbe64db/.\#override.conf846580011dbe64db<<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF
# Rename temporary file
mv /etc/systemd/system/sddm.service.d/{.\#override.conf846580011dbe64db,override.conf}
장치를 편집한 후 systemd 구성이 자동으로 다시 로드됩니다(daemon-reload
).
답변4
파일을 직접 공격하겠습니다.
sed -i 's/\[Service]/ a\
ExecStartPre=/bin/sleep 5' /usr/lib/systemd/system/sddm.service