업그레이드 후 패키지를 다시 설치하거나 읽기 전용으로 되돌릴 수 없습니다.

업그레이드 후 패키지를 다시 설치하거나 읽기 전용으로 되돌릴 수 없습니다.

저는 데비안 스트레치를 사용하고 있습니다. 내 루트 파티션이 마운트되었습니다 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수 있습니다 . 이것이 .psmiscfuserlsof

# 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. 실행 하면 프로세스가 방금 식별되어 종료된 경우에도 뒤에서 프로세스를 (재)시작할 수 있습니다 . 전통적인 것보다 훨씬 더 발전했습니다 .initfusersystemdfusersystemdsysvinit

나)의고쳐 쓰다설명에는 시스템만...init그리고 getty아직도 달리고 있어...

systemd시스템이 사용되지 않고 있다는 댓글이 보입니다 init. 스트레칭을 하면서,systemd init. 의견에는 명시적으로 명시되어 있지 않으므로 sysvinit문제의 시스템이 기본 systemdStretch 를 사용하고 있을 수 있다고 가정합니다 init. 또는 이 기사를 우연히 발견한 사람은 스트레칭을 사용하고 systemd있으며 이 섹션이 유용하다고 생각합니다.

~에 따르면데비안 위키,

시스템 초기화 프로세스는 init 데몬에 의해 처리됩니다. squeeze 및 이전 버전에서는 이 데몬이 sysvinit 패키지에 의해 제공되며 대안은 지원되지 않습니다.존재하다헐떡거림, 기본 init 데몬은 여전히sysvinit, 그러나 systemd의 "기술 미리보기"를 사용할 수 있습니다.존재하다제시그리고긴장, 기본 초기화 시스템은 다음과 같습니다.systemd, 그러나 sysvinit로의 전환을 지원합니다.

jessie 이후로는 systemd만 완전히 지원됩니다. 대부분의 경우 sysvinit가 지원되지만 데비안 패키지는 sysvinit 시작 스크립트를 제공할 필요가 없습니다. runit도 패키지로 제공되지만 아직 다른 프로그램과 동일한 수준의 테스트 및 지원을 받지 못했으며 현재 PID 1을 지원하지 않습니다.

실행하는 동안 systemd문제 없이 다시 설치할 수 있도록 몇 가지 추가 단계를 무료로 수행해야 합니다.

파일을 system.slice저장 하거나 여는 것일 수 있습니다 (둘 다 소켓 종속성이 있음). 또는 실행 중인 경우 다시 생성되어 임대를 작성할 수 있습니다.systemd-journald.servicesystemd-udevd.serviceNetworkManagerdhclient/var/...(&/var/항상 자체 장치는 아님) 등이 fuser이를 찾아 종료할 수 있지만 dhclient즉시 NetworkManager시작합니다.

교훈은 많은 것들이 자동화되어 있고 "원할" 수 있다는 것입니다/( 의 경우 더욱 그렇습니다 systemd).

systemd확실히 작동한다면 런레벨 1에 해당하는 항목이 일치 하고 심볼릭 링크가 됩니다 .rescue.targetrunlevel1.targetrescue.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.

umount4) 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 - / 아래에는 읽고 써야 하는 특정 위치가 있습니다. 문서에 따르면 다음과 같습니다.

데비안 ro 루트

블록 장치는 스토리지 스택 구성(파티셔닝됨, 파티션되지 않은 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)'

정확한 파일 시스템 구성, 파티션, 저장 장치 구성을 알지 못하면 추가 정보를 제공하기 어렵습니다. 먼저 돌아가서 문서의 전제 조건(및 위에 설명된 전제 조건)을 다시 확인하겠습니다.

관련 정보