패키지 업그레이드 후 다시 마운트하거나 읽기 전용으로 되돌릴 수 없음


13

데비안 스트레치를 사용하고 있습니다. 내 루트 파티션이 마운트되었습니다 read-only. 단지 내가 설치 또는 패키지를 업그레이드 할 때입니다 /에 다시 마운트 read-write(APT 후크를 사용하여), 그리고 다시에 다시 마운트 ro.

때로는 패키지 업그레이드 후 /읽기 전용 으로 다시 마운트 할 수 없습니다 .

mount -o remount,ro /
mount: / is busy

이전 데비안 버전 (Wheezy)에서는 lsof다음 과 연결이 해제 된 열린 파일을 나열 할 수 있습니다 .

 lsof +L1

또는보다 구체적 /으로 ro로 다시 마운트 되지 못하게 하는 파일 :

{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'

그러나 데비안 스트레치에서는 lsof +L1파일을 나열하지 않습니다.

에 나는 어떤 변화를 보이지 않는 +|-L에서 man lsof이 작동을 중지 이유를 설명 것이라고.

lsof + L1이 더 이상 연결 해제 된 열린 파일을 나열하지 않는 이유는 무엇입니까?

읽기 전용으로 마운트 / 재 마운트하지 못하게하는 파일을 어떻게 나열합니까?

최신 정보

나는 중지 할 수있는 모든 프로세스를 중지 한 만 가지고 initgetty계속 실행,하지만 난 아직도 다시 마운트 할 수 /ro.


연결되지 않은 열린 파일이 유일한 장애물은 아닙니다. 찾는다 w또는 u에서 FD의 열 lsof출력을 위해 또는 F출력의 fuser -vm /예. 그러나 나는 당신에게 철저한 목록을 줄 수는 없습니다. needrestart 패키지 를 설치할 수도 있습니다 .
Ferenc Wágner

바보 같은 질문이지만 당신은 lsof를 실행 root합니까?
Kiwy

1
Kiwy-예, lsof를 루트로 실행하고 있습니다.
Martin Vegter

1
하지 않는 fuser -m / 루트를 사용하여 무슨 말?
Rui F Ribeiro

1
@Marcus Linsner-systemd를 사용하지 않습니다. init를 사용하고 있습니다.
Martin Vegter

답변:


2

읽기 전용으로 마운트 / 재 마운트하지 못하게하는 파일을 어떻게 나열합니까?

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입니다.

B) 설명 의 업데이트 는 시스템에 ... 만 init있고 getty여전히 실행 중임을 나타냅니다 .

시스템이 사용 systemd하고 있지 않다는 의견이 표시 됩니다 init. 스트레칭시, systemd 입니다 init . 의견에 명시 적으로 말하지 않았으므로 sysvinit문제의 시스템이에 대한 기본 확장 systemd을 사용한다고 가정합니다 init. 또는이 게시물을 우연히 본 스트레치를 사용하는 다른 사람들 systemd이이 부분을 유용하게 사용할 수 있습니다.

데비안 위키 ,

시스템 초기화 프로세스는 init 데몬에 의해 처리됩니다. 스퀴즈 및 이전 릴리스에서는 해당 데몬이 sysvinit 패키지에서 제공되며 다른 방법은 지원되지 않습니다. 에서 씩씩 거리는 기본 초기화 데몬이 여전히,sysvinit 하지만 systemd의 "기술 미리보기"가 가능합니다. 에서 제시 하고 스트레칭 , 기본 초기화 시스템입니다systemd 만, Sysvinit의 전환이 지원됩니다.

jessie 이후로 systemd 만 완전히 지원됩니다. sysvinit는 대부분 지원되지만 데비안 패키지는 sysvinit 시작 스크립트를 제공하지 않아도됩니다. runit도 패키지되어 있지만 다른 테스트와 동일한 수준의 테스트 및 지원을받지 않았으며 현재 PID 1로 지원되지 않습니다.

함께 systemd실행은 문제없이 다시 마운트 할 수 있도록 / 확보하기 위해주의해야 할 몇 가지 추가 단계가 있습니다.

또는에 system.slice대한 열린 파일을 보유하고 있을 가능성 이 있습니다 (둘 다 소켓 종속성이 있음). 또는 경우는 이 리스폰 수있는 실행 에 임대를 기록하는 / var에 / ... ( 은 / var는 / 등, 항상 자신의 장치가 아닙니다) 및 당신이 죽일 찾을 수 있지만, 그것은 바로 다시 시작됩니다. systemd-journald.servicesystemd-udevd.serviceNetworkManagerdhclientfuserdhclientNetworkManager

도덕은 '원하다'/ (그리고 훨씬 더 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.

4) FWIW; 또한 umount다른 장치가 다른 마운트의 하위 디렉토리 (예 : 중첩 마운트)에 마운트 될 때 실패하는 경우 도 보았습니다 . 예를 들어, / var / 또는 / boot / 가 다른 장치에 있고 마운트 된 umount /경우 실패합니다 . 비록 아직이 경우에 작동합니다.mount -o remount,ro /

lsblk 중첩 된 마운트를 시각화하는 데 도움이 될 수 있습니다.

lsof + L1이 더 이상 연결 해제 된 열린 파일을 나열하지 않는 이유는 무엇입니까?

사용할 수 없기 때문에 (소켓 또는 대부분의 FIFO 및 파이프) 더 이상 파일을 열지 않거나 (부모 프로세스가 파일 설명자를 닫았 음) 링크 수가 1보다 큽니다.

man lsof (8) 세부 사항 ...

+ | -L [l]

이 옵션 은 사용 가능한 파일 링크 수 목록을 활성화 ( '+') 또는 비활성화 ( '-')합니다 ( 예 : 소켓 또는 대부분의 FIFO 및 파이프에는 사용할 수 없음).

다음 번호없이 + L을 지정하면 모든 링크 수가 나열됩니다. -L을 지정하면 (기본값) 링크 수가 표시되지 않습니다.

+ L 다음에 숫자가 오면 해당 링크보다 링크 수가 적은 파일 만 나열됩니다 . (-L 뒤에 숫자가있을 수 없습니다.) ''+ L1 ''형식의 스펙은 링크 해제 된 열린 파일을 선택합니다. 양식의 스펙은 +aL1 <file_system>지정된 파일 시스템에서 링크되지 않은 열린 파일을 선택합니다.


0

당신은 /proc마운트 했습니까?

/대부분의 경우 읽기 전용 마운트를 조심스럽게 처리하는 사람이 있다면, procfs를 마운트하지 않도록 선택할 수도 있습니다. 그러나 lsof열린 파일을 찾으려면 procfs가 필요 합니다.

프로세스에 의해 열린 파일은 프로세스에서 심볼릭 링크를 통해 커널에 의해 노출됩니다. 디렉토리 /proc/<pid>/fd에는 열려있는 각 파일에 대한 심볼릭 링크가 있습니다. 심볼릭 링크의 이름은 파일 디스크립터 번호이고 심볼릭 링크가 참조하는 경로는 파일 경로입니다.

/proc이미 삭제 된 열린 파일 에 매달려있는 심볼릭 링크가 남아 있습니다 . 그리고 파일의 참조 경로는 "(삭제됨)"으로 끝나도록 이름이 변경됩니다.

어떤 lsof +L1일은 같은 간단한 한 줄 본질적으로 다르지 않다 :

stat -c%N /proc/[0-9]*/fd/* | grep deleted

따라서 유사한 단일 라이너를 사용 하여 루트 파일 시스템을 다시 마운트하지 못하게하는 모든 열린 파일 을 나열 할 수 있습니다 (작동중인 경우 /proc).

그러나 당신이 /proc마운트 / 마운트 했다면 내가 생각할 수있는 유일한 다른 원인은 현재 데비안 스트레치 시스템의 버그입니다. 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
    [...]

예, 나는 /proc마운트했습니다. 왜 내가 없는지 당신의 추론을 따르지 않습니다. 어쨌든 stat -c%N /proc/[0-9]*/fd/* | grep deleted아무것도 보여주지 않습니다.
Martin Vegter

0

나는 단지 한 번이 문제를 재현, 그냥 사용하여 해결 할 수 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종종 루트 파일 시스템의 일부입니다. 그러나 한 번 한 후에 같은 컴퓨터에서 다시 재생할 수 없습니다 ...

이것이 문제를 해결할 수 있습니까?


아니오, -nmount와 함께 사용 하면 차이가 없습니다.
Martin Vegter

0

시스템에 대한 가시성이 없으면 문제가 무엇인지 정확하게 말하기가 매우 어렵습니다. 의견과 이전 답변은 좋은 시작입니다.

즉, 나는 마운트 / 읽기 전용에 대한 전제 조건을 설명하는 데비안 위키를 통해 되돌아 갈 것입니다.

https://wiki.debian.org/ReadonlyRoot 문서에 대한 링크는 다음과 같습니다.

큰 것은 여기서 당신을 안내 할 것입니다 :

1-/ 아래에 읽고 쓸 특정 위치가 있습니다. 문서를 기반으로 다음과 같이 보입니다.

데비안로 루트

스토리지 스택 구성 (파티션, partionless lvm 등)에 따라 블록 장치가 다를 수 있지만 RW 마운트 옵션을 사용하려면 후속 마운트 파일 시스템을 갖기 위해 4 개의 마운트 지점이 필요하다는 것이 기본 아이디어입니다.

2-/ etc에는 심볼릭 링크를 만들거나 다른 변경 사항 (특히 링크 된 기사에 자세히 설명되어 있음)을 구현해야하는 특수 파일이 많이 있습니다. Linux 서버가 실행중인 응용 프로그램에 따라 적용되거나 적용되지 않을 수 있습니다. 일부 파일은 컴퓨터에 없을 수도 있지만 문서에 모든 것을 포함 시켰습니다. 프로세스의 pid를 죽인 경우에도 이러한 변경을 수행하는 것이 좋습니다. 다음은 데비안 위키에서 직접 제공되는 경로입니다.

  • 조정하다
  • init.d / alsa-utils
  • / etc / courier / shared / index
  • 컵 상태 파일, classes.conf, cupsd.conf, printers.conf subscriptions.conf
  • /etc/lvm/lvm.conf
  • mtab (-n 플래그를 마운트하여 해결하려고 한 것 같습니다)
  • 네트워크 / 런 (압축에서 ifup 및 ifdown에 사용됨, ymmv 스트레칭에 적용되지 않을 수 있음)
  • nologin
  • resolv.conf
  • passwd 및 shadow 파일 모두
  • samba / dhcp.conf
  • 빨다
  • udev

위의 내용을 모두 확인하고 Wiki의 사양을 준수하는지 확인한 후 확인해야 할 사항은 /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"; };
}; 

오류를 기반으로 문서를 기반으로 확인할 수있는 마지막 사항은 다음과 같습니다.

"패키지 업그레이드 후, 마운트가 파일 시스템을 읽기 전용으로 다시 마운트하는 것을 거부하는 문제에 직면 할 수 있습니다."/ busy " 삭제 된 파일이 프로세스에서 여전히 사용중인 삭제 된 파일로 인해 발생합니다. 삭제 된 파일을 사용하는 프로세스를 찾으려면 패키지 debian-goodies에서 checkrestart (1) 도구를 사용하거나 다음 명령을 사용하십시오. 파일을 해제하려면 다시 시작해야합니다. "

문서에 제공된 명령 :

{lsof +L1; lsof|sed -n '/SYSV/d; /DEL\|(path /p;'} |grep -Ev '/(dev|home|tmp|var)'

정확한 파일 시스템 구성, 파티셔닝 및 저장 장치 구성을 알지 못하면 따라야 할 일이 많지 않습니다. 문서로 돌아가서 위에서 설명한 사전 요구 사항을 다시 확인하는 것으로 시작하겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.