저는 데비안 스트레치를 사용하고 있습니다. 내 루트 파티션이 마운트되었습니다 read-only
. 패키지를 설치하거나 업그레이드할 때만 (apt 후크를 사용하여) /
다시 설치 read-write
한 다음 다시 ro
.
/
패키지 업그레이드 후 다시 읽기 전용으로 다시 설치할 수 없는 경우가 있습니다 .
mount -o remount,ro /
mount: / is busy
이전 Debian 버전(Wheezy)에서는 연결되지 않은 열린 파일을 나열할 수 있습니다 lsof
.
lsof +L1
/
또는 더 구체적으로 파일이 ro로 다시 마운트되지 않도록 방지합니다.
{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'
그러나 Debian Stretch에서는 lsof +L1
파일이 나열되지 않습니다.
+|-L
작동이 중지된 이유를 설명 하는 변경 사항이 표시되지 않습니다 man lsof
.
lsof +L1이 더 이상 연결되지 않은 열린 파일을 나열하지 않는 이유는 무엇입니까?
차단/다시 마운트된 파일을 읽기 전용으로 나열하는 방법은 무엇입니까?
고쳐 쓰다
가능한 모든 프로세스를 중지 init
하고 계속 실행 중이지만 getty
여전히 ./
ro
답변1
차단/다시 마운트된 파일을 읽기 전용으로 나열하는 방법은 무엇입니까?
A) 패키지에서 찾을 fuser
수 있습니다 . 이것이 .psmisc
fuser
lsof
# fuser -v -m / 2>&1 | grep '[Ff]r.e'
그러면 /에서 읽기(f) 및 쓰기(F)를 위해 열려 있는 파일이 있는 모든 프로세스가 표시됩니다. 읽기 전용으로 차단/재마운트된 파일은 쓰기(F)를 위해 열린 파일입니다.
다음 프로세스를 종료합니다.실행 파일이 실행 중이고 루트 파일이 쓰기 위해 열려 있습니다.. , 즉.
# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done
이것은 systemd
의견 위에 있지만 경고가 있습니다. 그렇다면 그것은 보일 것이고 다른 고려 사항이 있을 것입니다 systemd
. 실행 하면 프로세스가 방금 식별되어 종료된 경우에도 뒤에서 프로세스를 (재)시작할 수 있습니다 . 전통적인 것보다 훨씬 더 발전했습니다 .init
fuser
systemd
fuser
systemd
sysvinit
나)의고쳐 쓰다설명에는 시스템만...init
그리고 getty
아직도 달리고 있어...
systemd
시스템이 사용되지 않고 있다는 댓글이 보입니다 init
. 스트레칭을 하면서,systemd
예 init
. 의견에는 명시적으로 명시되어 있지 않으므로 sysvinit
문제의 시스템이 기본 systemd
Stretch 를 사용하고 있을 수 있다고 가정합니다 init
. 또는 이 기사를 우연히 발견한 사람은 스트레칭을 사용하고 systemd
있으며 이 섹션이 유용하다고 생각합니다.
~에 따르면데비안 위키,
시스템 초기화 프로세스는 init 데몬에 의해 처리됩니다. squeeze 및 이전 버전에서는 이 데몬이 sysvinit 패키지에 의해 제공되며 대안은 지원되지 않습니다.존재하다헐떡거림, 기본 init 데몬은 여전히
sysvinit
, 그러나 systemd의 "기술 미리보기"를 사용할 수 있습니다.존재하다제시그리고긴장, 기본 초기화 시스템은 다음과 같습니다.systemd
, 그러나 sysvinit로의 전환을 지원합니다.jessie 이후로는 systemd만 완전히 지원됩니다. 대부분의 경우 sysvinit가 지원되지만 데비안 패키지는 sysvinit 시작 스크립트를 제공할 필요가 없습니다. runit도 패키지로 제공되지만 아직 다른 프로그램과 동일한 수준의 테스트 및 지원을 받지 못했으며 현재 PID 1을 지원하지 않습니다.
실행하는 동안 systemd
문제 없이 다시 설치할 수 있도록 몇 가지 추가 단계를 무료로 수행해야 합니다.
파일을 system.slice
저장 하거나 여는 것일 수 있습니다 (둘 다 소켓 종속성이 있음). 또는 실행 중인 경우 다시 생성되어 임대를 작성할 수 있습니다.systemd-journald.service
systemd-udevd.service
NetworkManager
dhclient
/var/...(&/var/항상 자체 장치는 아님) 등이 fuser
이를 찾아 종료할 수 있지만 dhclient
즉시 NetworkManager
시작합니다.
교훈은 많은 것들이 자동화되어 있고 "원할" 수 있다는 것입니다/( 의 경우 더욱 그렇습니다 systemd
).
systemd
확실히 작동한다면 런레벨 1에 해당하는 항목이 일치 하고 심볼릭 링크가 됩니다 .rescue.target
runlevel1.target
rescue.target
1) 먼저 시스템을 분리합니다.rescue.target
# systemctl isolate rescue.target
루트 비밀번호를 묻는 메시지가 나타나면 화면의 지시를 따르세요.
2) 복구 쉘에서 원하는 /를 찾으십시오.
# systemctl show -p Wants /
일반적으로 system.slice
원하는 모든 것을 중지합니다.예를 들어
# systemctl stop system.slice
3) 이 시점에서 다시 마운트해야 합니다.아니요보고 mount: / is busy
하고mount -o remount,ro /
~해야 한다일하다. 그렇지 않은 경우 다시 확인하십시오 fuser
.
umount
4) FWIW; 다른 장치가 다른 설치의 하위 디렉터리에 설치된 경우(예: 중첩 설치)에도 이 오류가 발생하는 것을 확인했습니다 . 예를 umount /
들어 ,/var/또는/시작/다른 장치에 있습니다(이미 설치되어 있습니다). 이 경우에도 여전히 mount -o remount,ro /
작동합니다.
lsblk
중첩된 설치를 시각화하는 데 도움이 됩니다.
lsof +L1이 더 이상 연결되지 않은 열린 파일을 나열하지 않는 이유는 무엇입니까?
사용할 수 없기 때문에(소켓 또는 대부분의 FIFO 및 파이프) 더 이상 파일이 열려 있지 않거나(상위 프로세스가 파일 설명자를 닫음) 링크 수가 1보다 큽니다.
남성LSof(8)세부 사항...
+|-L[엘]
이 옵션은 파일 링크 개수 목록을 활성화("+")하거나 비활성화("-")합니다.가능한 경우 사용할 수 있습니다. 예를 들어 소켓이나 대부분의 FIFO 및 파이프에서는 작동하지 않습니다.
다음 번호 없이 +L을 지정하면 모든 링크 수가 나열됩니다. -L(기본값)을 지정하면 링크 수가 나열되지 않습니다.
+L 뒤에 숫자가 오면,링크 수가 이 숫자보다 적은 파일만 나열합니다.. (-L 뒤에는 숫자가 올 수 없습니다.) "+L1" 형식의 지정은 링크되지 않은 열린 파일을 선택합니다. 양식의 사양은
+aL1 <file_system>
지정된 파일 시스템에서 링크되지 않은 열린 파일을 선택합니다.
답변2
당신은 /proc
척하고 있습니까?
/
분명히, 대부분의 경우 읽기 전용 마운트에 주의를 기울이는 사람으로서 procfs를 마운트하지 않기로 선택할 수도 있다고 상상할 수 있습니다. 그러나 lsof
열린 파일을 찾으려면 procfs가 필요합니다.
프로세스에 의해 열려 있는 파일은 procfs의 심볼릭 링크를 통해 커널에 의해 노출됩니다. 이러한 디렉토리에는 /proc/<pid>/fd
열려 있는 각 파일에 대한 기호 링크가 포함되어 있습니다. 심볼릭 링크의 이름은 파일 설명자 번호이고 심볼릭 링크가 참조하는 경로는 파일 경로입니다.
/proc
삭제된 열린 파일의 경우 매달려 있는 기호 링크가 남아 있습니다. 파일의 참조 경로 이름이 "(제거됨)"으로 끝나도록 변경되었습니다.
lsof +L1
본질적으로 다음과 같은 빠른 단일 라이너와 다르지 않습니다 .
stat -c%N /proc/[0-9]*/fd/* | grep deleted
따라서 다음과 같은 한 줄의 코드를 사용하여 목록을 작성할 수 있습니다.모두루트 파일 시스템 재설치를 방해할 수 있는 파일을 엽니다(올바르게 작동하는 경우 /proc
).
하지만 설치한다면 /proc
제가 생각할 수 있는 유일한 다른 이유는 오류입니다... 어쨌든, 참고로 현재 Debian Stretch 시스템에 있습니다. lsof +L1
예상대로 작동합니다.
bash# lsb_release -d
Description: Debian GNU/Linux 9.5 (stretch)
bash# uname -a
Linux bwp-249-8 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64 GNU/Linux
bash# lsof -v
lsof version information:
revision: 4.89
[...]
답변3
이 문제는 한 번만 재현할 수 있었고 다음을 mount
사용하여 해결했습니다.-N옵션.
인용하다만샨:
-n, --no-mtab Mount without writing in /etc/mtab. This is necessary for example when /etc is on a read-only filesystem.
mount
파일 자체가 열립니다 .글쓰기루트 파일 시스템에서는 나에게 합리적인 설명처럼 들립니다. 결국 특정 mount
쓰기는 /etc/mtab
일반적으로 /etc
루트 파일 시스템의 일부입니다. 그런데 한 번 하고 나면 같은 머신에서 다시 재현이 안 되더라고요...
이것이 당신의 문제를 해결해줄까요?
답변4
시스템에 대해 아무것도 모르면 문제가 무엇인지 정확히 말하기가 어렵습니다. 댓글과 이전 답변이 좋은 시작입니다.
즉, 설치/읽기 전용의 전제 조건을 설명하는 데비안 위키를 검토하겠습니다.
문서 링크는 다음과 같습니다.https://wiki.debian.org/ReadonlyRoot
결론은 다음과 같습니다.
1 - / 아래에는 읽고 써야 하는 특정 위치가 있습니다. 문서에 따르면 다음과 같습니다.
블록 장치는 스토리지 스택 구성(파티셔닝됨, 파티션되지 않은 lvm 등)에 따라 다를 수 있지만 주요 아이디어는 후속 마운트된 파일 시스템 마운트 옵션을 위해 RW를 갖기 위해 이러한 4개의 마운트 지점이 필요하다는 것입니다.
2 - /etc에는 심볼릭 링크를 생성하거나 다른 변경 사항을 구현해야 하는 특수 파일이 많이 있습니다(링크된 기사에 자세히 설명되어 있습니다.). 이는 Linux 서버가 실행 중인 응용 프로그램에 따라 적용되거나 적용되지 않을 수 있습니다. 일부 파일은 귀하의 컴퓨터에 존재하지 않을 수도 있지만 모든 내용을 문서에 포함시켰습니다. 프로세스의 PID를 종료한 경우에도 이러한 변경을 수행하는 것이 좋습니다. 다음은 데비안 위키에서 직접 가져온 경로입니다:
- 시간을 조정하세요
- init.d/alsa-utils
- /etc/courier/shared/index
- 모든 컵 상태 파일,classes.conf, cupd.conf,printers.conf,subscriptions.conf
- /etc/lvm/lvm.conf
- mtab(마운트에 -n 플래그를 추가하여 이 문제를 해결하려고 시도한 것 같습니다)
- 네트워크/실행(ifup 및 ifdown에서 사용, 스퀴즈 중. 스트레치, ymmv에서는 작동하지 않을 수 있음)
- 로그인이 안됨
- 구성 파일 구문 분석
- 비밀번호 및 섀도우 파일
- 삼바/dhcp.conf
- 빨다
- 우데브
위의 사항을 모두 확인하고 위키의 사양을 준수하는지 확인한 후 다음으로 확인할 것은 /etc/apt/apt.conf입니다.
DPkg {
// Auto re-mounting of a readonly /
Pre-Invoke { "mount -o remount,rw /"; };
Post-Invoke { "test ${NO_APT_REMOUNT:-no} = yes || mount -o remount,ro / || true"; };
};
오류에 따라 문서를 기반으로 확인할 수 있는 마지막 내용은 다음과 같습니다.
"패키지를 업그레이드한 후 마운트가 읽기 전용 모드에서 파일 시스템 재마운트를 거부하고 "/가 사용 중입니다"라는 메시지가 표시되는 문제가 발생할 수 있습니다. 이는 프로세스가 삭제된 파일을 계속 사용하고 있기 때문에 발생합니다. 어떤 프로세스가 삭제된 파일을 삭제하려면 debian-goodies 패키지의 checkrestart(1) 도구를 사용하거나 다음 명령을 사용하세요. 이러한 프로세스는 일반적으로 파일을 해제하기 전에 다시 시작해야 합니다.
문서에 제공된 명령:
{lsof +L1; lsof|sed -n '/SYSV/d; /DEL\|(path /p;'} |grep -Ev '/(dev|home|tmp|var)'
정확한 파일 시스템 구성, 파티션, 저장 장치 구성을 알지 못하면 추가 정보를 제공하기 어렵습니다. 먼저 돌아가서 문서의 전제 조건(및 위에 설명된 전제 조건)을 다시 확인하겠습니다.