ไม่สามารถนับใหม่ / ย้อนกลับเป็นอ่านอย่างเดียวหลังจากอัปเกรดแพ็คเกจ


13

ฉันกำลังใช้ Debian Stretch read-onlyพาร์ทิชันรากของฉันคือการติดตั้ง เฉพาะเมื่อฉันติดตั้งหรืออัปเกรดแพ็คเกจจะ/ติดตั้งใหม่read-write(โดยใช้ apt hook) แล้วจึงติดตั้งใหม่อีก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 จึงไม่แสดงรายการไฟล์เปิดที่ไม่ได้เชื่อมโยงอีกต่อไป

ฉันจะแสดงรายการไฟล์ที่ป้องกัน / จากการถูกประกอบใหม่เป็นอ่านอย่างเดียวได้อย่างไร

UPDATE

ฉันได้หยุดกระบวนการทั้งหมดที่สามารถหยุดและมีเพียงinitและgettyยังคงทำงานอยู่ แต่ฉันยังคงไม่สามารถ remount ไป/ro


ไฟล์เปิดที่ไม่ได้เชื่อมโยงนั้นไม่ได้เป็นเพียงอุปสรรคเท่านั้น ค้นหาwหรือuในFDคอลัมน์ของlsofเอาต์พุตหรือหาFในเอาต์พุตของfuser -vm /ตัวอย่างเช่น ฉันไม่สามารถให้รายชื่อที่ละเอียดถี่ถ้วนแก่คุณได้ คุณอาจต้องการติดตั้งแพ็คเกจneedrestart
Ferenc Wágner

คำถามงี่เง่า แต่คุณกำลังเรียกใช้ lsof เป็นroot?
กีวี

1
Kiwy - ใช่ฉันกำลังเรียกใช้ lsof เป็น root
Martin Vegter

1
ไม่fuser -m / บอกว่าใช้ root หรือไม่
Rui F Ribeiro

1
@ Marcus Linsner - ฉันไม่ได้ใช้ systemd ฉันใช้ init
Martin Vegter

คำตอบ:


2

ฉันจะแสดงรายการไฟล์ที่ป้องกัน / จากการถูกประกอบใหม่เป็นอ่านอย่างเดียวได้อย่างไร

A) fuserสามารถพบได้ในpsmiscแพ็คเกจ; เป็นกรณีการใช้งานที่ฉันพบนี้ส่องสว่างและเป็นประโยชน์มากกว่าfuserlsof

# 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) UPDATEในคำอธิบายระบุว่าระบบมี ... initและgettyยังคงทำงานอยู่ ...

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

ต่อเดวิกิพีเดีย ,

กระบวนการเริ่มต้นระบบได้รับการจัดการโดย init daemon ในรุ่นบีบและรุ่นก่อนหน้า daemon นั้นมีให้โดยแพคเกจ sysvinit และไม่สนับสนุนตัวเลือกอื่น ในwheezyเริ่มต้น daemon เริ่มต้นยังคงอยู่sysvinitแต่ "ตัวอย่างเทคโนโลยี" ของ systemd สามารถใช้ได้ ในjessie and stretchระบบ init เริ่มต้นคือsystemdแต่รองรับการสลับเป็น sysvinit

เนื่องจาก jessie สนับสนุนเฉพาะ systemd เท่านั้น sysvinit ได้รับการสนับสนุนเป็นส่วนใหญ่ แต่แพ็คเกจ Debian ไม่จำเป็นต้องมีสคริปต์เริ่มต้น 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ถ้าไม่ได้ตรวจสอบอีกครั้งกับ

4) FWIW; ฉันเคยเห็นครั้งเมื่อumountล้มเหลวเมื่อ / ถ้าอุปกรณ์อื่นถูกติดตั้งในไดเรกทอรีย่อยของการติดตั้งอื่นเช่นการติดตั้งซ้อนกัน ตัวอย่างเช่นumount /จะล้มเหลวหาก/ var /หรือ/ boot /อยู่ในอุปกรณ์อื่น (และติดตั้ง) แม้ว่าmount -o remount,ro /จะยังคงทำงานได้ในกรณีนี้

lsblk สามารถเป็นประโยชน์ในการมองเห็นการเมาท์แบบซ้อน

เหตุใด lsof + L1 จึงไม่แสดงรายการไฟล์เปิดที่ไม่ได้เชื่อมโยงอีกต่อไป

เนื่องจากไม่สามารถใช้งานได้ (ซ็อกเก็ตหรือ FIFO & ท่อส่วนใหญ่) จึงไม่เปิดไฟล์อีกต่อไป (กระบวนการหลักปิดตัวอธิบายไฟล์) หรือพวกเขา (ยังคง) มีลิงก์มากกว่า 1 รายการ

ผู้ชายlsof (8)รายละเอียด ...

+ | -L [l]

ตัวเลือกนี้เปิดใช้งาน ('+') หรือปิดการใช้งาน ('-') รายการของการนับลิงก์ไฟล์ที่มีให้เช่นที่พวกเขาไม่พร้อมใช้งานสำหรับซ็อกเก็ตหรือ FIFO และท่อส่วนใหญ่

เมื่อ + L ถูกระบุโดยไม่มีหมายเลขต่อไปนี้จำนวนลิงก์ทั้งหมดจะถูกแสดง เมื่อระบุ -L (ค่าเริ่มต้น) จะไม่มีการนับลิงก์ใด ๆ

เมื่อ + L ตามด้วยหมายเลขเฉพาะไฟล์ที่มีการเชื่อมโยงนับน้อยกว่าจำนวนที่จะได้รับการจดทะเบียน (อาจไม่มีตัวเลขตาม -L) ข้อมูลจำเพาะของรูปแบบ '' + L1 '' จะเลือกไฟล์ที่เปิดอยู่ซึ่งไม่ได้เชื่อมโยง ข้อมูลจำเพาะของแบบฟอร์ม+aL1 <file_system>จะเลือกไฟล์ที่ไม่ได้เชื่อมโยงเปิดบนระบบไฟล์ที่ระบุ


0

คุณได้/procติดตั้ง?

เห็นได้ชัดว่าเป็นคนที่ระมัดระวังในการ/ติดตั้งแบบอ่านอย่างเดียวส่วนใหญ่ฉันคิดว่าคุณอาจเลือกที่จะไม่ติดตั้ง procfs แต่ต้องใช้ procfs lsofเพื่อค้นหาไฟล์ที่เปิดอยู่

ไฟล์ที่เปิดค้างไว้โดยกระบวนการถูกเปิดเผยโดยเคอร์เนลผ่านลิงก์สัญลักษณ์ใน procfs ไดเรกทอรี/proc/<pid>/fdมี symlink สำหรับแต่ละไฟล์ที่ค้างไว้เปิด ชื่อของ symlink คือหมายเลขตัวอธิบายไฟล์และพา ธ ที่อ้างอิงโดย symlink คือพา ธ ไฟล์

ยังมีลิงก์สัญลักษณ์ Dangling ที่ค้างอยู่/procสำหรับไฟล์ที่เปิดอยู่ซึ่งถูกลบไปแล้ว และเส้นทางที่ถูกอ้างอิงของไฟล์จะถูกเปลี่ยนชื่อเป็นลงท้ายด้วย "(ถูกลบ)"

อะไรlsof +L1คือสิ่งที่ไม่แตกต่างจากหนึ่งซับด่วน:

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

ดังนั้นคุณสามารถใช้หนึ่งที่คล้ายกันซับที่จะแสดงรายการทั้งหมดเปิดไฟล์ที่อาจป้องกันไม่ให้รากของระบบแฟ้มจากการนั่งประจำที่ (ให้ทำงาน/proc)

อย่างไรก็ตามหากคุณ/procติดตั้ง/ ไม่ได้ติดตั้งสาเหตุอื่น ๆ ที่ฉันคิดว่าเป็นข้อผิดพลาด ... ยังไงก็ตาม FYI บนระบบ 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
    [...]

ใช่ฉัน/procติดตั้งแล้ว ฉันไม่ทำตามเหตุผลของคุณว่าทำไมฉันถึงไม่มี ยังไงก็ตามstat -c%N /proc/[0-9]*/fd/* | grep deletedฉันไม่เห็นอะไรเลย
Martin Vegter

0

ฉันสามารถทำซ้ำปัญหานี้เพียงครั้งเดียวและแก้ไขได้โดยเพียงแค่ใช้mountกับตัวเลือก-n

การอ้างอิงคำสั่งman mount :

-n, --no-mtab
      Mount without writing in /etc/mtab.  This is necessary for example when /etc is on a read-only filesystem.

mountโปรแกรมตัวเองเปิดไฟล์ (s) สำหรับการเขียนในระบบแฟ้มรากฟังเหมือนคำอธิบายที่เป็นไปได้กับผม mountเขียนโดยเฉพาะ/etc/mtabหลังจากทั้งหมดและ/etcบ่อยครั้งเป็นส่วนหนึ่งของระบบไฟล์รูท อย่างไรก็ตามฉันไม่สามารถทำซ้ำได้อีกครั้งในเครื่องเดียวกันหลังจากฉันทำครั้งเดียว ...

นี่ช่วยแก้ปัญหาของคุณได้ไหม


ไม่การใช้-nกับเมานต์ไม่สร้างความแตกต่าง
Martin Vegter

0

หากไม่มีการมองเห็นระบบของคุณเป็นเรื่องยากมากที่จะบอกคุณว่าปัญหาคืออะไร ความคิดเห็นและคำตอบก่อนหน้าเป็นการเริ่มต้นที่ดี

ที่กล่าวว่าฉันจะกลับไปตลอดทางผ่านเดเบียนวิกิที่อธิบายถึงข้อกำหนดเบื้องต้นสำหรับการติดตั้ง / อ่านอย่างเดียว

ลิงก์ไปยังเอกสารอยู่ที่นี่: https://wiki.debian.org/ReadonlyRoot

ตัวใหญ่ฉันจะพาคุณไปที่นี่:

1 - มีสถานที่เฉพาะภายใต้ / ที่ต้องอ่านเขียน ตามเอกสารมันมีลักษณะดังนี้:

เดเมี่ยนรูต

อุปกรณ์บล็อกของคุณอาจจะแตกต่างกันไปขึ้นอยู่กับการกำหนดค่าสแต็คหน่วยเก็บข้อมูลของคุณ (พาร์ทิชันพาร์ทิชันเลเวลเลสที ฯลฯ .. ) แต่แนวคิดหลักคือคุณต้องมีจุดเชื่อมต่อทั้ง 4 จุด

2 - มีไฟล์พิเศษจำนวนมากใน / etc ที่คุณต้องการในการสร้างลิงก์สัญลักษณ์สำหรับหรือดำเนินการเปลี่ยนแปลงอื่น ๆ (มีรายละเอียดโดยเฉพาะในบทความที่ลิงก์) สิ่งเหล่านี้อาจหรือไม่อาจใช้ขึ้นอยู่กับแอปพลิเคชันที่เซิร์ฟเวอร์ linux ของคุณกำลังทำงานอยู่ ไฟล์บางไฟล์อาจไม่มีอยู่ในเครื่องของคุณ แต่ฉันรวมทุกอย่างไว้ในเอกสาร โปรดทราบว่าฉันขอแนะนำให้ทำการเปลี่ยนแปลงเหล่านี้แม้ว่าคุณจะฆ่า pid ของกระบวนการแล้วก็ตาม นี่คือเส้นทางโดยตรงจาก debian wiki:

  • adjtime
  • init.d / ALSA-utils
  • / etc / จัดส่ง / รวม / ดัชนี
  • ไฟล์สถานะถ้วยใด ๆ , 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

เมื่อคุณตรวจสอบทั้งหมดข้างต้นและยืนยันว่าสอดคล้องกับข้อมูลจำเพาะในวิกิสิ่งต่อไปที่ต้องตรวจสอบคือ /etc/apt/apt.apt

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"; };
}; 

จากข้อผิดพลาดของคุณสิ่งสุดท้ายที่คุณสามารถตรวจสอบได้ตามเอกสารมาจากด้านล่าง:

"หลังจากอัปเกรดแพคเกจคุณอาจประสบปัญหาที่เมาท์ปฏิเสธที่จะติดตั้งระบบไฟล์ใหม่เพื่อบอกคุณว่า“ / ไม่ว่าง” อีกครั้ง ปัญหานี้เกิดจากไฟล์ที่ถูกลบซึ่งยังคงถูกใช้โดยกระบวนการเพื่อค้นหาว่ากระบวนการใดที่ใช้ไฟล์ที่ถูกลบใช้เครื่องมือ checkrestart (1) จากแพ็คเกจ debian-goodies หรือใช้คำสั่งต่อไปนี้บ่อยครั้งที่ daemons เหล่านี้ใช้ไลบรารีที่อัพเกรดแล้ว ต้องรีสตาร์ทมันเพื่อให้ไฟล์ถูกปล่อยออกมา "

คำสั่งให้ไว้ในเอกสาร:

{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.