unix - vô tình chuyển mọi thứ dưới gốc sang / cũ - Solaris 10


13

Như tiêu đề cho biết mọi thứ hoặc hầu hết mọi thứ quan trọng như root dưới root (/) đã được chuyển sang / cũ trên máy Solaris 10. Vì vậy, bây giờ là lỗi điển hình khi cố khi chạy lệnh là Cannot find /usr/lib/ld.so.1(thay đổi $PATHvà cũng đã cố gắng thay đổi $LD_LIBRARY_PATH, $LD_LIBRARY_PATH_64$LD_RUN_PATHvà xuất khẩu chúng, nhưng không có gì về điều đó dường như thay đổi đường dẫn thư viện thực). Đã thử khá nhiều ngày hôm qua để tìm thứ gì đó có thể giúp ích nhưng không tìm thấy thứ gì thực sự sẽ thay đổi đường dẫn thư viện cho Solaris 10 ngoài việc có thể crlenhưng không thể chạy nó kể từ đó Cannot find /usr/lib/ld.so.1.

Tìm thấy rất nhiều mẹo khôi phục root hoặc / usr / bin, v.v. đối với Linux, nhưng thông tin liên quan đến Solaris 10 / Unix không đầy đủ và rất thưa thớt.

Không thể chạy cp, ln, mkdirhoặc mvtừ Cannot find /usr/lib/ld.so.1. Không thể đăng nhập với các phiên khác vào máy. Mặc dù một phiên vẫn còn có thể được sử dụng và cửa sổ đó đang bị đình trệ while true; do date; echo hej 1234567; done. Chúng tôi đã thảo luận về giải pháp sử dụng CD khởi động Solaris và cả Linux trên ổ USB. Chúng tôi đã thảo luận về giải pháp để chuyển đổi ổ đĩa cứng sang giá đỡ khác.

Các /.../static/.../mvgiải pháp đã được thử nghiệm nhưng nó đã không làm việc.

Các lệnh mà vẫn có thể được sử dụng là (có thể có nhiều lệnh mà có thể được sử dụng): echo, <, >, >>, |, pwd, cd.

Có cách nào để tạo một thư mục hoặc thư mục mà không có mkdir? Có cách nào để sử dụng echo>hoặc echo>>để khôi phục /usr/lib/ld.so.1? Tôi biết rằng nhiều hơn /usr/lib/ld.so.1có lẽ sẽ cần phải được khôi phục để các lệnh hoạt động.

Cảm ơn bạn rất nhiều vì đã đọc và có một ngày rất tốt đẹp =)


2
Lệnh nào đã được sử dụng để di chuyển công cụ dưới / cũ?
schaiba

Tiêu chuẩn Solaris mv. Hay chính xác hơn : shopt -s extglob; mv !(old) /old.
propatience

1
Cái gì đang chạy vào lúc này? một số đạn pháo có lệnh inbuild
Ferrybig

Bạn có thể sửa nó với ln, nếu nó hoạt động.
David Schwartz

2
"Giải pháp /.../static/.../mv đã được thử nghiệm nhưng nó không hoạt động." Chuyện gì đã xảy ra? Có phải nó đã cho một lỗi loader? Chính xác thì "không hoạt động" là gì? Các tệp nhị phân trong staticđó có chính xác cho loại vấn đề này, nếu bạn không muốn khởi động phương tiện tạm thời.
Ti Strga

Câu trả lời:


19

Nếu bạn không còn shell chạy dưới quyền root, bạn sẽ phải khởi động lại vào phương tiện cứu hộ. Bất cứ điều gì sẽ làm miễn là nó có khả năng gắn hệ thống tập tin gốc đọc-ghi.

Nếu bạn vẫn có thể chạy các lệnh với quyền root, mọi thứ đều là copacetic. Đặt biến môi trường LD_LIBRARY_PATHđể trỏ đến các thư mục chứa các thư viện được sử dụng bởi các công cụ hệ thống cơ bản. Đó là ít nhất /usr/libtrên Solaris 32 bit, /usr/lib/64trên Solaris 64 bit, có thể là các thư mục khác (hiện tại tôi không có quyền truy cập vào Solaris 10 để kiểm tra). Để chạy một tệp thực thi, tiền tố nó với trình liên kết thời gian chạy : /usr/lib/ld.so.1(đối với tệp thực thi 32 bit) hoặc /usr/lib/64/ld.so.1(đối với tệp thực thi 64 bit) - hiện đã được chuyển sang /old. Do đó, bạn sẽ có thể phục hồi với một cái gì đó như:

LD_LIBRARY_PATH=/old/usr/lib
export LD_LIBRARY_PATH
/old/usr/lib/ld.so.1 /old/usr/bin/mv /old/* /

Sử dụng thông minh của bộ nạp. Nếu toàn bộ hệ thống phân cấp không được chuyển đến /old, bình luận của tôi cho bình luận riêng của Peschke cũng có giá trị ở đây. mvkhông nên được sử dụng nhưng một lệnh duy trì hệ thống phân cấp hiện như pax, tarvà thích.
jlliagre

1
Cảm ơn bạn rất nhiều vì sự kiên nhẫn của bạn và dành thời gian để viết này. Bây giờ công trình chạy lệnh như /old/usr/lib/ld.so.1 /old/usr/bin/mv/old/usr/lib/ld.so.1 /old/usr/bin/cpvân vân. Tôi sẽ xem những gì tôi có thể làm, bây giờ vấn đề là tôi hết dung lượng nhưng tôi có thể khắc phục điều đó.
propatience

@propatience Thật tệ khi bạn và Gilles không xem xét ý kiến ​​của tôi ...
jlliagre

1
Yay THIÊN CHÚA! Tôi đã xoay sở để quay trở lại mọi thứ với lần đầu tiên /old/usr/lib/ld.so.1 /old/usr/bin/mv/old/usr/lib/ld.so.1 /old/usr/bin/cpnhưng không có không gian nên không thể sử dụng /old/usr/lib/ld.so.1 /old/usr/bin/cp. Và sau đó chỉnh sửa $PATHvà sau đó thư mục theo thư mục sử dụng mvvới thay đổi $PATH. Bây giờ tất cả đã được di chuyển trở lại để tôi có thể đăng nhập lại và nhập df -h và mọi thứ. Cảm ơn bạn rất nhiều tất cả mọi người. Thực sự, rất cảm ơn bạn @Gilles! Cảm ơn bạn StackExchange!
propatience

1
Cài đặt LD_LIBRARY_PATHtrên Solaris có một số nguy hiểm nếu bạn cần đặt nó để bạn có thể chạy cả hai tệp thực thi 32 và 64 bit. Sẽ tốt hơn nếu sử dụng các phiên bản cụ thể 32 và 64 bit LD_LIBRARY_PATHcó sẵn trong Solaris. Trong trường hợp này: LD_LIBRARY_PATH_32=/old/usr/libLD_LIBRARY_PATH_64=/old/usr/lib/64. Xem ld.so.1trang man : "Mỗi biến môi trường có thể được chỉ định bằng hậu tố _32 hoặc _64. Điều này làm cho biến môi trường cụ thể, tương ứng, với các quy trình 32 bit bit hoặc 64 bit bit."
Andrew Henle

16

Không có cách nào để tạo một thư mục hoặc sao chép các tệp nhị phân chỉ bằng các lệnh dựng sẵn shell (mặc dù Gilles mô tả một cách giải quyết tiềm năng thông minh trong câu trả lời của anh ta ).

Tùy chọn tốt nhất của bạn là khởi động Solaris trên phương tiện bên ngoài (dvd, usb), gắn kết hoặc nhập (các) hệ thống tệp và sửa lỗi lộn xộn bằng một cái gì đó như:

  • Khởi động đĩa cài đặt Solaris và chọn để chạy shell.

  • Gắn gốc cũ (và tất cả các hệ thống tệp khác nếu có) trong một số thư mục như /mnthoặc /a. Đĩa khởi động Solaris có thể giúp bạn làm điều đó khi phát hiện các hệ thống tệp hiện có.

  • đặt các tệp trở lại vị trí ban đầu của chúng bằng lệnh này (giả sử tất cả được gắn kết bên dưới /mnt):

    cd /mnt/old
    find . -depth | cpio -pdlmPV@ /mnt
    
  • Khởi động lại hệ thống của bạn

    init 6
    

Nếu bạn đang sử dụng ZFS và một ảnh chụp nhanh gần đây tồn tại, sao lưu /oldthư mục ở nơi khác sau đó quay lại ảnh chụp nhanh cuối cùng cũng có thể là một tùy chọn.


Câu trả lời chính xác. Khởi động vào USB cứu hộ, gắn hệ thống tập tin và sau đó làm một cái gì đó nhưmv /mountpoint/old/* /mountpoint
Peschke

1
@Peschke Cảm ơn, mặc dù chạy một cách mù quáng mvlệnh gợi ý của bạn sẽ không phải là lời khuyên của tôi. OP đã viết "mọi thứ hoặc gần như tất cả mọi thứ ". Trong trường hợp thứ hai, di chuyển sẽ phá vỡ các thư mục hiện có. Tôi có thể sử dụng một tiện ích như tar, paxhoặc cpiođể bảo vệ hệ thống phân cấp thư mục đích.
jlliagre

Cảm ơn bạn rất nhiều vì đã trả lời nhanh và cảm ơn bạn rất nhiều vì câu trả lời của bạn. Tôi có thể thử cái này vào ngày mai.
propatience

Bị ràng buộc với ảnh chụp nhanh có thể (ZFS hoặc UFS), bạn có thể khởi động BE thay thế nếu bạn đang sử dụng nâng cấp trực tiếp. lustatus Và đừng hoảng sợ. Tất cả dữ liệu vẫn tồn tại trên (các) đĩa.
sleepyweasel

0

Solaris bao gồm tĩnh xây dựng các tiện ích cơ bản ( cp, ln, mv, rcp, và tar) trong /usr/sbin/staticđó bạn có thể sử dụng để sửa chữa bất kỳ vấn đề với sự sẵn có của /usr/lib/ld.so.1mà ngăn chặn việc sử dụng các động liên kết thường xuyên /usr/bincác phiên bản.

Không có tĩnh mkdirđược cung cấp, nhưng bạn có thể sử dụng tĩnh lnđể liên kết bất kỳ thư mục nào chứa lib/ld.so.1vào vị trí /usrtạm thời, sau đó sử dụng tiêu chuẩn mkdirđể tạo bất kỳ thư mục nào bạn cần. Bạn có thể đổi tên các thư mục đã tồn tại bằng cách sử dụng tĩnh mv.


Điều này ít nhất là trở lại như Solaris 2.5.1, nơi tôi thấy rằng các phân ld.so.1tách cổ phiếu nếu bạn cố chạy nó theo cách thủ công như trong ví dụ của Gilles
rakslice 18/07/18
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.