Làm thế nào để phục hồi từ một chmod -R 000 / thùng?


36

Và bây giờ tôi không thể điều chỉnh lại .. hoặc sử dụng bất kỳ chương trình hệ thống nào khác của tôi. May mắn thay, đây là một máy ảo mà tôi đã chơi, nhưng có cách nào để giải quyết vấn đề này không? Hệ thống là Ubuntu Server 12.10.

Tôi đã cố gắng khởi động lại vào chế độ phục hồi, thật không may bây giờ tôi không thể khởi động vào hệ thống do quyền không cấp một số chương trình sau khi sẵn sàng khởi động dưới cùng - hệ thống chỉ bị treo. Đây là những gì tôi thấy:

Begin: Running /scripts/init-bottom ... done
[   37.062059] init: Failed to spawn friendly-recovery pre-start process: unable to execute: Permission denied
[   37.084744]  init: Failed to spawn friendly-recovery post-stop process: unable to execute: Permission denied
[   37.101333] init: plymouth main process (220) killed by ABRT signal

Sau này máy tính bị treo.


Có phải /binbạn đã mã hóa hoặc các tệp trong /binhoặc cả hai?
Stéphane Chazelas

1
thư mục / bin với tùy chọn -R ... cả hai
jett

Thật tốt khi giữ một usb với tinycore tiện dụng. Hữu ích khi một cái gì đó như thế này xảy ra.
saga

Câu trả lời:


28

Khởi động một hệ điều hành sạch khác, gắn hệ thống tệp và sửa quyền.

Vì hệ thống tệp bị hỏng của bạn nằm trong VM, bạn nên có sẵn hệ thống máy chủ của mình. Gắn hệ thống tập tin bị hỏng của bạn ở đó và sửa chữa nó.

Trong trường hợp QEMU / KVM, ví dụ bạn có thể gắn hệ thống tệp bằng nbd .


Tôi nghĩ rằng điều này có thể đúng như một cách để sửa nó, tuy nhiên, tôi cần cố gắng để hệ thống được gắn kết - ngay bây giờ tôi chỉ nhận được hệ thống trước từ tệp hình ảnh - như trong initrd.img memtest & abi.
Jett

1
@jett, bạn đã gắn /bootphân vùng của VM đó. Hãy thử và định vị hệ thống tập tin gốc. Nếu trên LVM, hãy chạy vgchange -aysau khi kết nối nbdđể kích hoạt nó.
Stéphane Chazelas

1
@StephaneChazelas Tôi đã có nó. Cảm ơn cả hai rất nhiều- Tôi yêu những loại sai lầm này, đã học được một tấn!
Jett

Vui mừng vì nó đã được sửa. Tôi đang thiếu một cái gì đó. Nếu đó là một vm, thì đó chỉ là một tệp lớn cho hệ thống máy chủ, phải không? Làm thế nào để bạn gắn bất cứ thứ gì bên trong nó để sửa chữa? (Tôi hiểu cách thực hiện việc này trên hệ thống không phải là vm.)
Joe

68

Ngay cả khi root, bạn không thể thực thi các tệp không có xbit quyền. Những gì bạn có thể làm mặc dù là gọi ld.sonó (miễn là chúng thực thi được liên kết động):

$ echo /lib/*/ld*.so
/lib/i386-linux-gnu/ld-2.27.so /lib/x86_64-linux-gnu/ld-2.27.so

Sử dụng một trong những phù hợp với kiến ​​trúc của chmodthực thi. Trong trường hợp của tôi, x86_64một:

sudo /lib/x86_64-linux-gnu/ld-2.27.so /bin/chmod 755 /bin /bin/chmod

Hoặc gọi một cái gì đó trong /usr/binhoặc ở nơi khác để làm chmodnhư thế perl:

sudo perl -e 'chmod 0755, "/bin", "/bin/chmod"

Cẩn thận khi khôi phục các quyền mà một số tệp /binthích mounthoặc sucó nghĩa là có các quyền khác ngoài 0755.

Tuy nhiên, nếu bạn đã khởi động lại, bạn có thể không đến được điểm mà bạn có thể chạy perlhoặc ld.somặc dù. Bạn có thể sửa mọi thứ từ initramfsmặc dù (vượt qua thư mục gốc không chính xác để lấy shell khôi phục trong initramfs; xem thêm tham số break=bottomhoặc break=initkernel trên Debian, để initramfs cung cấp cho bạn trình bao sau khi hệ thống tệp gốc được gắn kết (chỉ đọc Tuy nhiên)). Hoặc khởi động VM của bạn từ hình ảnh CD trực tiếp hoặc khắc phục bằng cách gắn hệ thống tệp VM trên máy chủ như những người khác đề xuất.

Sửa cách khởi tạo initramfs:

Trong grub, chỉnh sửa mục khởi động và xóa root=tham số khỏi linuxlệnh:

setparams 'Ubuntu, with Linux 3.2.0-27-generic'                          

recordfail                                                               
gfxmode $linux_gfx_mode                                                  
insmod gzio                                                              
insmod ext2                                                              
set root='(hd1)'                                                         
search --no-floppy --fs-uuid --set=root dc02b07c-88ef-4804-afe0-4f02db2\ 
94561                                                                    
linux /boot/vmlinuz-3.2.0-27-generic                                     
initrd /boot/initrd.img-3.2.0-27-generic                                 

Ctrl-Xđể khởi động. Các initramfs của Ubuntu sẽ không tìm thấy hệ thống tập tin gốc để bắt đầu phục hồi sh. Sau đó gắn hệ thống tập tin gốc (trong trường hợp của tôi /dev/vdb, thích ứng với máy của bạn) và sửa những thứ ở đó:

Target filesystem doesn't have requested /sbin/init.
No init found. Try passing init= bootarg.


BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs) mkdir /x
(initramfs) mount /dev/vdb /x
[   48.430071] EXT3-fs (vdb): error: couldn't mount because of unsupported optio
nal features (240)
[   48.477406] EXT4-fs (vdb): recovery complete
[   48.477747] EXT4-fs (vdb): mounted filesystem with ordered data mode. Opts: (
null)
(initramfs) chmod -R 755 /x/bin
(initramfs) umount /x
(initramfs) reboot

Sau khi khởi động, sửa các quyền của các tệp không có 755 quyền bằng cách so sánh với hệ thống khác.

Sửa bằng cách chạy pythonnhư init:

Trong grub, chỉnh sửa các mục khởi động, lần này giữ root=tham số, thay đổi rođến rwvà thêm một init=/usr/bin/python:

setparams 'Ubuntu, with Linux 3.2.0-27-generic'                          

recordfail                                                               
gfxmode $linux_gfx_mode                                                  
insmod gzio                                                              
insmod ext2                                                              
set root='(hd1)'                                                         
search --no-floppy --fs-uuid --set=root dc02b07c-88ef-4804-afe0-4f02db2\ 
94561                                                                    
linux /boot/vmlinuz-3.2.0-27-generic root=UUID=dc02b07c-88ef-4804-afe0-\
4f02db294561 rw init=/usr/bin/python
initrd /boot/initrd.img-3.2.0-27-generic                                 

Sau đó, tại dấu nhắc python:

Begin: Running /scripts/init-bottom ... done.
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.chmod('/bin/sh',0755)
>>> os.chmod('/bin/chmod',0755)
>>> os.execl('/bin/sh','sh')
sh: 0: can't access tty; job control turned off
# chmod -R 0755 /bin
# mount -o remount,ro /
[  100.704720] EXT4-fs (vdb): re-mounted. Opts: errors=remount-ro
# exec /sbin/init

Một lần nữa, một khi đã khởi động, hãy sửa các quyền của các tệp không có 755 quyền bằng cách so sánh với hệ thống khác.


5
+1, một câu trả lời tuyệt vời khác, Stephane. Tôi muốn thêm: trong already try to reboottrường hợp: khởi động trên đĩa CD trực tiếp, gắn kết phân vùng chứa / bin và chmod 755 /bin(và các tệp bên trong nếu chúng cũng bị thay đổi). Nhưng sau đó, hãy kiểm tra xem tất cả các tệp có đúng quyền hay không (tùy thuộc vào bản phân phối linux của bạn, bạn có thể có thể kiểm tra / bin so với gói ban đầu)
Olivier Dulac

4
Ôi. Độ sâu kiến ​​thức của bạn thật đáng sợ 8-).
slm

Tôi không thể sử dụng ld.so để thực thi. pb.abhijeetr.com/fRWf Điều gì đang xảy ra ở đây?
Abhijeet Rastogi

@shadyabhi, bạn có thể có một hệ thống multiarch và đang cố gắng sử dụng ld.so 32 bit trên một tệp thực thi 64 bit. Bạn phải có cái khác ld.so, có thể trong một số thư mục như /lib/x86_64-linux-gnu.
Stéphane Chazelas

1
@Kwpolska, os.execlexecđể thực thi, họ không rẽ nhánh một quy trình, chỉ thay thế thực thi trong cùng một quy trình , vì vậy tất cả được thực hiện trong pid 1. Quá trình 1 ban đầu chạy python, sau đó sh, sau đó init.
Stéphane Chazelas

8

Sử dụng trăn :)

$ python
>>> import os
>>> os.chmod('/bin', 0755)

Điều đó không cần bất cứ điều gì /binđể làm công việc của nó. Rõ ràng, tôi đã không thử điều này ...


Hmm, tôi luôn luôn nghĩ rằng điều này và các ngôn ngữ kịch bản khác sẽ chỉ gọi chương trình chmod. Khá tốt để biết!
Jett

1
Không, chmodlà một cuộc gọi hệ thống, được gọi bởi chmodchương trình và cũng bởi chmodchức năng trong python / perl / ruby, v.v ... shell thực sự gọi chmodtiện ích.
Dennis Kaarsemaker

2
Ngoại trừ những cái vỏ đã chmoddựng sẵn. Đó là loại tình huống mà vỏ như sashhữu ích. Nó được liên kết tĩnh và có hầu hết các lệnh khôi phục như chmoddựng sẵn (vì vậy không dựa vào bất cứ thứ gì khác). Nó thường sẽ ngồi trong /sbinmặc dù nó sẽ không gây hại khi có thêm các bản sao trên tất cả các hệ thống tệp và có thể được sử dụng kết hợp với memlockd. zshksh93có một nội dung chmod (mặc dù không được bật theo mặc định).
Stéphane Chazelas

1
@Dennis Nhưng làm thế nào bạn có thể chạy nó nếu bạn không thể khởi động vào hệ thống? Như OP nói: «thật không may bây giờ tôi không thể khởi động vào hệ thống cả».
Nadir Sampaoli

@NadirSampaoli Đây chắc chắn là một trong những điều mà bạn cần nắm bắt trước khi khởi động lại. Điều này có thể được thực hiện thành công sau khi chỉnh sửa root và trước khi tắt hệ thống.
Ken Bellows

0

Bạn có thể thử sudo chmod -R 744 /path-to-your-system/bintừ một bản phân phối trực tiếp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.