패키지 업그레이드 후 파일 시스템을 다시 읽기 전용으로 다시 마운트 할 수 없음


10

데비안 시스템에는 /별도의 파티션이 있고 마운트되어 read-only있습니다. 만 /home/, /var/그리고 /tmp/쓸 수 있습니다. 나는 또한을 만들었습니다 Pre-Invoke그리고 Post-Invoke apt hook그 때문에, apt패키지가 설치 또는 업그레이드하고, 다시 그것을 다시 마운트되어 쓰기에 대해 다시 마운트 시스템을 자동으로 할 수있는 read-only때 완성 :

DPkg::Pre-Invoke  {"mount -o remount,rw / ;};
DPkg::Post-Invoke {"mount -o remount    / ;};

이 전체 설정은 한 가지 예외로 잘 작동합니다. 때때로 설치 / 업그레이드 프로세스 중에 일부 서비스를 다시 시작하거나 내 /마운트 시 짧은 창에서 새 파일을 열어야합니다 read-write. 이러한 파일은 write권한 으로 열립니다 . 설치 / 업그레이드가 완료된 후 내 Post-Invoke후크는로 다시 마운트 할 수 없으므로 오류를 반환 /합니다 read-only.

이 문제를 해결할 방법이 있습니까? 이 상황에서 나는 일반적으로 서버를 다시 시작해야하기 때문에 매우 성가시다.

편집하다

아래는 최신 패키지 업그레이드 로그이며 설명 된 오류가 발생했습니다.

root@alpha# apt-get upgrade 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be upgraded:
  base-files curl libc-bin libc6 libcurl3 libcurl3-gnutls libmysqlclient18 libssl1.0.0 locales multiarch-support mysql-client mysql-client-5.5 mysql-common
  nscd openssl tzdata wget whois
18 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 18.7 MB of archives.
After this operation, 264 kB of additional disk space will be used.
Do you want to continue [Y/n]? 
Fetched 18.7 MB in 0s (33.2 MB/s) 
Preconfiguring packages ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace base-files 7.1wheezy3 (using .../base-files_7.1wheezy4_amd64.deb) ...
Unpacking replacement base-files ...
Processing triggers for man-db ...
Processing triggers for install-info ...
Setting up base-files (7.1wheezy4) ...
Installing new version of config file /etc/debian_version ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc-bin 2.13-38 (using .../libc-bin_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc-bin ...
Processing triggers for man-db ...
Setting up libc-bin (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc6:amd64 2.13-38 (using .../libc6_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc6:amd64 ...
Setting up libc6:amd64 (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libssl1.0.0:amd64 1.0.1e-2+deb7u1 (using .../libssl1.0.0_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement libssl1.0.0:amd64 ...
Preparing to replace curl 7.26.0-1+wheezy7 (using .../curl_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement curl ...
Preparing to replace libcurl3:amd64 7.26.0-1+wheezy7 (using .../libcurl3_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3:amd64 ...
Preparing to replace libcurl3-gnutls:amd64 7.26.0-1+wheezy7 (using .../libcurl3-gnutls_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3-gnutls:amd64 ...
Preparing to replace mysql-common 5.5.33+dfsg-0+wheezy1 (using .../mysql-common_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-common ...
Preparing to replace libmysqlclient18:amd64 5.5.33+dfsg-0+wheezy1 (using .../libmysqlclient18_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement libmysqlclient18:amd64 ...
Preparing to replace multiarch-support 2.13-38 (using .../multiarch-support_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement multiarch-support ...
Processing triggers for man-db ...
Setting up multiarch-support (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace tzdata 2013h-0wheezy1 (using .../tzdata_2013i-0wheezy1_all.deb) ...
Unpacking replacement tzdata ...
Setting up tzdata (2013i-0wheezy1) ...

Current default time zone: 'Europe/London'
Local time is now:      Sat Feb 15 11:35:41 CET 2014.
Universal Time is now:  Sat Feb 15 11:35:41 UTC 2014.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

(Reading database ... 20511 files and directories currently installed.)
Preparing to replace wget 1.13.4-3 (using .../wget_1.13.4-3+deb7u1_amd64.deb) ...
Unpacking replacement wget ...
Preparing to replace locales 2.13-38 (using .../locales_2.13-38+deb7u1_all.deb) ...
Unpacking replacement locales ...
Preparing to replace whois 5.0.23 (using .../whois_5.1.1~deb7u1_amd64.deb) ...
Unpacking replacement whois ...
Preparing to replace mysql-client 5.5.33+dfsg-0+wheezy1 (using .../mysql-client_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-client ...
Preparing to replace mysql-client-5.5 5.5.33+dfsg-0+wheezy1 (using .../mysql-client-5.5_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement mysql-client-5.5 ...
Preparing to replace nscd 2.13-38 (using .../nscd_2.13-38+deb7u1_amd64.deb) ...
[ ok ] Stopping Name Service Cache Daemon: nscd.
Unpacking replacement nscd ...
Preparing to replace openssl 1.0.1e-2+deb7u1 (using .../openssl_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement openssl ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Setting up libssl1.0.0:amd64 (1.0.1e-2+deb7u4) ...
Setting up libcurl3:amd64 (7.26.0-1+wheezy8) ...
Setting up curl (7.26.0-1+wheezy8) ...
Setting up libcurl3-gnutls:amd64 (7.26.0-1+wheezy8) ...
Setting up mysql-common (5.5.35+dfsg-0+wheezy1) ...
Setting up libmysqlclient18:amd64 (5.5.35+dfsg-0+wheezy1) ...
Setting up wget (1.13.4-3+deb7u1) ...
Setting up locales (2.13-38+deb7u1) ...
Generating locales (this might take a while)...
  en_DK.UTF-8... done
  en_US.UTF-8... done
Generation complete.
Setting up whois (5.1.1~deb7u1) ...
Setting up mysql-client-5.5 (5.5.35+dfsg-0+wheezy1) ...
Setting up mysql-client (5.5.35+dfsg-0+wheezy1) ...
Setting up nscd (2.13-38+deb7u1) ...
[ ok ] Starting Name Service Cache Daemon: nscd.
Setting up openssl (1.0.1e-2+deb7u4) ...
mount: / is busy

마지막 줄 ( mount: / is busy)은로 /다시 마운트하려고 할 때 apt가 반환 한 오류 read-only입니다.

최신 정보:

에서 제안한 명령은 Graeme파일을 표시하지 않습니다.

# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME

파일을 열지 못하게 read-write하거나 다시 마운트 ro하거나 차단 패키지를 찾아서 변경할 수있는 동안 서버를 다시 부팅 하지 못하게하는 방법을 찾고 있습니까? 아니면 해결책으로 받아 들여질 수 있습니까?
Anthon

이상적으로는 파일 rw이 처음 에 열리지 않도록하고 싶습니다 . 그러나 ro다시 시작하지 않고 다시 마운트 할 수있는 솔루션 도 좋습니다.
Martin Vegter

문제가있는 서비스를 중지했다가 다시 마운트 한 후 다시 시작 하시겠습니까?
frostschutz

@martin 이미 문제의 서비스에 대한 개요를 가지고 있습니까? 나는 당신이 제시 한 설정을 좋아하고 VM에서 시도 할 것이지만, 당신의 시스템에서 기본값이 아닌 것을 실행하지 않고 실험이 부분적으로 관련이 있다는 것을 아는 것이 좋을 것입니다.
Anthon

@Anthon 어떤 서비스가 문제인지 잘 모르겠습니다. 그러나 명확성을 위해 위의 편집을 참조하십시오. 내 서버도 VM입니다. 서비스가 거의 실행되지 않는 최소 설치입니다.
Martin Vegter

답변:


2

내 생각에 그것은 단지 서비스가 아니라 루트 파일 시스템 안에 / home 및 / var와 같은 다른 파일 시스템이 마운트되어 있다는 사실입니다. 그 외에도, 내가 파낼 수있는 가장 좋은 해결책은 다음과 같습니다.

https://sites.google.com/site/linuxpendrive/rorootfs

읽기 전용 파일 시스템에 패키지를 설치 / 제거하는 방법 섹션을 찾으십시오 . 간단히 말해서 패키지 관리자를 사용하기 전에 대상 파일 시스템을 다시 마운트 한 다음 새 마운트로 chroot하는 것이 포함됩니다.

다른 답변 중 하나에 요약 된 제안은 루트 파일 시스템이 패키지 업데이트를 위해 rw로 다시 마운트 될 때 발생하는 일에 대해 가정하므로 데비안이 가정 된 것과 다른 동작을 보이는 경우이 솔루션은 실제로 데비안에서 작동하지 않을 수 있습니다. 하지만 이봐, 그럴 가치가 있다고 생각해


1

이에 대한 명확한 답을 얻으려면 어떤 파일이 mount: / is busy오류를 일으키는 지 확인해야 합니다. 당신은 이것을 할 수 있습니다 :

lsof / | awk 'NR==1 || $4~/[0-9][uw]/'

OP의 다른 질문 -lsof : show files open을 읽기-쓰기로 표시 -에 대한 내 대답을 참조하십시오 . 무언가를 보려면 별도의 스크립트에 스크립트를 넣고 스크립트를 apt 후크에 넣어야 할 수도 있습니다.

/etc서비스가 시작되면 파일 이 열려있는 것으로 의심됩니다 . 일부 프로그램 / 데몬은 구성을 동적으로 업데이트합니다. NetworkManager그리고 cupsd두 가지 예입니다. 구성 스크립트가 아닌 새 프린터를 스캔 cups하는 업데이트가 문제의 원인 일 수 있습니다. 문제의 원인이 아닌 경우에도 쓰기 가능한 파일 시스템을 사용하는 것이 좋습니다 .cupsddpkg/etc

다시 마운트하려고 할 때 파일 시스템 버퍼가 여전히 디스크로 플러시되는 과정에있을 수 있습니다. mountIO가 완료 될 때까지 차단 해야하는지 또는 실패하고 디스크를 사용 중이라고보고하는지 여부에 대한 동작이 무엇인지 잘 모르겠습니다 . 첫 번째는 더 가능성이있는 것처럼 보이지만 sync출력 에는 호출이 없습니다 strace( mount시스템 호출이 가능할지라도 ). 어쨌든, 위 synclsof내용이 표시되지 않으면 다시 마운트하기 전에 수행 할 수 있습니다 .

DPkg::Post-Invoke { "sync; mount -o remount /"; };

이건 이상해. 귀하의 lsof명령은 파일을 나열하지 않습니다
Martin Vegter

1
흥미롭게도 메모리 매핑 된 파일은 기록 중 복사가 가능합니다. 이것이 이것이 마운트에 어떤 영향을 미치는지 모르겠으며 확실하지 않으며 lsof심지어 이것을 보여줍니다. 당신 lsof은 당신의 갈고리와 함께 실행하려고 했습니까 ? 방법에 대한 sync물건?
Graeme
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.