unix - ย้ายทุกสิ่งโดยไม่ตั้งใจไปที่ root / old - Solaris 10


13

ตามที่พาดหัวบอกว่าทุกอย่างหรือเกือบทุกอย่างสำคัญเมื่อรูทภายใต้รูท (/) ถูกย้ายไปที่ / เก่าบนเครื่อง Solaris 10 ดังนั้นตอนนี้ความผิดปกติเมื่อพยายามที่เมื่อใช้คำสั่งCannot find /usr/lib/ld.so.1(เปลี่ยน$PATHและยังพยายามเปลี่ยน$LD_LIBRARY_PATH, $LD_LIBRARY_PATH_64และ$LD_RUN_PATHและการส่งออกพวกเขา แต่ไม่มีอะไรที่ดูเหมือนว่าจะเปลี่ยนเส้นทางห้องสมุดจริง) พยายามที่เมื่อวานนี้สวยมากที่จะหาบางสิ่งบางอย่างที่อาจช่วย แต่ไม่พบอะไรที่จริงจะเปลี่ยนเส้นทางห้องสมุดสำหรับ Solaris 10 อื่น ๆ กว่าบางทีแต่ไม่สามารถเรียกว่าตั้งแต่crleCannot find /usr/lib/ld.so.1

พบเคล็ดลับการกู้คืนรูทหรือ / usr / bin จำนวนมากและอื่น ๆ สำหรับ Linux แต่ข้อมูลที่เกี่ยวข้องกับ Solaris 10 / Unix นั้นไม่สมบูรณ์และกระจัดกระจายมาก

ไม่สามารถเรียกใช้cp, ln, mkdirหรือตั้งแต่mv Cannot find /usr/lib/ld.so.1ไม่สามารถเข้าสู่ระบบด้วยเซสชันอื่นไปยังเครื่อง แม้ว่าจะมีหนึ่งเซสชันที่ยังสามารถใช้งานได้และหน้าต่างนั้นก็หยุดwhile true; do date; echo hej 1234567; doneทำงาน เราได้พูดถึงวิธีแก้ปัญหาในการใช้แผ่นซีดีบูต Solaris และ Linux ดิสต์บนไดรฟ์ USB เราได้พูดถึงวิธีแก้ปัญหาเพื่อเปลี่ยนฮาร์ดไดรฟ์ดิสก์เป็นชั้นวางอื่น

/.../static/.../mvแก้ปัญหาได้รับการทดสอบ แต่มันก็ไม่ได้ทำงาน

คำสั่งที่ยังสามารถนำมาใช้เป็น (อาจจะมีคำสั่งอื่น ๆ ที่สามารถนำมาใช้): echo, <, >, >>, |, ,pwdcd

มีวิธีในการสร้างไดเรกทอรีหรือโฟลเดอร์โดยไม่mkdir? มีวิธีการใช้ใด ๆechoและ>หรือechoและ>>จะเรียกคืน/usr/lib/ld.so.1? ฉันรู้ว่า/usr/lib/ld.so.1อาจจะต้องเรียกคืนมากกว่านี้เพื่อให้คำสั่งทำงานได้

ขอบคุณมากสำหรับการอ่านและขอให้มีความสุขมาก ๆ ในวันนี้ =)


2
คำสั่งใดที่ใช้เพื่อย้ายสิ่งต่างๆภายใต้ / เก่า
schaiba

มาตรฐานโซลาริmvshopt -s extglob; mv !(old) /oldหรืออย่างแม่นยำมากขึ้น:
propatience

1
ตอนนี้เชลล์กำลังทำงานอะไรอยู่? เชลล์บางตัวมีคำสั่ง
inbuild

คุณสามารถแก้ไขได้ด้วยlnถ้ามันทำงาน
David Schwartz

2
"โซลูชัน /.../static/.../mv ได้รับการทดสอบแล้ว แต่ไม่ได้ผล" เกิดอะไรขึ้น? มันทำให้เกิดข้อผิดพลาดในการโหลดหรือไม่? อะไร "ไม่ทำงาน" อย่างแน่นอน? ไบนารีในstaticจะมีปัญหาประเภทนี้อย่างแน่นอนหากคุณไม่ต้องการบูตสื่อชั่วคราว
Ti Strga

คำตอบ:


19

หากคุณไม่มีเชลล์ที่ทำงานเป็นรูทอีกต่อไปคุณจะต้องรีบูทเป็นสื่อกู้ภัย สิ่งใดที่จะทำตราบใดที่มันสามารถติดตั้งระบบไฟล์ root อ่าน - เขียน

หากคุณยังคงสามารถเรียกใช้คำสั่งในฐานะรูท copacetic ของทุกอย่าง ตั้งค่าตัวแปรสภาพแวดล้อมLD_LIBRARY_PATHให้ชี้ไปที่ไดเรกทอรีที่มีไลบรารีที่ใช้โดยเครื่องมือระบบพื้นฐาน อย่างน้อย/usr/libใน Solaris 32 บิต/usr/lib/64บนSolaris 64 บิตอาจเป็นไดเรกทอรีอื่น ๆ (ฉันไม่สามารถเข้าถึง Solaris 10 เพื่อตรวจสอบได้ในตอนนี้) เมื่อต้องการเรียกใช้ปฏิบัติการนำหน้าด้วยตัวเชื่อมโยงรันไทม์ : /usr/lib/ld.so.1(สำหรับปฏิบัติการ 32 บิต) หรือ/usr/lib/64/ld.so.1(สำหรับปฏิบัติการ 64 บิต) - /oldตอนนี้ย้ายไปอยู่ ดังนั้นคุณควรจะสามารถกู้คืนด้วยสิ่งที่ชอบ:

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

การใช้โหลดเดอร์อย่างชาญฉลาด หากลำดับชั้นทั้งหมดไม่ถูกย้ายไปที่/oldความคิดเห็นของฉันต่อความคิดเห็นของ Peschke นั้นก็ใช้ได้เช่นกัน mvไม่ควรใช้ แต่คำสั่งที่รักษาลำดับชั้นที่มีอยู่เช่นpax, tarและชอบ
jlliagre

1
ขอบคุณมากสำหรับความอดทนและสละเวลาในการเขียนสิ่งนี้ มันทำงานตอนนี้ทำงานคำสั่งเช่น/old/usr/lib/ld.so.1 /old/usr/bin/mvและ/old/usr/lib/ld.so.1 /old/usr/bin/cpและอื่น ๆ ฉันจะเห็นสิ่งที่ฉันสามารถทำได้ตอนนี้ปัญหาคือว่าฉันออกจากพื้นที่ แต่ฉันอาจจะสามารถแก้ไขได้
propatience

เลวร้ายเกินไป @propatience คุณและกิลส์ก็ไม่ถือว่าเป็นความคิดเห็นของฉัน ...
jlliagre

1
Yay พระเจ้า! ฉันจัดการเพื่อย้ายทุกอย่างกลับมาพร้อมกับครั้งแรก/old/usr/lib/ld.so.1 /old/usr/bin/mvและแต่ไม่มีช่องว่างเพื่อให้ไม่สามารถใช้งาน/old/usr/lib/ld.so.1 /old/usr/bin/cp /old/usr/lib/ld.so.1 /old/usr/bin/cpและแล้วการแก้ไข$PATHแล้วโฟลเดอร์โดยใช้โฟลเดอร์ที่มีการเปลี่ยนแปลงmv $PATHตอนนี้มันถูกย้ายกลับไปดังนั้นฉันสามารถเข้าสู่ระบบอีกครั้งและพิมพ์ df -h และทุกอย่าง ขอบคุณทุกคนมาก ๆ จริงๆขอบคุณมากสำหรับคุณ @Gilles! ขอบคุณ StackExchange!
propatience

1
การตั้งค่าLD_LIBRARY_PATHบน Solaris มีอันตรายบางอย่างหากคุณต้องการตั้งค่าเพื่อให้คุณสามารถเรียกใช้โปรแกรมปฏิบัติการทั้ง 32- และ 64- บิต จะดีกว่าถ้าใช้รุ่น 32 และ 64 บิตLD_LIBRARY_PATHที่มีอยู่ใน Solaris ในกรณีนี้ และ LD_LIBRARY_PATH_32=/old/usr/lib ดูman page : "แต่ละตัวแปรสภาวะแวดล้อมสามารถระบุด้วยส่วนต่อท้าย _32 หรือ _64 สิ่งนี้ทำให้ตัวแปรสภาพแวดล้อมเป็นแบบเฉพาะตามลำดับจนถึงกระบวนการ 32– บิตหรือ 64- บิต" LD_LIBRARY_PATH_64=/old/usr/lib/64ld.so.1
Andrew Henle

16

ไม่มีวิธีสร้างไดเรกทอรีหรือคัดลอกไฟล์ไบนารีด้วยคำสั่ง shell builtin (แม้ว่า Gilles จะอธิบายวิธีการแก้ปัญหาที่เป็นไปได้อย่างชาญฉลาดในการตอบกลับของเขา )

ตัวเลือกที่ดีที่สุดของคุณคือการบู๊ต Solaris บนสื่อภายนอก (dvd, usb stick), ติดตั้งหรือนำเข้าระบบไฟล์และแก้ไขปัญหาด้วย:

  • บูตดิสก์การติดตั้ง Solaris และเลือกเพื่อเรียกใช้เชลล์

  • ติดรากเก่า (และไฟล์ระบบอื่น ๆ ถ้ามี) ภายใต้ไดเรกทอรีบางอย่างเช่นหรือ/mnt /aดิสก์สำหรับบูต Solaris อาจช่วยให้คุณทำเช่นนั้นเมื่อตรวจพบระบบไฟล์ที่มีอยู่

  • นำไฟล์กลับสู่ตำแหน่งเดิมด้วยคำสั่งนี้ (สมมติว่าทั้งหมดติดตั้งอยู่ใต้/mnt):

    cd /mnt/old
    find . -depth | cpio -pdlmPV@ /mnt
    
  • รีบูตระบบของคุณ

    init 6
    

หากคุณกำลังใช้ ZFS และมีสแน็ปช็อตล่าสุดอยู่ให้สำรองข้อมูล/oldไดเร็กทอรีที่อื่นจากนั้นการเปลี่ยนกลับเป็นสแน็ปช็อตสุดท้ายอาจเป็นตัวเลือกเช่นกัน


คำตอบที่ดี บูตเข้าสู่ USB กู้ภัยติดตั้งระบบไฟล์แล้วทำสิ่งที่ต้องการmv /mountpoint/old/* /mountpoint
Peschke

1
@Peschke ขอบคุณแม้ว่าmvคำสั่งที่แนะนำของคุณจะไม่สามารถอธิบายได้ OP เขียนว่า "ทุกอย่างหรือเกือบทุกอย่าง " ในกรณีที่สองการย้ายจะหยุดไดเรกทอรีที่มีอยู่ ฉันน่าจะใช้ประโยชน์เช่นtar, paxหรือcpioเพื่อรักษาลำดับชั้นไดเรกทอรีปลายทาง
jlliagre

ขอบคุณมากสำหรับการตอบสนองที่รวดเร็วและขอบคุณมากสำหรับคำตอบของคุณ พรุ่งนี้ฉันจะลองดู
propatience

ผูกติดกับสแน็ปช็อตที่เป็นไปได้ (ZFS หรือ UFS) คุณสามารถบูตเป็นทางเลือก BE หากคุณใช้การอัปเกรดสด lustatus และยังไม่ต้องตกใจ ข้อมูลทั้งหมดยังคงมีอยู่บนดิสก์
sleepyweasel

0

Solaris รวมถึงคงสร้างสาธารณูปโภคขั้นพื้นฐาน ( cp, ln, mv, rcpและtar) ใน/usr/sbin/staticที่คุณสามารถใช้เพื่อซ่อมแซมปัญหาใด ๆ กับความพร้อมของ/usr/lib/ld.so.1ป้องกันว่าการใช้ปกติเชื่อมโยงแบบไดนามิก/usr/binรุ่น

ไม่มีการmkdirจัดเตรียมแบบคงที่แต่คุณสามารถใช้แบบคงที่lnเพื่อ symlink ไดเรกทอรีใด ๆ ที่ประกอบด้วยlib/ld.so.1ไว้/usrชั่วคราวแล้วใช้มาตรฐานmkdirเพื่อสร้างไดเรกทอรีใด ๆ ที่คุณต้องการ mvคุณสามารถเปลี่ยนชื่อไดเรกทอรีที่มีอยู่แล้วโดยใช้ไฟฟ้าสถิต


อย่างน้อยก็ย้อนกลับไปถึง Solaris 2.5.1 ซึ่งฉันพบว่าหุ้นld.so.1segfaults ถ้าคุณพยายามเรียกใช้ด้วยตนเองดังแสดงในตัวอย่างของ Gilles
rakslice
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.