Có thể không?
Chà, hầu hết các tiện ích tầm thường và quan trọng đều được cài đặt /bin
, và bây giờ bạn mất quyền truy cập vào tất cả chúng. Thực tế, nếu bạn khởi động lại, hệ thống của bạn sẽ không thể khởi động được nữa.
Dù sao, chúng tôi sẽ khắc phục sự cố và làm cho /bin
nội dung của nó càng gần càng tốt với vị trí của nó. Sự khác biệt duy nhất sẽ là một số liên kết tượng trưng mà chúng tôi cũng sẽ sửa chữa.
Làm sao?
Đầu tiên, chúng ta nên chroot
vào hệ thống bị hỏng của bạn, nhưng với một sự khác biệt nhỏ ! Sau đó, chúng tôi sẽ nhận được một danh sách các gói đã cài đặt trên hệ thống của bạn có bất kỳ tệp nào được cài đặt trong /bin
thư mục, sau đó chúng tôi sẽ chỉ tải xuống các gói cần thiết và trích xuất các tệp cần thiết vào /bin
. Sau đó, chúng tôi sẽ được thực hiện.
Ví dụ: sau đó chroot
, chúng ta có thể nhận được danh sách các gói đã cài đặt tệp /bin
bằng cách sử dụng:
dpkg --search /bin | cut -f1 -d: | tr ',' '\n'
Và chúng ta cũng có thể sử dụng:
dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/
để liệt kê các tập tin được cài đặt bởi các gói này trong /bin
.
Sau đó, chúng tôi chỉ cần tạo một danh sách tất cả các gói cần thiết cho chúng tôi, sau đó tải xuống và trích xuất chúng /bin
với một cái gì đó như:
xargs apt download < list-packages
dpkg-deb -x PACKAGE .
mv ./bin/* /bin
Tuy nhiên, chúng tôi phải sử dụng tập lệnh để kiểm tra tất cả các gói đã cài đặt trên hệ thống của mình, vì thực hiện thủ công chỉ là sự điên rồ.
Vì vậy, tôi đã viết một kịch bản làm mọi thứ chúng ta cần. Nó tìm thấy tất cả các gói cần thiết để chúng tôi khôi phục /bin
, hiển thị cho chúng tôi tên của từng gói và các tệp liên quan của chúng /bin
. Đây là một ảnh chụp màn hình:
Cuối cùng, chúng tôi chọn cài đặt lại tất cả các gói hoặc chỉ tải xuống và giải nén các tệp cần thiết vào /bin
(đó là tùy chọn được đề xuất):
Bạn có thể lấy một bản sao của tập lệnh này hoặc tải xuống trực tiếp .
Hãy bắt đầu
chroot
Khởi động hệ thống của bạn với một đĩa trực tiếp có kiến trúc giống như Ubuntu đã cài đặt của bạn, mở một thiết bị đầu cuối và nhận quyền truy cập root:
sudo -i
Gắn root
hệ thống tệp của bạn (đối với tôi là /dev/sda1
):
mount /dev/sda1 /mnt
Chúng tôi sẽ cần kết nối với Internet, vì vậy hãy sao chép resolv.conf
từ Ubuntu trực tiếp vào phân vùng gốc được gắn kết của bạn:
cp /etc/resolv.conf /mnt/etc/resolv.conf
Bây giờ sao chép tập lệnh vào một nơi nào đó trên phân vùng được gắn kết, ví dụ:
cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh
hoặc bạn có thể tải xuống bằng cách sử dụng wget
, v.v. như:
wget https://git.io/v9fRm -O /mnt/restore-bin.sh
Gắn các đường dẫn cần thiết khác:
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc /proc /mnt/proc
Và đây là một sự khác biệt nhỏ : làm thế nào chúng ta có thể chroot
đến một hệ thống bị hỏng khi không có /bin
thư mục trong đó? Chúng ta nên chạy vỏ nào?
Vì vậy, tạo một thư mục bin tạm thời. ví dụ: được đặt tên bintmp
trong hệ thống gốc bị hỏng của bạn:
mkdir /mnt/bintmp
Sau đó ràng buộc cuộc sống /bin
vào đó:
mount --bind /bin /mnt/bintmp
Chroot vào hệ thống trong khi đặt /bintmp/bash
vỏ đăng nhập của bạn:
chroot /mnt /bintmp/bash
Xuất biến /bintmp
như PATH
môi trường của bạn :
export PATH=/bintmp:$PATH
Cung cấp cho tập lệnh bit thực thi:
chmod +x restore-bin.sh
Chạy kịch bản:
./restore-bin.sh
Đợi cho việc tìm kiếm được hoàn thành sau đó trả lời câu hỏi chúng ta đã thấy trong ảnh chụp màn hình. Nó sẽ bắt đầu khôi phục /bin
và chúng ta gần như đã hoàn thành.
Sau khi hoàn thành, sử dụng CTRL+ Dđể thoát khỏi chroot
môi trường và ngắt kết nối các đường dẫn được gắn kết:
umount -R /mnt
Khởi động lại hệ thống.
Khôi phục các liên kết trong /bin
Bây giờ hầu như tất cả các tệp trong /bin
thư mục đã trở lại, ngoại trừ khoảng 5 liên kết tượng trưng được quản lý bởi update-alternatives
.
Trong hệ thống đang chạy của bạn, hãy chạy:
sudo update-alternatives --all
Nó hỏi bạn một số câu hỏi; bạn chỉ cần nhấn ENTERđể chấp nhận tất cả.
Và bây giờ chúng ta đã hoàn thành.
/bin
trên Ubuntu chỉ là một liên kết tượng trưng cho/usr/bin
những ngày này sao? Vì vậy, tất cả những gì bạn cần làm là đặt symlink trở lại?