체계적인 공격적인 비상 쉘 동작을 비활성화하는 방법?


10

기본적으로 systemd는 가장 작은 오류에서 긴급 쉘로 떨어집니다. 예를 들어, 어떤 이유로 fstab의 마운트 중 하나가 실패하면 시스템을 즉시 부팅 할 수 없게됩니다. 수십 가지의 다양한 프로덕션 시스템을 관리하고 있으며이 동작이 매우 손상되었음을 알게되었습니다. (실제로 나는 이것이 중대한 디자인 실패라고 생각하지만 그것은 개인적인 견해입니다).

시스템 부팅 복원력을 높이고 싶습니다. 주어진 오류로 인해 콘솔 로그인이 절대 불가능 해지지 않는 한 시스템은 항상 부팅해야하며, 누락 된 드라이버, 마운트 등은 긴급 쉘을 삭제하지 않아야합니다 (대신 경고 표시). 실행할 수있는 것은 실행되어야합니다.

systemd가 / etc / fstab에서 * .mount 파일을 자동으로 생성한다는 것을 알고 있으며 작은 x-systemd.device 시간 초과와 함께 nofail 옵션을 사용하거나 관련 .mount 파일을 직접 정의 할 수 있습니다. 그러나 그것은 내 문제를 해결하지 못합니다. 매번 시스템을 더 탄력적으로 만들고 싶을 때마다 "패칭"fstab이 그리 편리하지 않으며 시스템을 부팅 할 수없는 다른 가능한 "문제"가 얼마나 있는지 확실하지 않습니다. 어딘가에서 일부 개발자는 그것이 충분히 중요하다고 생각했습니다.

정리하면, 나는 내 컴퓨터에 대한 제어권을 되찾고 시스템이 부팅 프로세스를 중단시킬 정도로 심각한 문제를 결정하지 못하게하고 싶습니다. 가능합니까?


실제 문제 btw는 무엇입니까? 두 가지를 알고 있습니다-ssh를 통해 로그인 할 수 없으며 sulogin 프롬프트는 sudo 사용자가 아닌 루트 만 비상 모드에서 액세스 할 수 있도록 허용합니다. 그게 당신이 겪은 피해를 커버합니까?
sourcejedi

실제로이 두 서비스가 시작되면 시스템에 훨씬 더 쉽게 액세스 할 수 있습니다. 최적의 시스템은 이전 SysV 시간과 같이 시작될 수있는 모든 것을 시작하고 (비상 쉘에서 고통스러운 죽음 대신 오류 로그 표시) 치명적인 오류가 발생한 경우에만 쉘을 시작해야합니다.
goteguru

답변:


7

말 그대로 마운트 장애 일 뿐이므로 변경해야합니다.

따라서 귀하의 요청 서한은 대답하기가 쉽지 않습니다. 드롭 인 파일을 작성하십시오.

# /etc/systemd/system/local-fs.target.d/nofail.conf

# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=

나는 이것이 부분적인 실패 시나리오를 허용함으로써 리눅스 sysvinit가 이미 겪은 문제 외에 새로운 문제를 추가하지 않을 것이라고 믿는다.


그러나 지정된 블록 장치를 사용할 수있을 때까지 얼마나 오래 시스템을 대기 해야하는지에 대한 질문도 지적했습니다 . fstab 생성기를 전체적으로 대체하지 않고는 이것을 구성 할 방법이 없습니다. https://www.freedesktop.org/software/systemd/man/systemd.generator.html

널리 사용되지 않는 대량의 코드를 여기에 덤프하면 시스템 복원력이 향상되지 않을 것 같습니다. 가장 가까운 솔루션은 기존 fstab 생성기를 패치하는 것입니다. 그것은 매우 복잡하지 않습니다. 나는 당신이 그것으로 도망 갈 수 / 중대한 변화를 따라갈 수 있다고 생각합니다.

기술적으로 배포판에 자체 포함 된 mountallsysvinit 스크립트가 있으면이를 연결해 볼 수 있습니다. 그러나 부팅 프로세스가 크게 변경 될 것입니다. 실제로는 더 많은 포크입니다. 나는 그 접근법을 권장하지 않을 것입니다.


https://unix.stackexchange.com/a/393711/29483

장치 파일을 검색하면 부팅 방법이 매우 적습니다 emergency.target. 일반적으로 .mount로컬 파일 시스템의 장치가 실패 local-fs.target 하여 실패하는 경우입니다. 또는 initramfs가 systemd를 사용하는 경우 initramfs가 루트 파일 시스템을 마운트하지 못하는 경우.

local-fs.target있다 OnFailure=emergency.target. 로컬 파일 시스템의 단위가 local-fs.target의 필수 목록에 자동으로 추가되기 때문에 (실패하지 않는 한) 실패합니다 DefaultDependencies=no.

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount

2
[Unit]\nOnFailure= nofail.conf에 넣어야한다고 생각합니다 . /etc/systemd/system.conf에서 일반 DefaultTimeoutStartSec 옵션을 통해 대기 시간을 구성 할 수있는 것 같습니다. 내 시스템은 일반적으로 충분히 빠르며, 90 년대는 어쨌든 지나친 것 같습니다. 이 솔루션은 유망한 것으로 보입니다.
goteguru

내 경우에는 내가 설정 OnFailure=/lib/systemd/system/local-fs.target대신 /etc/systemd(AWS에 우분투 16.04)
ThiagoAlves

@Thiago 그렇지 않으면 시스템 업그레이드시 덮어 쓰게됩니다. 답변의 지침을 따르거나 설명을 요청하십시오 :-).
sourcejedi

@sourcejedi 나는 대답을 시도했지만 나를 위해 작동하지 않았다
ThiagoAlves

1
@ThiagoAlves 의견을 보내 주셔서 감사합니다. 나는 대답을 덜 모호하게 만들었으므로 문제인지 아닌지 명확하게 알 수 있습니다. 즉, [Unit]전에 포함해야하는지 궁금합니다 OnFailure=.
sourcejedi

0

항목에 noauto마운트 옵션을 추가하여 부트 작업에 필수적이지 않은 파일 시스템의 자동 마운트를 끄십시오 /etc/fstab.

/dev/sdxy /u01 nfs defaults 0 0

에:

/dev/sdyx /u01 nfs noauto 0 0

부팅 후 파일 시스템을 마운트하십시오 /etc/rc.local.

mount /u01

이 예제는 NFS를 사용하지만 파일 서버에서 가져온 LUN에도 적용됩니다.


1
예, noauto는 알고 있지만 매번 fstab을 변경하면 nofail이 훨씬 더 나은 선택입니다. 어쨌든 Thx.
goteguru

0

어쩌면 이것을 시도?

systemctl mask emergency.service
systemctl mask emergency.target

4
이것을 시도 했습니까? 비상 대상이 마스크 된 상태에서 부팅 중에 시스템에 오류가 발생하면 어떻게됩니까?
Stephen Kitt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.