ไม่สามารถติดตั้งระบบไฟล์กลับเป็นแบบอ่านอย่างเดียวหลังจากการอัปเกรดแพ็คเกจ


10

ในระบบ Debian ของฉันฉันมีของฉันพาร์ติชันบนแยกต่างหากและติดตั้ง/ 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ผิดพลาดผลตอบแทนเบ็ดเพราะมันไม่สามารถ remount กลับไป/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) เป็นข้อผิดพลาดที่ส่งกลับโดยฉลาดเมื่อพยายามที่จะ remount กลับไป/read-only

UPDATE:

คำสั่งที่แนะนำโดย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

@ ทันใดนั้นฉันไม่รู้ว่าบริการตัวใดที่ละเมิด แต่ดูการแก้ไขของฉันข้างต้นเพื่อความกระจ่าง เซิร์ฟเวอร์ของฉันยังเป็น VM เป็นการติดตั้งเพียงเล็กน้อยโดยใช้บริการเพียงไม่กี่เครื่องเท่านั้น
Martin Vegter

คำตอบ:


2

ฉันเดาว่ามันไม่ใช่แค่บริการ แต่เป็นความจริงที่ว่าคุณมีระบบไฟล์อื่น ๆ เช่น / home และ / var ติดตั้งในระบบไฟล์รูท นอกเหนือจากนั้นทางออกที่ดีที่สุดที่ฉันสามารถขุดพบได้ที่นี่:

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

ค้นหาส่วนที่ชื่อฉันจะติดตั้ง / ถอนการติดตั้งแพคเกจบนระบบไฟล์แบบอ่านอย่างเดียวได้อย่างไร โดยสรุปแล้วมันเกี่ยวข้องกับการติดตั้งระบบไฟล์เป้าหมายอีกครั้งแล้วจึงทำการ chrooting เข้าสู่เมาท์ใหม่ก่อนที่จะใช้ตัวจัดการแพคเกจ

คำแนะนำที่อธิบายไว้ในคำตอบอื่น ๆ เป็นข้อสันนิษฐานว่าเกิดอะไรขึ้นเมื่อระบบไฟล์รูทได้รับการแจ้งเตือน rw สำหรับการอัปเดตแพ็กเกจดังนั้นโซลูชันนี้อาจใช้งานไม่ได้กับ Debian หาก Debian แสดงพฤติกรรมที่แตกต่างจากที่สันนิษฐาน แต่เดี๋ยวก่อนมันคุ้มค่ากับการยิงฉันคิดว่า ...


1

เพื่อให้ได้คำตอบที่ชัดเจนยิ่งขึ้นเราต้องดูว่าไฟล์ใดทำให้เกิดmount: / is busyข้อผิดพลาด คุณสามารถทำได้ด้วย:

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

ดูคำตอบของฉันสำหรับคำถามอื่น ๆ ของ OP - lsof: แสดงไฟล์ที่เปิดเป็นอ่าน - เขียน - สำหรับคำเตือนในเรื่องนี้ อาจเป็นไปได้ว่าคุณต้องใส่สิ่งนี้ลงในสคริปต์แยกต่างหากและใส่สคริปต์ลงในตะขอ apt เพื่อดูบางสิ่งบางอย่าง

ฉันสงสัยว่าไฟล์ที่อยู่ภายใต้/etcยังคงเปิดอยู่เมื่อเริ่มให้บริการ บางโปรแกรม / daemons อัพเดตการกำหนดค่าแบบไดนามิก NetworkManagerและcupsdเป็นสองตัวอย่าง การอัพเดตcupsที่ทำให้เกิดcupsdการสแกนหาเครื่องพิมพ์ใหม่ (ตรงข้ามกับdpkgสคริปต์การกำหนดค่า) อาจเป็นสิ่งที่ทำให้เกิดปัญหาของคุณ ฉันขอแนะนำให้คุณใส่/etcระบบไฟล์แบบเขียนได้แม้ว่าจะไม่ใช่สาเหตุของปัญหาของคุณ

ความเป็นไปได้อีกอย่างหนึ่งคือบัฟเฟอร์ของระบบไฟล์ยังอยู่ในขั้นตอนการล้างข้อมูลลงดิสก์เมื่อคุณพยายามทำการเมานท์ใหม่ ฉันไม่แน่ใจว่าสิ่งที่พฤติกรรมmountอยู่ที่นี่ไม่ว่าจะเป็นการปิดกั้นจนกว่า IO จะเสร็จสมบูรณ์หรือล้มเหลวและรายงานว่าดิสก์ไม่ว่าง ครั้งแรกดูเหมือนว่าจะมีโอกาสมากขึ้น แต่ฉันไม่เห็นsyncสายในเอาท์พุทของstrace(แม้ว่าอาจจะmountเรียกระบบนี้) อย่างไรก็ตามมันอาจจะทำงานsyncก่อนที่จะติดตั้งใหม่ถ้าlsofข้างต้นไม่แสดงอะไรเช่น:

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

มันแปลก ๆ. lsofคำสั่งของคุณไม่มีรายการไฟล์ใด ๆ
Martin Vegter

1
น่าสนใจอีกอย่างหนึ่งคือไฟล์ที่แมปหน่วยความจำสามารถคัดลอกเมื่อเขียน ฉันไม่ทราบว่าสิ่งนี้มีผลต่อการติดตั้งอย่างไรรวมทั้งฉันไม่แน่ใจlsofและยังแสดงสิ่งนี้ คุณลองวิ่งlsofด้วยเบ็ดของคุณหรือไม่? แล้วเรื่องsyncล่ะ?
แกรม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.