ย้าย / bin เนื้อหาไปที่ / usr / bin สามารถยกเลิกได้หรือไม่


18

ใช้ Ubuntu 17.04 ฉันกำลังติดตั้งซอฟต์แวร์จากการกระจายที่ไม่ใช่ที่เก็บฉันควรย้ายซอฟต์แวร์ bin - เนื้อหาไฟล์ไปยัง / usr / bin (ซึ่งเป็นคำแนะนำที่ไม่แน่นอน)

เป็นหนึ่งในวันเหล่านั้นดังนั้นสิ่งที่ฉันทำแทน:

mv /bin/* /usr/bin

ดังนั้นฉันจึงเมาและฉันบังเอิญย้ายไฟล์ทั้งหมดใน bin ไปยัง / usr / bin และ / bin ว่างเปล่า เนื่องจากฉันใช้ / bin นั้นเป็นระบบที่มีความสำคัญสำหรับการแก้ไขอย่างรวดเร็วฉันจึงคัดลอก / usr / bin เนื้อหาไปที่ / bin

ตอนนี้เนื้อหาของฉัน / bin และ / usr / bin เหมือนกันและทั้งคู่มีไฟล์ใน / bin และ / usr / bin แยกกัน

  1. อูบุนตูของฉันอยู่ในสภาพเสียหรือไม่? (ยังไม่ได้พยายามรีบูทคอมพิวเตอร์ตอนนี้ทุกอย่างยังทำงานอยู่)
  2. มีวิธีทราบหรือไม่ว่าไฟล์ใดที่ถูกย้าย / คัดลอกไปยัง / usr / bin เมื่อเร็ว ๆ นี้ดังนั้นฉันจึงสามารถดูแลสถานการณ์ด้วยตนเองได้หรือไม่? 2.1 มักจะมีไฟล์ที่ทับซ้อนกันใน / bin และ / usr / bin
  3. มีวิธีอื่นในการเลิกทำในสิ่งที่ฉันทำหรือไม่

ฉันไม่ได้ติดตั้ง Timeshift ดังนั้นการกู้คืนข้อมูลสำรองจึงไม่ใช่ตัวเลือก แต่ไม่มีอะไรสำคัญในคอมพิวเตอร์ดังนั้นฉันสามารถยอมรับการติดตั้งพาร์ติชัน linux ทั้งหมดใหม่อีกครั้ง


2
dpkg-query -l | awk '{ระบบ ("dpkg-query -L" $ 2 "| grep -E \" ^ / usr / bin /.*$ \ "")}' สิ่งนี้จะให้ไฟล์ทั้งหมดแก่คุณในตอนแรกใน / usr / bin ตาม แพ็คเกจที่ติดตั้ง
Raman Sailopal

7
@ SatōKatsura /binมีความสำคัญต่อระบบ เนื้อหาของมันจะต้องอยู่ในช่วงการบู๊ตที่เร็วที่สุด คุณไม่ต้องการสร้างลิงก์สัญลักษณ์ไปยังพาร์ติชัน ( /usrที่นี่) ซึ่งอาจไม่สามารถนำไปใช้กับการบูทได้
xhienne

1
@ xhienne ฉันไม่เคยบอกว่ามันจะรอดจากการรีบูตได้ เป็นการแก้ไขชั่วคราวเพื่อให้มีฟังก์ชันเพียงพอที่จะสามารถซ่อมแซมระบบได้
Satō Katsura

1
@xhienne ที่ขึ้นอยู่กับวิธีการตั้งค่า distro ตัวอย่างเช่น Arch ไม่ได้ดูแลรักษาแยกเป็น/binค่าเริ่มต้น การแบ่งพาร์ติชันเริ่มต้นของ Ubuntu ไม่ได้ทำ/usrพาร์ติชันแยกต่างหาก ฉันอยากรู้อยากเห็นว่ามีกี่คนที่แยกจากกัน/usrกับผู้คนในปัจจุบัน
muru

1
@muru แสดงความคิดเห็นของฉันเป็นแบบทั่วไป คุณอาจคิดว่าสิ่งที่คุณต้องการในจำนวนพาร์ติชั่นฉันไม่ต้องการและฉันเตือนการเชื่อมโยง / usr / bin / * กับ / bin ซึ่งที่ดีที่สุดคือไร้ประโยชน์อย่างสมบูรณ์และที่แย่ที่สุดอาจทำให้ระบบใช้ไม่ได้ในการบูตครั้งถัดไป . ไม่มีระบบที่ตามหลัง FHS ควรมี symlinks ไปยัง / usr / bin OP ได้รับคำแนะนำให้คัดลอกไฟล์แทน
xhienne

คำตอบ:


19

อูบุนตูของฉันอยู่ในสภาพเสียหรือไม่?

ใช่Ubuntu ของคุณเสีย

คุณ messed ขึ้นสิ่งที่สำคัญในการจัดแพคเกจการจัดการ

ดังนั้นในทางปฏิบัติสำรองข้อมูลสำคัญของคุณ (อย่างน้อย/etcและ/home) อาจเป็นรายการแพคเกจที่ติดตั้งเช่นเอาท์พุทdpkg -lและติดตั้ง Ubuntu อีกครั้ง

(ผู้เริ่มหัดสามารถพยายามจัดการเหมือนคำตอบอื่น ๆ แต่แล้วเขาก็ไม่ได้ทำผิดขนาดใหญ่และพื้นฐาน)

ฉันแค่ยอมรับว่าจะทำให้ติดตั้งลินุกซ์พาร์ติชันใหม่ทั้งหมด

นั่นอาจเป็นสิ่งที่จะใช้เวลาน้อยลง การรักษาระบบปัจจุบันของคุณด้วยความช่วยเหลือของคำตอบอื่น ๆ คือทำให้ระบบยุ่งเหยิง (ซึ่งจะทำให้คุณปวดหัวในอนาคต)

เนื่องจากคุณกำลังฟอร์แมตดิสก์ใหม่ให้พิจารณาวาง/homeพาร์ติชันแยกต่างหาก (ดังนั้นในอนาคตข้อผิดพลาดดังกล่าวจะไม่ทำให้ข้อมูลของคุณสูญหาย) ก่อนที่จะทำการพิมพ์ลงบนกระดาษผลลัพธ์ของdf -hและdf -hiและfdisk -l(จะให้ข้อมูลเกี่ยวกับพื้นที่ดิสก์ - ทั้งที่ใช้แล้วและมีอยู่ - ... ) ควรมีพาร์ติชันระบบที่ใหญ่พอ (ระบบไฟล์รูท); หากคุณสามารถจ่ายได้ 100 Gbytes นั้นมากเกินพอ

ฉันควรจะย้ายเนื้อหาของซอฟต์แวร์ bin - โฟลเดอร์ไปยัง / usr / bin

(คำศัพท์: Unix มีไดเรกทอรีไม่ใช่ "โฟลเดอร์")

นั่น ( ย้ายไป/usr/bin/) ผิดมาก ทั้งการปรับปรุงของคุณ$ PATH (กว่า) หรือที่ส่วนใหญ่เพิ่มsymlinksใน/usr/bin/และควรเคลื่อนย้าย (หรือเพิ่ม symlinks) executables /usr/local/bin/ไป

วิธีการที่ชาญฉลาดคือการไม่เปลี่ยนแปลง/usr/bin/, /bin, /sbin, /usr/sbin/ ด้านนอกของเครื่องมือในการจัดการแพคเกจ (เช่นdpkg, apt-get, aptitudeฯลฯ ... ) อ่านFHS


4
จะยอมรับคำตอบนี้: ดูเหมือนว่าหลังจากพยายามกู้คืนมันจะทำงานจนกระทั่งรีบูตซึ่งไม่สามารถเปิดเซสชันสภาพแวดล้อมเดสก์ท็อปอีกต่อไป แทนที่จะพยายามแก้ไขสิ่งนั้นฉันจะยอมรับสกรูทั้งหมดของฉันและจะติดตั้งพาร์ติชัน linux อีกครั้ง เนื่องจากทุกอย่างอยู่ในการควบคุมเวอร์ชันและฉันใช้ระบบเพียงสัปดาห์เดียวสิ่งที่ฉันสูญเสียไปจริงๆคือศักดิ์ศรีของฉันและมีการโจมตีเสียขวัญเล็กน้อย แต่ดูเหมือนว่าจะเป็นเรื่องปกติเมื่อชีวิตสอนบทเรียนให้ฉัน
oneOfThoseDays

1
เหมือน/binและ/usr/binตอนนี้เหมือนกันฉันไม่แน่ใจว่าทำไมการจัดการแพคเกจจะทำให้เมาขึ้น จริงๆมีกรณีที่/bin/fooและ/usr/bin/fooมีทั้งที่จัดไว้ให้โดยแพคเกจ (s) ถ้าไม่มีมีไฟล์พิเศษบางไฟล์ที่ลอยอยู่รอบ ๆ
StrongBad

3
@ ไม่มีพื้นฐานมันจะไม่ (ไม่มีความสุข); การจัดการแพ็กเกจจะสนใจเฉพาะไฟล์ที่รู้เท่านั้นโดยไม่บ่นเกี่ยวกับไฟล์ที่ไม่รู้จัก แม้สำหรับไฟล์ที่ไม่ทราบเกี่ยวกับมันจะไม่ได้รับการใส่ใจโดยเฉพาะอย่างยิ่งถ้าพวกเขาได้เปลี่ยน ...
สตีเฟ่นกิต

2
@Basile ฉันจะไม่นับส่วนหลัง "(ผู้ที่ไม่ใช่ผู้ฝึกหัดสามารถพยายามจัดการ - เหมือนคำตอบอื่น ๆ - แต่แล้วเขาก็ไม่ได้ทำผิดขนาดใหญ่และพื้นฐาน)" เป็นจริง ;-) แม้แต่ผู้เชี่ยวชาญก็ล้มเหลวในบางครั้ง!
Stephen Kitt

1
FWIW /พาร์ติชันระบบหลักของฉันคือ 12GB และฉันไม่เคยเจอปัญหาเรื่องพื้นที่แม้จะใช้เพื่อการพัฒนา (อ่านไฟล์ส่วนหัวและเครื่องมือมากมาย) สำนักงานและการออกแบบ (อ่านเครื่องมือที่หนักหน่วง) บน KDE (read not-the-slimmest) โยนให้มากขึ้น 4GB หากคุณไม่แยก/varเพิ่มขึ้น 25% หากคุณต้องการระยะขอบที่กว้างกว่าที่ฉันมีและที่ 20GB คุณดีกว่ามาก
สเปกตรัม

36

บน Linux (และในระบบอื่น ๆ ส่วนใหญ่แม้ว่า POSIX จะไม่ให้การรับประกันแก่คุณเว้นแต่ว่าการย้ายข้ามระบบไฟล์) ซึ่งจะมีการอัปเดตเวลาของพวกเขาดังนั้นจึงไม่มี/usr/binการแตะใด ๆ ใน 24 ชั่วโมงที่ผ่านมา คุณควรจะย้ายพวกเขากลับด้วย:

find /usr/bin/. ! -name . -prune -ctime -1 -exec sh -c '
   echo mv -i "$@" /bin' sh {} +

ลบechoหากที่ถูกต้อง โปรดทราบว่าคุณจะไม่สามารถกู้คืนไฟล์ที่มีชื่อเดียวกันใน/binและ/usr/bin(ไฟล์เดิมที่/usr/binจะหายไป)

คำเตือนที่อาจเกิดขึ้นถ้าบางไฟล์มีการเชื่อมโยงอย่างหนักทั้งใน/binและ/usr/binทุกการเชื่อมโยงอย่างหนักในจะถูกย้ายไปยัง/usr/bin/bin

ตอนนี้คุณอาจจะคิดว่าตั้งแต่/binและ/usr/binอยู่ในการเริ่มต้น$PATHและการ/binให้บริการที่/bootอย่างน้อยก่อน/usrที่จะติดตั้งมันไม่ควรไม่ว่า executables อยู่ในแทน/bin/usr/bin

แต่นั่นจะเป็นการมองว่าคำสั่งจำนวนมากจะเขียนโค้ดที่ยากลำบากสำหรับเส้นทางของไฟล์เอ็กซีคิ้วท์และคาดว่ามันจะอยู่ในบางกรณี กรณีทั่วไปคือเธอเรียบ สคริปต์ทั้งหมดที่มี:

#! /usr/bin/env bash

mv /usr/bin/env /bin/envจะล้มเหลวในการทำงานหลังจากที่คุณทำ ในเรื่องนั้นการมีคำสั่งในทั้งสองตำแหน่งนั้นปลอดภัยกว่าเพราะจะไม่ทำให้สคริปต์เหล่านั้นเสียหาย


3
ในฐานะที่พาดพิงถึงข้างต้น (ฉันลบความคิดเห็นของฉันที่มันมีข้อผิดพลาดร้ายแรงที่จะพยายามที่จะย้ายทุกอย่างเพื่อไดเรกทอรีที่เรียกว่าi--sorry เกี่ยวกับที่!) บนระบบ GNU / Linux เช่นอูบุนตูหนึ่งอาจจะใช้find /usr/bin/. ! -name . -prune -ctime -1 -exec echo mv -it /bin {} +ตั้งแต่GNU coreutilsmv-tสนับสนุน ระบบปฏิบัติการอื่น ๆโดยทั่วไปไม่สนับสนุนหรือไม่ก็ทำงานในสลับmvให้โดย BusyBox
Eliah Kagan

17
  1. การติดตั้งของคุณส่วนใหญ่จะเป็นเรื่องปกติ ไม่ควรมีไฟล์ต่างกันที่มีชื่อเดียวกันใน/usrและ/usr/bin(ซึ่งตอบคำถามของคุณ 2.1) ดังนั้นให้มีไฟล์ทั้งหมดในทั้งสอง/binและ/usr/binจะไม่ทำลายอะไรเลย (จนกว่าคุณจะอัปเกรดแพ็คเกจ) ปัญหาเดียวที่คุณอาจมีตอนนี้คือ symlink ที่ใช้งานไม่ได้หากคุณเขียนทับไบนารีด้วย symlink ในการแก้ไขปัญหานี้ให้มองหาลิงก์ที่ใช้งานไม่ได้:

    find -L /bin /usr/bin -type l -ls
    

    และติดตั้งแพ็กเกจใด ๆ ที่สอดคล้องกับไฟล์ที่แสดง (ตัวอย่างเช่นหาก/usr/bin/zshปรากฏว่าใช้งานไม่ได้dpkg -S /bin/zsh /usr/bin/zshจะแจ้งให้คุณทราบว่าไฟล์นั้นมาจากไหนติดตั้งด้วยapt --reinstall install zsh)

  2. คุณสามารถแสดงและจัดเรียงตามเวลาเพื่อดูไฟล์ที่มีการเปลี่ยนแปลงเมื่อเร็ว ๆ นี้ (ซึ่งจะรวมถึงไฟล์ที่คุณย้าย):

    ls -ltc /bin
    
  3. วิธีที่ดีที่สุดในการยกเลิกสิ่งที่คุณทำคือใช้cruftแพ็คเกจและลบไฟล์ที่พบ/binหรือ/usr/binไม่ได้มาจากแพ็คเกจ:

    sudo apt install cruft
    sudo cruft -d "/ /usr"
    

    นอกเสียจากว่าไฟล์นั้นจะเชื่อมโยงกับไฟล์ใน/etc/alternatives(ซึ่งในกรณีนี้คุณควรทิ้งไว้คนเดียว)


ยกเว้นสคริปต์ที่ขึ้นต้นด้วย#! /bin/shหรือคล้ายกัน
Satō Katsura

@ SatōKatsuraพวกเขายังคงทำงานได้ดีถ้าshอยู่ในทั้งสอง/binและ/usr/bin(ไฟล์ทั้งหมดจะถูกทำซ้ำในขณะนี้)
Stephen Kitt

1
cruftไม่จำเป็นต้องใช้ชุดเครื่องมือพิเศษเช่นนี้เนื่องจากตัวจัดการแพ็คเกจยังติดตามไฟล์ที่ติดตั้ง ดูunix.stackexchange.com/questions/153260/...
64

1
comm -12 <(ls /bin) <(ls /usr/bin)แสดงบางรายการในระบบ Ubuntu ที่ฉันทดสอบ บางอย่าง/bin/foo -> /usr/bin/fooซึ่งหมายความว่าfooจะได้หายไป
Stéphane Chazelas

@ Stéphaneอ่าใช่การย้ายลิงก์จะทำให้เอกสารต้นฉบับ ...
Stephen Kitt

6

อาจเป็นการศึกษาที่จะอธิบายอย่างละเอียดว่าทำไมระบบของคุณถึง 'แตกหัก' มากขึ้นหรือน้อยลง

  1. ตามที่ @ basile-starynkevitch ชี้ให้เห็นว่าระบบการจัดการบรรจุภัณฑ์มีความเป็นไปได้ที่จะเกิดความสับสนอย่างมากหากพบว่ามีไบนารีใน/binเวลาที่ควรเข้าใช้/usr/binและในทางกลับกัน
  2. สคริปต์ (อาจมีความสำคัญ) บางตัวอาจใช้สายยากในการค้นหาไบนารีโดยเฉพาะในไดเรกทอรีเดียวหรืออีกอัน (ในบางกรณีเป็นการปฏิบัติที่ดีตัวอย่างเช่นจากมุมมองด้านความปลอดภัยไม่ใช่เพื่อพึ่งพาเนื้อหาของ$PATH)
  3. เหตุผลว่าทำไมจึงมีความแตกต่างระหว่าง/binและ/usr/binเป็นที่ในอดีตอาจจะอยู่ในพาร์ทิชันที่ติดตั้งในระยะก่อนหน้าของการบูต ในบริบทนี้ (เช่นเมื่อบูทระบบ) ไม่เพียง แต่/bin/xxxไบนารีจะถูกอ้างถึงโดยพา ธ เต็ม แต่ไดเรกทอรี/usr/binอาจไม่สามารถใช้ได้ในระบบ ณ จุดนั้น (ถ้าคุณdf /binและdf /usr/binคุณอาจเห็นระบบไฟล์เดียวกันอยู่ในรายการหรือแตกต่างกันอาจจะติดตั้งเป็นค่าเริ่มต้นส่วนใหญ่วันนี้ปล่อยให้ทั้งสองไดเรกทอรีในพาร์ทิชันเดียวกัน)

ดังนั้นคุณจะไม่ต้องสงสัยเลยว่าถ้าคุณมีไบนารีเดียวกันในทั้งสอง/binและ/usr/binปัญหาที่ 2 และ 3 จะไม่เกิดขึ้นและความเสียหายจาก 1 อาจน้อย ยกตัวอย่างเช่น 1 แพคเกจอาจไม่ถูกถอนการติดตั้งอย่างถูกต้องหากคุณพยายามที่จะลบพวกเขา; และการอัปเกรดอาจกลายเป็นอ่านไม่ออกหากการอัพเกรดพยายามอัพเกรดสำเนาในตำแหน่ง 'ถูกต้อง' แต่ไม่สนใจสำเนาในตำแหน่ง 'ผิด' ดังนั้นหากการเยียวยาข้างต้นดูเหมือนรุนแรงเกินไปหรือซับซ้อนเกินไปคุณอาจหลีกเลี่ยงการออกจากระบบในสถานะนี้

แต่ถ้าเป็นระบบที่สำคัญผมจริงๆจะธนาคารไม่ว่า

กฎทั่วไป (อีกครั้งสะท้อน @ Basile-starynkevitch) คือไม่เคยที่จะลิงที่มี/usr/bin, /binและเพื่อน ๆ - พวกเขา 'เป็นของ' การกระจาย - และแพคเกจซึ่งแสดงให้เห็นการทำเช่นนั้นเป็นส่วนหนึ่งของปกติติดตั้งคือ ... ไม่ได้เป็นแพคเกจที่ดี

แก้ไข:เกี่ยวข้องกับประเด็นที่ 3 มีการอภิปรายในบริบทของ systemd / Fedora และเพื่อน ๆว่าเหตุใดการย้ายเนื้อหาทั้งหมด/binไปยัง/usr/binและเชื่อมโยงจากหนึ่งไปยังสอง นี่ไม่ใช่คำแนะนำที่คุณทำเช่นนี้ตัวคุณเอง - หน้านั้นจะถูกส่งไปยังผู้คนที่ทำการแจกแจง - แต่มันรวมถึงประวัติบางส่วนของสาเหตุที่ความแตกต่างนี้มีอยู่

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