“ เมานต์: / ไม่ว่าง” เมื่อพยายามเมานต์แบบอ่านอย่างเดียวเพื่อให้ฉันสามารถเรียกใช้ zerofree


35

ฉันพยายามเรียกใช้zerofreeบน Ubuntu 11.04 เพื่อให้ฉันสามารถบีบอัดอิมเมจ VirtualBox vdi โดยใช้:

VBoxManage modifyhd Ubuntu.vdi --compact

ในการเรียกใช้zerofreeดิสก์อิมเมจนั้นได้รับการติดตั้งเป็นแบบอ่านอย่างเดียว ฉันทำตามคำแนะนำเหล่านี้ซึ่งบอกว่าจะใช้สิ่งนี้เพื่อประกอบใหม่เป็นแบบอ่านอย่างเดียวจากโหมดการกู้คืน (พรอมต์ปล่อยให้รูทเชลล์)

mount -n -o remount,ro -t ext2 /dev/sda1 /

แต่เมื่อฉันทำสิ่งนี้ฉันได้รับข้อผิดพลาด:

mount: / is busy

ความคิดใด ๆ เกี่ยวกับวิธีการทำเช่นนี้?

ติดตาม : ทำตามคำตอบของ Jari และโพสต์นี้ด้วยการเรียกใช้คำสั่งเหล่านี้เพื่อแก้ไขปัญหา

service rsyslog stop
service network-manager stop
killall dhclient

4
man page สำหรับ zerofree แนะนำให้เรียกใช้telinit 1และนั่นช่วยแก้ไขปัญหาให้ฉันได้
Alex Ryan

คำตอบ:


23

บางกระบวนการกำลังเปิดไฟล์สำหรับการเขียน ตัวอย่างเช่นสิ่งเหล่านี้อาจเป็นโปรแกรมที่เขียนบันทึกเช่นrsyslogdเครื่องมือเครือข่ายdhclientหรืออื่น ๆ ปิดการใช้งานทีละรายการและลองติดตั้งใหม่อาจทำงานได้

fuserคุณสามารถค้นหากระบวนการที่ใช้ไฟล์บางอย่างโดยใช้โปรแกรม ตัวอย่างเช่นfuser -v -m /จะส่งคืนรายการกระบวนการ อย่างไรก็ตามฉันไม่แน่ใจว่าเป็นหนึ่งในสิ่งเหล่านี้ซึ่งทำให้ระบบไฟล์ไม่ว่าง


2
กระบวนการที่มีไฟล์ที่เปิดในโหมดเขียนจะมีตัวพิมพ์ใหญ่Fในแฟล็กการเข้าถึงในfuserเอาต์พุต
Jan Hudec

21

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

lsof / | awk '$4 ~ /[0-9].*w/'

หากต้องการกรอง ID กระบวนการโดยอัตโนมัติให้แยกวิเคราะห์ผลลัพธ์ของlsof -F pa:

lsof -F pa /home | awk '/^p/ {pid = substr($0, 2)} /^a.*w/ {print pid}'

1
พยายามด้วยวิธีแก้ปัญหานี้ยังคงไม่ว่างอาจจะทำให้ทรัพยากรบางอย่างไม่สามารถแสดงด้วยวิธีนี้ หลังจากหยุดบางบริการที่ทำงานอยู่สามารถนับใหม่เป็นอ่านได้อย่างเดียว
Sam Liao

ฉันปิดกระบวนการทั้งหมดที่เปิดไฟล์สำหรับการอ่านการเขียนหรือทั้งสองอย่าง ( u) และมันยังบอกว่าไม่ว่าง
Hubro

12

ปรับปรุงคำตอบของปีเตอร์:

ฉันไม่สามารถฆ่ากระบวนการที่ใช้จุดเมานท์ได้ ดังนั้นฉันทำสิ่งนี้:

  • แก้ไข/etc/fstabเป็นเริ่มในแบบอ่านอย่างเดียวในการบูตครั้งถัดไป Ex:/dev/sda1 / ext2 ro 0 1
  • รีบูตและเปิดเชลล์ (โฮสต์คีย์ + F2 เป็นต้น)
  • เรียกใช้ zerofree

หากต้องการ "กู้คืน" ระบบของคุณ:

  • เมาท์พร้อมตัวเลือกอ่าน - เขียน: $ mount -o remount,rw /dev/sda1
  • แก้ไข/etc/fstabอีกครั้งเพื่อคืนค่าเดิมของคุณ

พิเศษ: หากจำเป็นต้องเปิดโหมดการกู้คืนในขั้นตอนใด ๆ :

  • Reboot
  • พักกะขณะที่ VM กำลังโหลด
  • ตัวเลือกขั้นสูง> ตัวเลือกเคอร์เนลพร้อมโหมดการกู้คืน> วางเพื่อรูทเชลล์พรอมต์

2
Captain Obือต้องการเพิ่ม: ให้แน่ใจว่าคุณติดตั้ง zerofree ก่อนที่คุณจะรีบูตในโหมด ro
Xosofox

ใช้ "พร้อมที่จะไปที่รูทเชลล์พร้อมท์" และ zerofree: ระบบไฟล์เมานท์ rw แต่ฉันไม่มีปัญหาใน VM อื่น ๆ
Pawel Cioch

สิ่งนี้ใช้ได้สำหรับฉันเมื่อ/dev/sda1 / ext2 ro 0 1รายการอยู่ที่ด้านบนสุดของรายการ เมื่อแรกที่ฉันใส่มันเป็นรายการสุดท้ายฉันยังคงมีข้อผิดพลาดไม่ว่างจุดเมานท์
afilina

6

บางครั้งมีกระบวนการมากมายที่ทำให้การเมาต์ไม่ว่างซึ่งอาจจะง่ายกว่าในการรีบูตด้วยเมาต์แบบอ่านอย่างเดียว

เปลี่ยนรายการสำหรับระบบไฟล์รู/etc/fstabทตัวอย่างเช่น:

/dev/sda1 / ext2 relatime,rw,errors=remount-ro 0 1

กลายเป็น:

/dev/sda1 / ext2 noatime,ro 0 1

ในการรีบูตระบบไฟล์จะถูกเมาท์แบบอ่านอย่างเดียวเพื่อให้คุณสามารถทำงานzerofreeได้

เมื่อคุณกำลังสำเร็จรูป, remount ระบบแฟ้มอ่าน / เขียนใหม่อีกครั้ง ( mount -o remount,rw /) /etc/fstabและยกเลิกการเปลี่ยนแปลงของคุณ

แรงบันดาลใจจากhttps://wiki.debian.org/ReadonlyRoot#Enable_readonly_root


ที่ดี! FYI ผมใช้เพียงแค่นี้/dev/sda1 / ext2 ro 0 1และฉันจะบูตในโหมดอ่านได้อย่างเดียว
Topera

5

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

sudo swapoff -a

คุณสามารถตรวจสอบล่วงหน้าและแสดงข้อมูลสรุปของพาร์ติชั่นสลับหรือไฟล์สลับกับ:

swapon -s

หรือ:

cat /proc/swaps

เพื่อเป็นทางเลือกแทนการใช้คำสั่งsudo swapoff -aคุณอาจสามารถปิดใช้งานการสลับโดยการหยุดบริการหรือหน่วยsystemd ตัวอย่างเช่น:

sudo systemctl stop dphys-swapfile

หรือ:

sudo systemctl stop var-swap.swap

ในกรณีของฉันจำเป็นต้องปิดการแลกเปลี่ยนนอกจากการหยุดบริการและกระบวนการใด ๆ ที่มีไฟล์เปิดอยู่สำหรับการเขียนเพื่อให้ฉันสามารถติดตั้งพาร์ติชันรูทของฉันใหม่เป็นแบบอ่านอย่างเดียวเพื่อให้ทำงานfsckบนพาร์ติชันรูทของฉัน สิ่งนี้จำเป็นสำหรับ Raspberry Pi ที่ใช้ Raspbian Jessie


4

หากคุณใช้ systemd การเขียนดิสก์จะหยุดลงโดยการหยุด systemd-journald

# systemctl stop systemd-journald.socket
# systemctl stop systemd-journald.service
# mount -o ro,remount /

1
สำหรับฉันทั้งสองหน่วยเริ่มต้นใหม่ทันที
rld

ทำงานให้ฉันใน "ตัวเลือกขั้นสูง> ตัวเลือกเคอร์เนลพร้อมโหมดการกู้คืน> การส่งเชลล์ไปยังรูทพร้อมต์"
Pawel Cioch

3

ตกลงมีสิ่งที่ฉันทำ

ก่อนอื่นเป้าหมายของฉันคือลดพาร์ติชัน/( ROOT) ของฉันเพื่อเพิ่มพาร์ติชันอื่นในดิสก์ของฉัน

  • จากการรันเซสชันเมื่อทุกอย่างถูกล้างข้อมูลและสำรองข้อมูลแล้ว:

    init 1
    

    เดสก์ท็อปของฉันหายไปและตอนนี้ฉันอยู่บนคอนโซล Linux ...

    ...
    Give root password for maintenance or press CTRL+D to continue
    TheRootPassword_SomethingLike1234
    
  • ตอนนี้พยายามเมาต์/ในโหมดอ่านอย่างเดียว :

    mount -o remount,ro /
    mount: / is busy
    
  • ตกลงจากนี้ฉันอยู่ในโหมดผู้ใช้ทางทฤษฎีแต่ps axแสดงกระบวนการอื่น ๆ มากมาย !!

    ฆ่าพวกเขาทั้งหมดนี้เป็นไปไม่ได้จริง ๆ หรือเป็นอันตราย ... ( kill 1ห้าม ... ฉันไม่มีเวลาเล่นpsdoom :-)

    สิ่งเดียวที่ฉันทำได้คือ a System Requestสำหรับสิ่งนี้ฉันรู้สองวิธี: (ดูDocumentation/sysrq.txtไฟล์ในเคอร์เนล docs):

    1. ครั้งแรกที่ใช้magic SysRq keyกับดักเคอร์เนลแป้นพิมพ์:

      • กดค้างไว้AltGrแล้วรักษากดแล้ว
      • ตีPrtScnเพียงครั้งเดียว แต่ไม่ปล่อยAltGr,
      • กดsหนึ่งครั้งนี่จะส่งEmergency syncคำขอไปยังเคอร์เนลและ
      • hit uซึ่งจะส่งUmount allคำขอซึ่งจะนับใหม่ระบบไฟล์ที่เมาท์แบบอ่านอย่างเดียว
      • จากนั้นปล่อย AltGr
    2. หรือโดยบรรทัดคำสั่ง:

      echo s >/proc/sysrq-trigger
      echo u >/proc/sysrq-trigger
      
  • จากนั้นตอนนี้ฉันทำได้

    fsck -fC0 /dev/mapper/MyDisk-ROOT
    

    ....

...


หมายเหตุ: ถ้าฉันfsckทำสำเร็จฉันได้บูตLive USBเพื่อให้สามารถเรียกใช้resize2fs... คุณลักษณะนี้ยังไม่ได้ใช้งาน ...
F. Hauri

ฉันfsckไม่ทราบ-f; สิ่งนั้นจะทำอย่างไรบล็อกไม่มีการอ้างอิงที่เป็นศูนย์?
ᴠɪɴᴄᴇɴᴛ

1
@ ᴠɪɴᴄᴇɴᴛ: ext2ฉันเป็นfsckสวิตช์: -f กำลังตรวจสอบแม้ว่าระบบไฟล์จะดูสะอาด
F. Hauri

1

สำหรับคนอื่นที่กำลังมองหาวิธีแก้ไขด่วนเพื่อวางลงในเทอร์มินัลของคุณ ...

(ก่อนที่จะทำตามคำสั่งด้านล่างตรวจสอบให้แน่ใจว่าคุณได้ทำตามขั้นตอนอื่น ๆtelinit 1แล้ว)

พบสิ่งนี้ :

fuser -mv /dev/sda1 > /tmp/sda1.pids
kill `cat /tmp/sda1.pids`

คำสั่งอาจฆ่าเซสชันของคุณ แต่หลังจากที่คุณกลับมาพาร์ติชันของคุณพร้อมที่จะติดตั้งใหม่


1

แนบไฟล์ vdi เป็นโวลุ่มเพิ่มเติมและที่ไม่ใช่ระบบไปยัง VirtualBox อื่น ที่นั่นคุณสามารถติดตั้งใหม่ได้ตามต้องการและดำเนินการ zerofree

ให้เราบอกว่าคุณต้องการที่จะกระชับดิสก์ VDI ของVM1 (Virtual Machine 1) แล้วคุณจะต้องเป็นครั้งที่สองVM2 นั่นคือ, :

  • ตรวจสอบให้แน่ใจว่าทั้ง VM1 และ VM2 ไม่ได้ทำงานอยู่
  • จากผู้จัดการ VirtualBox:

    • เลือก VM2
    • "การตั้งค่า" -> "ที่เก็บข้อมูล" -> "เพิ่มฮาร์ดดิสก์": "เลือกเป็นดิสก์เพิ่มเติม",

    • เลือกไฟล์ vdi ของ VM1 ซึ่งคุณต้องการกระชับ คำแนะนำ: ตรวจสอบให้แน่ใจว่าฮาร์ดไดรฟ์ที่เพิ่งเพิ่มลงใน VM2 เป็นลำดับที่สองในลำดับการบู๊ตหลังจากดิสก์ดั้งเดิมของ VM2

    • เริ่มต้น VM2: ตอนนี้คุณสามารถติดตั้งไดรฟ์ข้อมูลของ VM1 เป็นดิสก์เพิ่มเติมสำหรับ VM2 ได้เนื่องจากไม่มีกระบวนการที่ใช้ใน VM2 คำแนะนำ: ขั้นแรกให้เปิดวอลลุ่มด้วย folebrowser ของ Linux ซึ่งจะเมานวอลลุ่มโดยอัตโนมัติ จากนั้นใช้mount -lเพื่อดูว่า_Device_คำสั่งsudo mount -o remount,ro _Device_ใดอยู่ใน ในกรณีของฉันนี้คือ/ dev / sdb1 ดังนั้นคำสั่งคือ (1) sudo mount -o ro,remount /dev/sdb1แล้ว sudo zerofree /dev/sdb1(2)

แทนที่จะเป็น VM2 คุณควรจะสามารถบูตจากและดิสก์การติดตั้งเช่นและอิมเมจ. isoและบรรลุ แต่ฉันไม่ได้ลอง


0

ฉันถือว่าคุณพยายามเรียกใช้mountคำสั่งใน VM อย่างไรก็ตามคุณอาจมีพาร์ติชันรูทที่แตกต่างจากผู้โพสต์ในฟอรัม

ลอง:

mount -o ro,remount /

ซึ่งไม่ขึ้นอยู่กับตัวเลือก fs หรือเมานต์ หากยังไม่สามารถทำงานคุณยังสามารถลองตรวจสอบ FS รากของคุณด้วยหรือgrep " / " /proc/mounts cat /proc/cmdlineหากระบบไฟล์รูทของคุณเป็นเช่น / dev / mapper / system-rootfs คุณสามารถใช้:

mount -o ro,remount /dev/mapper/system-rootfs /

0

ฉันมีปัญหานี้ซึ่งทำให้ฉันไม่สามารถวางเครื่องในโหมดอ่านอย่างเดียว การแก้ปัญหาทำให้ฉันใช้เวลานานกว่า id ที่จะยอมรับ ... ฉันเชื่อว่าปัญหาของฉันคือฉันออกจาก Apache-Zeppelin แล้วทำงานและลืมมันไป ตรวจสอบให้แน่ใจว่าคุณไม่ได้ทำแบบเดียวกันกับบริการโฮสติ้งประเภทอื่น ในการแก้ปัญหาฉันใช้fuser -kill /เพื่อยุติกระบวนการทั้งหมดที่อาจทำให้เกิดปัญหาและอนุญาตให้ฉันกลับเข้าสู่โหมด ro


0

ทางออกสำหรับฉันคือการรีบูตระบบปฏิบัติการและเลือก "โหมดการกู้คืน" จากเมนูการบูตของ GRUB จาก "โหมดการกู้คืน" จะมีกระบวนการทำงานน้อยลงและการเมาท์แบบอ่านอย่างเดียวจะทำงานได้ดี

หากระบบมีแลกเปลี่ยนไฟล์บนระบบแฟ้มราก (มากกว่าพาร์ทิชัน swap) swapoff -aก็ยังมีความจำเป็นต้องชั่วคราวปิดแฟ้มสลับกับ

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