หลังจากเปลี่ยนชื่อ / usr โดยไม่ตั้งใจฉันจะเปลี่ยนชื่อกลับมาได้อย่างไร


62

ฉันตั้งใจเปลี่ยนชื่อไดเรกทอรีเข้า/usr/usr_bak

ฉันต้องการที่จะเปลี่ยนกลับดังนั้นฉันผนวกเส้นทาง/usr_bak/binไปเพื่อให้ระบบที่จะหาคำสั่ง$PATHsudo

แต่ตอนนี้sudo mv /usr_bak /usrทำให้ฉันมีข้อผิดพลาด:

sudo: error while loading shared libraries: libsudo_util.so.0: cannot open shared object file: No such file or directory

มีวิธีการเปลี่ยนชื่อที่/usr_bakเป็น/usrที่นอกเหนือจากการติดตั้งระบบ?


2
ระบบปฏิบัติการใดนี่ ฉันสงสัยว่าsudoถึงขั้นตอนการเข้าสู่ห้องสมุดมันมักจะอยู่ใน/usr/bin/และควรล้มเหลวด้วยข้อผิดพลาดที่ไม่พบคำสั่ง คุณมีรหัสผ่านรูทหรือไม่
muru

3
@muru มันเป็น Ubuntu คุณถูกต้องฉันได้รับข้อผิดพลาดเกี่ยวกับnot foundมาก่อนดังนั้นฉันจึงผนวกเส้นทางใหม่/usr_bak/binไป$PATHและตอนนี้ฉันได้รับข้อผิดพลาดในโพสต์ของฉันที่นี่ ...
Yves

2
@ user1717828 มันซับซ้อน ฉันต้องรวบรวมโครงการพัฒนาบน Ubuntu 16.04 บน Ubuntu 17.10 ดังนั้นฉันคิดว่าฉันสามารถคัดลอก/usrUbuntu 16.04 เพียงเขียนทับ/usrUbuntu 17.10 ...
Yves

6
คุณได้พิจารณาใช้ VM เพื่อคอมไพล์โครงการแทนการเปลี่ยนแปลงที่รุนแรงเช่นนี้หรือไม่?
Kevin

3
คุณสามารถเรียกใช้ VirtualBox ในโหมดหัวขาด อาจเป็นการง่ายที่สุดในการตั้งค่าผู้เยี่ยมชมบนเครื่องอื่นหรือรับการกำหนดค่าล่วงหน้า
Kevin

คำตอบ:


109

เนื่องจากคุณได้ตั้งรหัสผ่านสำหรับรูทให้ใช้suและbusyboxติดตั้งโดยค่าเริ่มต้นใน Ubuntu ทั้งหมดsu's /libต้องอยู่ในห้องสมุด Busybox คือชุดของยูทิลิตี้ที่เชื่อมโยงแบบคงที่ดังนั้นไลบรารีที่หายไปจึงไม่ควรมีปัญหา ทำ:

su -c '/bin/busybox mv /usr_bak /usr'

(ในขณะที่ Busybox เองก็มีsuแอปเพล็ต แต่/bin/busyboxไบนารี่ไม่ได้เป็น setuid ดังนั้นมันจึงใช้งานไม่ได้เว้นแต่จะทำงานเป็นรูท)

หากคุณไม่มีรหัสผ่านรูทคุณอาจใช้โซลูชันของ Gilles ที่นี่โดยใช้LD_LIBRARY_PATHหรือ (Gilles บอกว่านี่จะไม่ทำงานกับ setuid binaries เช่น sudo) รีบูตและแก้ไขเมนู GRUB เพื่อบู๊ตด้วยinit=/bin/busyboxพารามิเตอร์เคอร์เนลและย้าย โฟลเดอร์กลับ


73
/libตอนนี้ไม่ได้ตั้งใจเปลี่ยนชื่อ
sleblanc

5
LD_LIBRARY_PATHจะไม่ช่วยในการเรียกใช้ sudo ตั้งแต่sudosetuid หากห้องสมุดไม่ได้อยู่ในที่ที่ถูกต้อง sudo จะไม่ทำงานจนกว่าจะซ่อมราก
Gilles

3
@Yves note historical: Unix รสชาติเก่า (ที่เก่ากว่า Linux มาก) รวมชุดของไบนารีที่เชื่อมโยงแบบสแตติกเข้าด้วยกัน/sbinเพื่อให้ตรงกับสถานการณ์ประเภทนั้น: "ฉันกำลังทำกิจกรรมบางอย่างที่ไลบรารีรันไทม์จะถูกล้อมรอบแต่ ต้องจัดการไฟล์ต่อไป " โดยพื้นฐานแล้ววิธีเดียวกันก่อนที่ Busybox จะถูกประดิษฐ์ขึ้น (จำนวนคำสั่งที่มีในรูปแบบนี้มี จำกัด มากเพราะสิ่งเหล่านั้นที่เชื่อมโยงแบบคงที่จะ
สลับกันไปเรื่อย

8
@ หากคุณเปลี่ยนชื่อ/libแล้วคุณอาจต้องรีบูตเครื่องinit=/bin/busybox
muru

3
@Yves: บูตจากแท่ง USB พร้อม distro สดที่สามารถติดตั้งระบบไฟล์ของคุณและคุณพร้อมที่จะแก้ไขอะไร แม้แต่การดาวน์โหลดไฟล์ทดแทนจากมิเรอร์แพ็คเกจถ้าคุณลบบางอย่าง
Peter Cordes

33

นอกจากคำตอบของ muru :

  • คุณอาจใช้คีย์ USB boot boot ช่วยเหลือเพื่อซ่อมแซมระบบของคุณ เช่นถ้าระบบของคุณบาง Debian หรืออูบุนตูบูตคีย์ USB ติดตั้งในโหมดกู้ภัยและทำตามความเหมาะสมmountและและmvumount

  • เพื่อให้สามารถซ่อมแซมได้ง่ายขึ้นผิดพลาดดังกล่าวผมมักติดตั้งเปลือกคงมีคำสั่ง builtin หลาย (สะดุดตากับบางcp, rm, mvbuiltins เหมือน) เช่นsash(มันจะบรรจุใน Debian และ Ubuntu และยังมีเป็นสายสะพาย 3.8 tar.gzในรูปแบบซอร์ส) และ boot โดยinit=/bin/sashส่งผ่านไปยัง Grub

PS: sashเป็นรถบั๊กเล็กน้อยและไม่สอดคล้องกับ Posix ทั้งหมด แต่ก็มีประโยชน์มาก


คุณช่วยอธิบายวิธีการติดตั้งเชลล์แบบคงที่ด้วยคำสั่ง builtin หลายคำสั่งได้ไหม มีคู่มือบ้างไหม?
Yves

1
ใน Debian apt-get install sashหรืออูบุนตู: แต่คุณสามารถดาวน์โหลดsash-3.8.tar.gzและคอมไพล์ได้
Basile Starynkevitch

ฉันใช้ liveiso บน hdd ด้วยรายการด้วงแบบกำหนดเองสำหรับปัญหาเช่นนี้ ไม่จำเป็นต้องมีความซับซ้อนเพียงแค่เปิดใช้งานระบบปฏิบัติการสดและจัดการไฟล์ได้อย่างอิสระ :)
FreeSoftwareServers

3

ฉันคิดว่าวิธีที่ดีที่สุดที่ปลอดภัยที่สุดคือการรีบูตโดยใช้ USB, CD หรือ DVD ที่บูตระบบปฏิบัติการ (Debian, Ubuntu, Suse, ฯลฯ ) จากนั้นติดตั้งไดรฟ์ที่มีปัญหาและทำการเปลี่ยนชื่อ

ปลอดภัยกว่าการบู๊ตในเขตที่วางทุ่นระเบิดโดยที่ / usr หรือ / lib หายไปอย่างมีประสิทธิภาพ


1
คุณสามารถบูท ISO ได้โดยตรงจาก Grub / HDD ไม่จำเป็นต้องใช้ USB / DVD ฯลฯ พริตตี้เคล็ดลับที่ดีมีการโทรวนรอบ
FreeSoftwareServers

0

ฉันวิ่งเข้าไปในปัญหาที่คล้ายกันที่ผมเปลี่ยน/usr/binไป/usr/bin_bkpสำหรับการทดสอบบางอย่างแล้วผมไม่สามารถที่จะเปลี่ยนชื่อ (ตามคำสั่งไม่พบsudoในไดเรกทอรีมาตรฐานซึ่งเป็น/usr/bin) และจากนั้นผมไป/usr/bin_bkpไดเรกทอรีด้วยตนเอง (โดยใช้ตัวจัดการไฟล์ ) และฟังก์ชั่นส่วนใหญ่ (รวมถึงการเปลี่ยนชื่อ) ที่คลิกขวาถูกปิดใช้งาน

จากนั้นฉันลองคำสั่งต่อไปนี้และแก้ไขปัญหา

$/usr/bin_bkp/sudo mv /usr/bin_bkp/ /usr/bin/

ฉันเรียก sudo จากเส้นทางปัจจุบันและใช้งานได้ตอนนี้ทุกอย่างกลับสู่ปกติ

ระบบปฏิบัติการ: Xubuntu 14.04


-3

ฉันไม่สามารถลองได้ในขณะนี้ (และไม่แน่ใจว่าฉันต้องการ) แต่ดูเหมือนว่าควรทำงานเพื่อสร้างตัวคุณเอง "/ usr" ใหม่เป็นลิงก์ยาก (ไม่ใช่ลิงก์อ่อน) ไปยัง " / usr_bak จากนั้นลบ "/ usr_bak"

ln /usr_bak /usr
rm /usr_bak

ฮาร์ดลิงก์ที่สร้างขึ้นโดย "ln" (โดยไม่มีอาร์กิวเมนต์ "-s") ในระบบไฟล์ควรทำให้ทั้งไดเร็กทอรี usr และ usr_bak เชื่อมโยงกับไดเรกทอรีที่เป็นปัญหาได้อย่างเท่าเทียมกัน "rm" เพิ่งลบลิงก์ที่คุณขอให้ลบออกไม่ใช่ลิงก์ทั้งสอง เนื่องจากยังคงมีลิงก์ที่ถูกต้องไปยังเนื้อหาจึงควรเข้าถึงได้ผ่านลิงก์ที่เหลือที่ "/ usr"


5
ฉันอยู่ภายใต้การแสดงผลที่ Linux (หรืออย่างน้อย Ubuntu) ไม่อนุญาตให้เชื่อมโยงไปยังไดเรกทอรีอย่างหนัก เช่นaskubuntu.com/questions/210741/…
Chris Bouchard

4
@Chris: ถูกต้อง Linux ไม่อนุญาตให้มีการเชื่อมโยงไดเรกทอรี (นอกเหนือจาก.และ..ดังนั้นการเชื่อมโยงนับในไดเรกทอรีบอกจำนวนย่อยระดับแรก) นอกจากนี้ไม่ทำงานบนไดเรกทอรีที่คุณจะต้องใช้rm rmdir( lnและrmทำงานบน symlink ไปยังไดเรกทอรี แต่เรากำลังพูดถึงไดเรกทอรีจริง) นอกจากนี้ไม่ได้แก้ปัญหาที่เกิดขึ้นเพราะมันต้องrootชอบเพียงmv/เพราะสิทธิ์บน หากคุณสามารถเรียกใช้สิ่งนี้คุณสามารถเรียกใช้mvแทนเหมือนคนปกติ
Peter Cordes

2
ส่วนใหญ่ลิงก์ไปยังไดเรกทอรีไม่รองรับ (ทั้งหมด?) เพราะมันยากเกินไปสำหรับซอฟต์แวร์ที่ทำการรวบรวมข้อมูลระบบไฟล์แบบเรียกซ้ำเพื่อตรวจจับลูปไม่สิ้นสุด เป็นไปได้ถ้าซอฟต์แวร์ติดตามการเยี่ยมชม inode ทั้งหมดและกำลังรวบรวมข้อมูลระบบไฟล์ inode ที่ทราบ (เช่นไม่ใช่ FAT32 / NTFS) แต่การตรวจสอบการเชื่อมโยงสัญลักษณ์และไม่ผ่านการสำรวจนั้นง่ายกว่ามาก สิ่งที่จำเป็นต้องมีคือการโทรไปยัง lstat (2) อย่างรวดเร็วเพื่อตรวจสอบประเภทไฟล์
penguin359

2
@Pryftan ของฉันln(1)ใน Debian กล่าวนี้ได้ที่-d/ -F/ --directoryตัวเลือก: "อนุญาตให้ใช้ super พยายามที่จะไดเรกทอรีลิงก์ยาก (หมายเหตุ: อาจจะล้มเหลวเนื่องจากข้อ จำกัด ของระบบแม้สำหรับใช้ super)" ดังนั้นคุณสามารถลองได้ฟรี แต่ระบบไฟล์ของคุณอาจจะไม่ยอมให้คุณ
Toby Speight

1
@TobySpeight ความคิดอื่น: ดู symlink (7) ที่กล่าวว่า: ฮาร์ดลิงก์อาจไม่อ้างอิงถึงไดเรกทอรี (เพื่อป้องกันความเป็นไปได้ของการวนซ้ำภายในทรีของระบบไฟล์ซึ่งจะทำให้โปรแกรมหลายโปรแกรมสับสน) และอาจไม่อ้างถึงไฟล์ในระบบไฟล์ต่างๆ หมายเลขไอโหนดไม่ซ้ำกันในระบบไฟล์) สิ่งนี้ทำให้ฉันคิดว่าความพยายามเชื่อมโยงอย่างหนักอาจเป็นวิธีการใช้ถ้อยคำอย่างอื่นที่เกิดขึ้นนั่นคือฟังก์ชั่นถูกเรียกใช้ แต่มันล้มเหลวอย่างแน่นอนเพราะมันเป็นไดเรกทอรี (อ้างอิงระบบแฟ้มคือสิ่งที่ผมคิดว่าในความคิดเห็นอื่น)
Pryftan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.