제로 프리를 실행할 수 있도록 읽기 전용으로 마운트하려고 할 때 "mount : / busy busy"


35

다음 zerofree을 사용하여 VirtualBox vdi 이미지를 압축 할 수 있도록 Ubuntu 11.04 에서 실행하려고합니다 .

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
zerofree에 대한 맨 페이지는 달리기를 제안 telinit 1하고 저에게 문제를 해결했습니다.
Alex Ryan

답변:


23

일부 프로세스는 파일을 쓰기 위해 열어 둡니다. 예를 들어 rsyslogd, 네트워킹 도구 와 같은 로그를 작성하는 프로그램 등이 될 수 있습니다 dhclient. 하나씩 종료하고 다시 마운트하려고하면 작동 할 수 있습니다.

프로그램을 사용하여 특정 파일을 사용하는 프로세스를 찾을 수 있습니다 fuser. 예를 들어 fuser -v -m /프로세스 목록을 반환합니다. 그러나 파일 시스템을 계속 사용하는 것 중 하나인지 확실하지 않습니다.


2
쓰기 모드에서 파일이 열린 프로세스 Ffuser출력 의 액세스 플래그에 자본 을 갖습니다 .
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
이 솔루션으로 시도했지만 여전히 바쁘지만 일부 리소스는이 방법으로 표시 할 수 없습니다. 실행중인 일부 서비스를 중지 한 후 fs를 읽기 전용으로 다시 마운트 할 수 있습니다.
Sam Liao

읽기, 쓰기 또는 둘 다 ( u) 하기 위해 파일을 연 모든 프로세스를 닫았 지만 여전히 사용 중이라고 말합니다.
Hubro

12

베드로의 답변 개선 :

마운트 포인트를 사용하는 프로세스를 종료 할 수 없습니다. 그래서 나는 이것을했다 :

  • /etc/fstab다음 부팅시 읽기 전용으로 시작하도록 편집하십시오 . 전의:/dev/sda1 / ext2 ro 0 1
  • 셸을 재부팅하고 엽니 다 (예 : 호스트 키 + F2).
  • 제로 프리 실행

시스템을 "복구"하려면 :

  • 읽기-쓰기 옵션으로 마운트 : $ mount -o remount,rw /dev/sda1
  • /etc/fstab원래 값을 복원하여 다시 편집

추가 : 필요한 경우 모든 단계에서 복구 모드 를 엽니 다 .

  • 재부팅
  • VM이로드되는 동안 교대 유지
  • 고급 옵션> 복구 모드의 커널 옵션> 루트 쉘 프롬프트로 드롭

2
캡틴 분명히 추가하고 싶어 : ro 모드로 재부팅하기 전에 zerofree를 설치하십시오
Xosofox

"Drop to Root Shell Prompt"및 zerofree : filesystem 마운트 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.

완료되면 파일 시스템 읽기 / 쓰기를 다시 마운트 ( mount -o remount,rw /)하고 다시 변경하십시오 /etc/fstab.

https://wiki.debian.org/ReadonlyRoot#Enable_readonly_root에서 영감을 얻음


큰! 참고로, 나는 이것을 사용 /dev/sda1 / ext2 ro 0 1했으며 읽기 전용 모드로 부팅 할 수 있습니다.
Topera

5

열려있는 파일로 모든 서비스 및 프로세스를 중지 한 후에도 여전히 장치를 마운트 해제하거나 다시 마운트 할 수없는 경우 스왑 파일 또는 스왑 파티션이있을 수 있습니다. fuser또는로 표시되지 않습니다 lsof. 다음과의 교환을 해제하십시오.

sudo swapoff -a

다음을 사용하여 스왑 파티션 또는 스왑 파일의 요약을 미리 확인하고 표시 할 수 있습니다.

swapon -s

또는:

cat /proc/swaps

명령을 사용하는 대신 sudo swapoff -a서비스 또는 시스템 장치 를 중지하여 스왑을 비활성화 할 수도 있습니다 . 예를 들면 다음과 같습니다.

sudo systemctl stop dphys-swapfile

또는:

sudo systemctl stop var-swap.swap

필자의 경우, 쓰기를 위해 열린 파일로 서비스 및 프로세스를 중지하는 것 외에도 스왑을 해제해야하므로 fsck재부팅하지 않고 루트 파티션 에서 실행하기 위해 루트 파티션을 읽기 전용으로 다시 마운트 할 수있었습니다 . 이것은 Raspbian Jessie를 실행하는 Raspberry Pi에서 필요했습니다.


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 을 할 시간이 없습니다 :-)

    내가 할 수있는 유일한 것은 System Request입니다.이 두 가지 방법을 알고 있습니다 : ( Documentation/sysrq.txt커널 문서의 파일 참조 ) :

    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이 성공적으로 완료된 경우, 실행할 수 있도록 라이브 USB 를 부팅했습니다 resize2fs...이 기능 은 아직 구현되지 않았습니다 ...
F. Hauri

나는 fsck모른다 -f; 참조되지 않은 블록은 없습니까?
ᴠɪɴᴄᴇɴᴛ

1
@ ᴠɪɴᴄᴇɴᴛ : I'ts ext2fsck스위치 : -f 힘이 파일 시스템에 이상이 없다하더라도 점검.
F. Hauri

1

터미널에 붙여 넣기 할 수있는 빠른 수정 프로그램을 찾고있는 사람이라면 ...

아래 명령을 수행하기 전에 다음과 같은 다른 단계를 완료했는지 확인하십시오 telinit 1.

이것을 발견 :

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

명령으로 세션이 종료 될 수 있지만 돌아온 후에는 파티션을 다시 마운트 할 준비가되었습니다.


1

추가 및 비 시스템 볼륨으로 vdi 파일을 다른 VirtualBox에 연결하십시오. 거기서 필요에 따라 (재) 장착하여 제로 프리를 수행 할 수 있습니다.

VM1 (Virtual Machine 1) 의 VDI 디스크를 압축한다고 가정하겠습니다 . 그런 다음 두 번째 VM2 가 필요합니다 . 그건, :

  • VM1과 VM2가 실행되고 있지 않은지 확인하십시오.
  • VirtualBox Manager에서 :

    • VM2를 선택하고
    • "설정"-> "스토리지"-> "하드 디스크 추가": "추가 디스크로 선택",

    • 압축하려는 VM1의 vdi 파일을 선택하십시오. 힌트 : VM2에 추가 한 하드 디스크가 VM2의 원래 디스크보다 부팅 순서에서 두 번째로 진행되는지 확인하십시오.

    • VM2 시작 : 이제 VM2에서 사용중인 프로세스가 없으므로 VM1의 볼륨을 VM2의 추가 디스크로 다시 마운트 할 수 있습니다. 힌트 : 먼저 Linux의 Folebrowser로 볼륨을 열고 볼륨을 자동으로 마운트합니다. 그런 다음을 사용 하여 명령에있는 mount -l것을 확인하십시오 . 필자의 경우 이것은 / dev / sdb1 입니다. 따라서 명령은 (1) 그리고 (2) 였습니다._Device_sudo mount -o remount,ro _Device_sudo mount -o ro,remount /dev/sdb1sudo zerofree /dev/sdb1

VM2 대신 및 .iso 이미지 와 같은 설치 디스크로 부팅하고 설치 디스크를 사용할 수 있어야 하지만 동일한 시도는하지 못했습니다.


0

mountVM 에서 명령 을 실행하려고한다고 가정합니다 . 어쨌든 포럼 게시물 작성자와 다른 루트 파티션이있을 것입니다.

시험:

mount -o ro,remount /

fs 또는 mount 옵션에 의존하지 않습니다. 이것이 작동하지 않으면 grep " / " /proc/mounts또는로 루트 fs를 판별 할 수도 있습니다 cat /proc/cmdline. 루트 파일 시스템이 / dev / mapper / system-rootfs와 같은 경우 다음을 사용할 수 있습니다.

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

0

이 문제가 발생하여 컴퓨터를 읽기 전용 모드로 설정하지 못했습니다. 문제를 해결하는 것이 인정하는 것보다 id보다 오래 걸렸습니다 ... 내 문제는 Apache-Zeppelin을 실행하고 잊어 버린 것입니다. 다른 호스팅 유형 서비스와 동일한 작업을 수행하지 않아야합니다. 문제를 해결하기 위해 문제를 fuser -kill /일으킬 수있는 모든 프로세스를 종료하고 ro 모드로 돌아갈 수있었습니다.


0

나를위한 해결책은 OS를 재부팅하고 GRUB의 부팅 메뉴에서 "복구 모드"를 선택하는 것이 었습니다. "복구 모드"에서 실행중인 프로세스가 더 적으며 읽기 전용 마운트를 다시 마운트하는 것이 좋습니다.

시스템에 스왑 파티션이 아닌 루트 파일 시스템에 스왑 파일이있는 경우을 사용하여 스왑 파일을 임시로 꺼야합니다 swapoff -a.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.