unix - secara tidak sengaja memindahkan semuanya di bawah root ke / old - Solaris 10

13

Seperti informasi utama mengatakan semuanya atau hampir semuanya penting sebagai root di bawah root (/) dipindahkan ke / lama pada mesin Solaris 10. Jadi sekarang kesalahan umum ketika mencoba ketika menjalankan perintah adalah Cannot find /usr/lib/ld.so.1(diubah $PATHdan juga mencoba mengubah $LD_LIBRARY_PATH, $LD_LIBRARY_PATH_64dan $LD_RUN_PATHdan mengekspornya tetapi tidak ada yang tampaknya mengubah jalur perpustakaan nyata). Sudah hampir mencoba kemarin untuk menemukan sesuatu yang mungkin membantu tetapi tidak menemukan apa pun yang benar-benar akan mengubah jalur perpustakaan untuk Solaris 10 selain mungkin crletetapi tidak dapat menjalankannya sejak itu Cannot find /usr/lib/ld.so.1.

Menemukan banyak tips pemulihan root atau / usr / bin dan sebagainya untuk Linux tetapi informasi untuk itu mengenai Solaris 10 / Unix tidak tersebar luas dan sangat jarang.

Tidak dapat menjalankan cp, ln, mkdiratau mvsejak Cannot find /usr/lib/ld.so.1. Tidak dapat masuk dengan sesi lain ke mesin. Meskipun satu sesi masih di atas yang dapat digunakan dan jendela itu macet while true; do date; echo hej 1234567; done. Kami telah membahas solusi untuk menggunakan CD boot Solaris dan juga dist Linux pada drive USB. Kami telah membahas solusi untuk mengalihkan hard drive ke rak lain.

The /.../static/.../mvsolusi telah diuji tapi tidak berhasil.

Perintah yang masih dapat digunakan adalah (mungkin ada lebih perintah yang dapat digunakan): echo, <, >, >>, |, pwd, cd.

Apakah ada cara untuk membuat direktori atau folder tanpa mkdir? Apakah ada cara untuk menggunakan echodan >atau echodan >>untuk mengembalikan /usr/lib/ld.so.1? Saya tahu bahwa lebih dari /usr/lib/ld.so.1mungkin perlu dipulihkan agar perintah berfungsi.

Terima kasih banyak untuk membaca dan bersenang-senang =)

keramahan
sumber
2
Perintah apa yang digunakan untuk memindahkan barang di bawah / lama?
schaiba
Standar Solaris mv. Atau lebih tepatnya: shopt -s extglob; mv !(old) /old.
keramahan
1
Shell apa yang sedang berjalan saat ini? beberapa kerang memiliki perintah
bawaan
Anda bisa memperbaikinya dengan ln, jika itu berhasil.
David Schwartz
2
"Solusi /.../static/.../mv telah diuji tetapi tidak berhasil." Apa yang terjadi? Apakah itu memberikan kesalahan pemuat? Apa sebenarnya yang "tidak berhasil"? Binari di staticsana tepat untuk kategori masalah ini, jika Anda tidak ingin mem-boot media sementara.
Ti Strga

Jawaban:

19

Jika Anda tidak lagi memiliki shell yang berjalan sebagai root, Anda harus reboot ke media penyelamat. Apa pun akan dilakukan asalkan mampu me-mount sistem file root baca-tulis.

Jika Anda masih dapat menjalankan perintah sebagai root, semuanya copacetic. Atur variabel lingkungan LD_LIBRARY_PATHuntuk menunjuk ke direktori yang berisi pustaka yang digunakan oleh alat sistem dasar. Itu setidaknya /usr/libpada Solaris 32-bit, /usr/lib/64pada Solaris 64-bit, mungkin direktori lain (saya tidak memiliki akses ke Solaris 10 sekarang untuk memeriksa). Untuk menjalankan executable, awali dengan runtime linker : /usr/lib/ld.so.1(untuk executable 32-bit) atau /usr/lib/64/ld.so.1(untuk executable 64-bit) - sekarang dipindahkan ke /old. Dengan demikian Anda harus dapat pulih dengan sesuatu seperti:

LD_LIBRARY_PATH=/old/usr/lib
export LD_LIBRARY_PATH
/old/usr/lib/ld.so.1 /old/usr/bin/mv /old/* /
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Penggunaan loader yang cerdas. Jika seluruh hierarki tidak dipindahkan ke /old, komentar saya ke Peschke sendiri komentar juga berlaku di sini. mvtidak boleh digunakan tetapi perintah yang menjaga hierarki yang ada seperti pax, tardan sejenisnya.
jlliagre
1
Terima kasih banyak atas kesabaran Anda dan meluangkan waktu untuk menulis ini. Ini berfungsi sekarang menjalankan perintah like /old/usr/lib/ld.so.1 /old/usr/bin/mvdan /old/usr/lib/ld.so.1 /old/usr/bin/cpdan seterusnya. Saya akan melihat apa yang bisa saya lakukan, sekarang masalahnya adalah saya kehabisan ruang tetapi saya mungkin bisa memperbaikinya.
Kemauan
@propatience Sayang sekali Anda dan Gilles tidak mempertimbangkan komentar saya ...
jlliagre
1
Ya Tuhan! Saya berhasil memindahkan semuanya dengan pertama /old/usr/lib/ld.so.1 /old/usr/bin/mvdan /old/usr/lib/ld.so.1 /old/usr/bin/cptetapi tidak ada ruang sehingga tidak bisa digunakan /old/usr/lib/ld.so.1 /old/usr/bin/cp. Dan kemudian mengedit $PATHdan kemudian menggunakan folder dengan folder mvdiubah $PATH. Sekarang semuanya dipindahkan kembali sehingga saya bisa login lagi dan ketik df -h dan semuanya. Terima kasih banyak semuanya. Sungguh, terima kasih banyak untuk Anda @Gilles! StackExchange terima kasih!
Peresmian
1
Pengaturan LD_LIBRARY_PATHpada Solaris memiliki beberapa bahaya jika Anda perlu mengaturnya sehingga Anda dapat menjalankan executable 32-dan 64-bit. Akan lebih baik menggunakan versi spesifik 32- dan 64-bit LD_LIBRARY_PATHyang tersedia di Solaris. Dalam hal ini: LD_LIBRARY_PATH_32=/old/usr/libdan LD_LIBRARY_PATH_64=/old/usr/lib/64. Lihat ld.so.1halaman manual : "Setiap variabel lingkungan dapat ditentukan dengan akhiran _32 atau _64. Ini membuat variabel lingkungan spesifik, masing-masing, untuk proses 32-bit atau 64-bit."
Andrew Henle
16

Tidak ada cara untuk membuat direktori atau menyalin file biner hanya dengan perintah builtin shell (meskipun Gilles menggambarkan solusi potensial cerdas dalam jawabannya ).

Pilihan terbaik Anda adalah mem-boot Solaris pada media eksternal (dvd, usb stick), pasang atau impor sistem file, dan perbaiki kekacauan dengan sesuatu seperti:

  • Boot disk instalasi Solaris dan pilih untuk menjalankan shell.

  • Pasang root lama (dan semua sistem file lainnya jika ada) di bawah beberapa direktori seperti /mntatau /a. Disk boot Solaris mungkin membantu Anda melakukan itu ketika mendeteksi sistem file yang ada.

  • letakkan file kembali ke lokasi aslinya dengan perintah ini (dengan asumsi semua sudah terpasang di bawah /mnt):

    cd /mnt/old
    find . -depth | cpio -pdlmPV@ /mnt
    
  • Mulai ulang sistem Anda

    init 6
    

Jika Anda menggunakan ZFS dan snapshot terbaru ada, mencadangkan /olddirektori di tempat lain kemudian kembali ke snapshot terakhir mungkin juga merupakan opsi.

Jlliagre
sumber
Jawaban yang bagus Boot ke USB cadangan, pasang sistem file, lalu lakukan sesuatu sepertimv /mountpoint/old/* /mountpoint
Peschke
1
@Peschke Terima kasih, meskipun dengan membabi buta menjalankan mvperintah yang disarankan tidak akan menjadi saran saya. OP menulis "segalanya atau hampir segalanya ". Dalam kasus kedua, pindah akan memecah direktori yang sudah ada. Saya cenderung menggunakan utilitas seperti tar, pax, atau cpiountuk melestarikan hirarki direktori tujuan.
jlliagre
Terima kasih banyak untuk merespons cepat dan terima kasih banyak atas tanggapan Anda. Saya mungkin akan mencoba ini besok.
Kebahagiaan
Terikat pada snapshot yang mungkin (ZFS atau UFS), Anda bisa boot ke BE alternatif jika Anda menggunakan peningkatan langsung. lustatus Dan jangan panik dulu. Semua data masih ada di disk.
sleepyweasel
0

Solaris termasuk statis membangun utilitas dasar ( cp, ln, mv, rcp, dan tar) di /usr/sbin/staticyang dapat Anda gunakan untuk memperbaiki masalah dengan ketersediaan /usr/lib/ld.so.1yang mencegah penggunaan dinamis terkait biasa /usr/binversi.

Tidak ada statis yang mkdirdisediakan, tetapi Anda dapat menggunakan statis lnuntuk menyinkronkan direktori apa pun yang berisi lib/ld.so.1tempatnya /usrsementara, dan kemudian menggunakan standar mkdiruntuk membuat direktori apa pun yang Anda butuhkan. Anda dapat mengganti nama direktori yang sudah ada menggunakan statis mv.

rakslice
sumber
Ini berjalan setidaknya sejauh Solaris 2.5.1, di mana saya menemukan bahwa ld.so.1segfaults saham jika Anda mencoba menjalankannya secara manual seperti yang ditunjukkan dalam contoh Gilles
rakslice