อะไรคือความแตกต่างระหว่าง / opt และ / usr / local


403

ตามที่ระบบแฟ้มลำดับชั้นมาตรฐาน , /optสำหรับ "การติดตั้ง Add-on แพคเกจซอฟต์แวร์ประยุกต์" /usr/localคือ "ใช้โดยผู้ดูแลระบบเมื่อติดตั้งซอฟต์แวร์ในเครื่อง" กรณีใช้งานเหล่านี้ดูคล้ายกันมาก ซอฟต์แวร์ที่ไม่รวมอยู่ในการแจกแจงมักจะมีการกำหนดค่าตามค่าเริ่มต้นเพื่อติดตั้งใน/usr/localหรือ/optไม่สัมผัสหรือเหตุผลที่พวกเขาเลือก

มีอะไรบ้างที่ฉันขาดไปหรือทั้งสองทำสิ่งเดียวกัน แต่มีอยู่ด้วยเหตุผลทางประวัติศาสตร์?


3
ความเข้าใจของฉันคือว่า/usr/localเป็นระบบโลคัลเวอร์ชัน/usrในขณะที่/optเป็นตัวยึดตำแหน่งสำหรับสิ่งอื่น ๆ
yasouser

5
คำถามที่คล้ายกันในAsk Ubuntu , superuser
kenchew

ปิดหัวข้อเกี่ยวกับเหตุผลทางประวัติศาสตร์: การทำความเข้าใจถัง sbin, usr / bin, usr แยก
Alexey

คำตอบ:


357

ในขณะที่ทั้งสองถูกออกแบบมาเพื่อให้มีไฟล์ที่ไม่ได้เป็นของระบบปฏิบัติการ/optและ/usr/localไม่ได้ตั้งใจที่จะมีไฟล์ชุดเดียวกัน

/usr/localเป็นสถานที่สำหรับติดตั้งไฟล์ที่สร้างโดยผู้ดูแลระบบโดยทั่วไปจะใช้makeคำสั่ง (เช่น./configure; make; make install) แนวคิดคือการหลีกเลี่ยงการปะทะกับไฟล์ที่เป็นส่วนหนึ่งของระบบปฏิบัติการซึ่งอาจถูกเขียนทับหรือเขียนทับโลคัลมิฉะนั้น (เช่น/usr/bin/fooเป็นส่วนหนึ่งของระบบปฏิบัติการในขณะที่/usr/local/bin/fooเป็นทางเลือกในท้องถิ่น)

ไฟล์ทั้งหมดภายใต้/usrสามารถใช้ร่วมกันได้ระหว่างอินสแตนซ์ของระบบปฏิบัติการแม้ว่าจะไม่ค่อยมีใน Linux นี่เป็นส่วนที่ FHS ขัดแย้งกันเองเล็กน้อยตามที่/usrกำหนดให้เป็นแบบอ่านอย่างเดียว แต่/usr/local/binต้องอ่านแบบเขียนเพื่อให้การติดตั้งซอฟต์แวร์ในท้องถิ่นสำเร็จ มาตรฐานระบบไฟล์ SVR4 ซึ่งเป็นแรงบันดาลใจหลักของ FHS แนะนำให้หลีกเลี่ยง/usr/localและใช้/opt/localแทนเพื่อเอาชนะปัญหานี้

/usr/localเป็นมรดกจาก BSD ดั้งเดิม ในเวลานั้นซอร์สโค้ดของ/usr/binคำสั่งระบบปฏิบัติการอยู่ใน/usr/src/binและ/usr/src/usr.binในขณะที่แหล่งที่มาของคำสั่งที่พัฒนาในประเทศอยู่ใน/usr/local/srcและไบนารีของพวกเขา/usr/local/binมา ไม่มีความคิดเกี่ยวกับบรรจุภัณฑ์ (tarballs ภายนอก)

ในทางตรงกันข้าม/optเป็นไดเรกทอรีสำหรับการติดตั้งแพคเกจ unbundled (เช่นแพคเกจไม่ได้เป็นส่วนหนึ่งของการกระจายระบบปฏิบัติการ แต่จัดทำโดยแหล่งที่มาอิสระ) แต่ละคนในไดเรกทอรีย่อยของตัวเอง พวกเขาสร้างแพคเกจทั้งหมดแล้วโดยผู้จัดจำหน่ายซอฟต์แวร์บุคคลที่สามที่เป็นอิสระ /usr/localแพ็กเกจเหล่านี้จะแตกต่างจากของอื่น ๆ ตามแพ็คเกจ (หรืออย่างน้อยก็ควร) ยกตัวอย่างเช่นsomeappจะได้รับการติดตั้งใน/opt/someappหนึ่งของการเป็นคำสั่ง/opt/someapp/bin/foo, แฟ้มการกำหนดค่าของมันจะเป็นในและไฟล์บันทึกใน/etc/opt/someapp/foo.conf/var/opt/someapp/logs/foo.access


53
/ usr / local, สำหรับตนเอง, inhouse, ซอฟต์แวร์รวบรวมและดูแลรักษา / opt ใช้สำหรับพื้นที่การติดตั้งบันเดิลไบนารี / แอ็พพลิเคชันแบบไม่รวมตัวเองภายนอกและเป็นแพ็คเกจ อืม ... เราไม่มีไฟล์ C: \ program สำหรับทุกอย่าง ;-)
Nikhil Mulley

2
"ในอีกทางหนึ่ง / opt เป็นไดเรกทอรีที่จะติดตั้งแพคเกจ unbundled" แพ็คเกจ 'unbundled' หมายถึงอะไรที่นี่
Kevin Wheeler

1
@KevinWheeler ที่อธิบายไว้ในประโยคถัดไป Unbundled หมายถึงแพ็คเกจที่ไม่ได้เป็นส่วนหนึ่งของการกระจายระบบปฏิบัติการ แต่จัดทำโดยแหล่งข้อมูลอิสระ
jlliagre

2
@jlliagre centos docs * state "ตัวอย่างเช่นหากไดเร็กทอรี / usr / ถูกเมาท์เป็นแบบแชร์ NFS แบบอ่านอย่างเดียวจากรีโมตโฮสต์ยังคงเป็นไปได้ที่จะติดตั้งแพ็กเกจหรือโปรแกรมภายใต้ไดเร็กทอรี / usr / local /" ฉันไม่รู้ว่าใครถูก แต่สิ่งนี้ดูเหมือนจะขัดแย้งกับข้อเรียกร้องของคุณเกี่ยวกับพื้นที่ที่ FHS อ่อนแอ (* source centos.org/docs/5/html/5.1/Deployment_Guide/ ...... )
Kevin Wheeler

1
@KevinWheeler นั่นคือจุดอ่อนที่ฉันพูดถึงอย่างแม่นยำ การติดตั้งแพคเกจหรือโปรแกรมในไดเรกทอรีระยะไกลอ่านอย่างเดียวเป็นไปไม่ได้ วิธีแก้ปัญหาคือการเมาท์ระบบไฟล์โลคัลบน / usr / local แต่นี่ดูเหมือนว่างานชั่วคราวมากกว่าสิ่งที่ออกแบบมาอย่างเหมาะสม
jlliagre

84

ความแตกต่างพื้นฐาน/usr/localคือสำหรับซอฟต์แวร์ที่ไม่ได้รับการจัดการโดยผู้จัดทำระบบ แต่ยังคงปฏิบัติตามกฎการปรับใช้ unix มาตรฐาน

นั่นเป็นเหตุผลที่คุณมี/usr/local/bin, /usr/local/sbin /usr/local/includeฯลฯ ...

/optในทางตรงกันข้ามสำหรับซอฟต์แวร์ที่ไม่ปฏิบัติตามนี้และมีการปรับใช้ในรูปแบบเสาหิน ซึ่งมักจะรวมถึงซอฟต์แวร์เชิงพาณิชย์และ / หรือซอฟต์แวร์ข้ามแพลตฟอร์มที่จัดทำในรูปแบบ "Windows"


12
ฉันไม่เห็นด้วยกับจุดเสาหินของคุณ มาตรฐาน FHS กล่าวว่าแพ็คเกจที่ติดตั้งใน / opt ไดเรกทอรีย่อยจะต้องมีไฟล์เฉพาะโฮสต์ของพวกเขาที่จะติดตั้งนอก / opt ตามลำดับภายใต้ / etc / opt / แพ็คเกจสำหรับไฟล์การกำหนดค่าและ / var / opt / แพ็คเกจสำหรับบันทึกสปูลและที่คล้ายกัน / opt ใกล้เคียงกับกฎการปรับใช้ยูนิกซ์มากกว่า / usr / local ซึ่งวางทุกอย่างไว้ในไดเรกทอรีที่ควรเป็นแบบอ่านอย่างเดียว แต่ไม่มีเหตุผลที่ชัดเจน
jlliagre

5
แน่นอนว่าถ้าฉันทำแพ็คเกจ opt และต้องการอ้างสิทธิ์ FHS มิฉะนั้นมาตรฐานจะยิ่งมากกว่าสิ่งที่คุณเรียกว่า "แนวทาง" เพียงเพราะ NetBeans ไม่ได้ใช้ / etc / opt / netbeans จะไม่ขัดขวางไม่ให้ฉันใส่ / opt สำหรับทั้งระบบหรือ $ HOME / .local / opt สำหรับผู้ใช้คนเดียว
แคลส

1
@jla ฉันคิดว่าความคิดเห็นล่าสุดของคุณถูกส่งมาที่ฉันดังนั้นโปรดใช้ @ xxx เมื่อตอบกลับบุคคลอื่นที่เป็น OP หรือผู้เขียนตอบกลับ เกี่ยวกับ / etc / opt FHS ไม่ได้บอกว่าเป็นสถานที่ที่แนะนำ (เป็นแนวทาง) แต่เป็นตำแหน่งบังคับ คุณหรือนักพัฒนา Netbeans มีอิสระที่จะละเมิดมาตรฐานนั้นเนื่องจากไม่มีอำนาจในการบังคับใช้ แต่อย่าบอกว่าการทำผิดเป็นวิธีที่จะดำเนินการ มันเป็นเพียงการละเมิดความเข้าใจผิดหรือโชคร้ายโดยเจตนา
jlliagre

8
@jlliagre ในฐานะผู้ดูแลระบบของฉัน FHS เป็นชุดแนวทาง ไดเร็กทอรี / opt เป็นจุดที่ใช้กันทั่วไปในการวางซอฟต์แวร์เสาหิน / opt / <package> หรือ / opt / <provider> เมื่อฉันติดตั้งแพคเกจที่ต้องการใช้ <package | ผู้ให้บริการ> / all / data / required / to / support มันจะเข้าร่วม / แม้ว่าผู้ให้บริการจะไม่ปฏิบัติตามรายละเอียดของ FHS ล่าสุดทุกครั้ง ฉันอาจส่งอีเมลหรือรายงานข้อผิดพลาด แต่ฉันจะไม่ใส่ชุดเสาหินนั้นไว้ที่อื่นเพื่อให้รู้สึกดีขึ้นเกี่ยวกับ FHS ในระบบของฉัน
jla

1
@jlliagre ฉันได้ติดตั้งสิ่งต่างๆมากมายใน / opt และไม่มีไฟล์ใดถูกสร้างใน / etc / opt ควร?
erm3nda

18

พวกมันคล้ายกันมากและการใช้อันใดอันหนึ่งเป็นเรื่องของความเห็นมากกว่า วารสารลินุกซ์มีนี้การอภิปราย / จุดแตกต่างเกี่ยวกับเรื่องนี้แน่นอนที่นี่


9
โอ้ที่รัก ฉันไม่ได้ตั้งใจจะลากตัวเองไปสู่ ​​"สงครามศักดิ์สิทธิ์"
แพทช์

13

สำหรับฉันมันเป็นสิ่งที่บิลพูดในลิงก์ของ @ philfr:

ในระบบการพัฒนาหรือแซนด์บ็อกซ์มีไดเร็กทอรี / opt ที่คุณสามารถโยนสิ่งของและดูว่ามันทำงานได้ดีหรือไม่ ฉันรู้ว่าฉันจะไม่พยายามทำสิ่งต่าง ๆ ด้วยตนเองเพื่อทดลองใช้ หากแอปไม่ได้ผลคุณสามารถเพียงแค่สร้างไดเร็กทอรี / opt / mytestapp และแอปพลิเคชันนั้นเป็นประวัติ บรรจุภัณฑ์อาจสมเหตุสมผลเมื่อคุณใช้งานการปรับใช้ขนาดใหญ่ (มีหลายครั้งที่ฉันทำแอปพลิเคชันแพ็คเกจ) แต่หลายครั้งก็เป็นการดีที่จะโยนสิ่งต่างๆใน / opt

น่าเสียดายที่make installสคริปต์ส่วนใหญ่ดันไฟล์เข้าไป/usr/localแทนที่จะสร้าง symlink ที่นั่น: - /


2
ประเด็นคืออะไร? หากคุณกำลังจะสร้าง symlink อยู่แล้วทำไมไม่ลองวางไฟล์ต้นฉบับไว้ในตำแหน่งแรกล่ะ
Let_Me_Be

8
เพียงแค่แสดงความคิดเห็นในmake installเป้าหมายผลักไฟล์เข้า/usr/local; การทำงานนี้อาจมีการเปลี่ยนแปลงได้อย่างง่ายดายโดยผ่าน--prefix=พารามิเตอร์บรรทัดคำสั่งไปยัง./configureสคริปต์หรือถ้าไม่มี./configureสคริปต์คุณสามารถส่งผ่านพารามิเตอร์ไปยังเป้าหมายที่ต้องการเพื่อ:make make --prefix=/usr install
ฌอนซี

3
/ ยกเลิกการเลือกไดเรกทอรีมาตรฐานรวมอยู่ใน $ PATH หรือไม่ ฉันรู้ว่า / usr / local คือ
LawrenceC

5
@Let_Me_Be ประโยชน์ที่ได้รับคือมันง่ายมากที่จะเก็บเวอร์ชันเก่าไว้ สมมติว่าผมมี 2 รุ่นของ 'foo' ตั้งอยู่ในและ/opt/foo-1.1 /opt/foo-1.2เมื่อฉันอัพเกรดfoosymlink ใน/usr/local/binคะแนนเป็น foo-1.2 ถ้าด้วยเหตุผลบางอย่างที่ฉันต้องการย้อนกลับฉันเพียงแทนที่ symlink ด้วยอันที่ชี้ไปที่ foo-1.1 แทน หาก 1.2 ไม่เป็นไรหลังจากผ่านไปหลายสัปดาห์การrm -rf /opt/foo-1.1ลบอย่างรวดเร็วจะลบเวอร์ชันเก่าออกอย่างรวดเร็วและหมดจด
pepoluan

7
@ultrasawblade ไม่มันไม่ใช่ และไม่ควรจะเป็น หลังจากทั้งหมดตาม FHS / opt จะต้องถูกแบ่งย่อยเป็นส่วนย่อยที่มีชื่อของแพคเกจ การยัดทุกอย่างลงใน PATH เป็นวิธีที่แน่นอนสำหรับภัยพิบัติ ค่อนข้างแอปควรติดตั้งตัวเองภายใต้ / opt และเชื่อมโยงโปรแกรมที่ผู้ใช้เรียกใช้ลงใน / usr / local / bin (หรือ sbin)
pepoluan

11

ก่อนอื่นฉันไม่คิดว่าจะมีคำตอบที่เข้มงวด ผู้ดูแลระบบที่แตกต่างกันจะมีความคิดเห็นต่างกันตามพื้นฐานของพวกเขา ประวัติศาสตร์/usr/localมาเป็นอันดับแรก มันเป็นแบบแผนในเบิร์กลีย์ IIRC จนถึงจุดหนึ่งในระหว่างการพัฒนาของ System V ถ้าฉันไม่เข้าใจผิด (นี่เป็นเวลานานมาแล้วและฉันไม่ได้จดบันทึก) มีการตัดสินใจหรือความปรารถนาที่จะติด/usrอ่านอย่างเดียว ซึ่งหมายความว่าคุณไม่สามารถเพิ่มซอฟต์แวร์ใหม่ลงไปได้ นั่นอาจเป็นสาเหตุที่/opt คิดค้นขึ้นมา มันเกิดขึ้นมีซอฟต์แวร์ที่มีอยู่มากมายที่เขียนถึง/usrความคิดนั้นไม่เคยหลุดออกจากพื้นเลย

ความชอบส่วนบุคคลของฉันคือ/optด้วยไดเรกทอรีย่อยแยกต่างหากสำหรับแต่ละผลิตภัณฑ์ rm -frนี้จะทำให้การเอาผลิตภัณฑ์กรณีที่เรียบง่ายของ แต่ถ้าซอฟต์แวร์ทั้งหมดของคุณถูกติดตั้งผ่านตัวจัดการแพคเกจที่ดีมันไม่สำคัญและหากซอฟต์แวร์ที่คุณติดตั้งไม่ปฏิบัติตามอนุสัญญาเหล่านี้อย่างเคร่งครัดและเขียนการกำหนดค่าและที่อื่น ๆ ภายใต้/usrมันก็ไม่สำคัญ ด้วยเหตุผลตรงข้าม


1
"" "ซอฟต์แวร์ทั้งหมดของคุณติดตั้งผ่านตัวจัดการแพกเกจที่ดี" "" ซึ่งเป็นไปไม่ได้เว้นแต่คุณจะใช้ซอฟต์แวร์ที่ใช้แล้วเท่านั้น
Pacerier

1
@Pierier เป็นไปได้มันขึ้นอยู่กับสิ่งที่คุณใช้ distro ไม่ว่าซอฟต์แวร์จะเป็นแบบใดก็ตามอาจอยู่ใน Arch User Repository และหากไม่ใช่ซอฟต์แวร์ PKGBUILD นั้นค่อนข้างง่ายต่อการเขียน
StarlitGhost

9

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

เพียงแค่ใส่ - /usr/localและ dirs ลูกทั้งหมดของมันอยู่ใน vars env ที่เหมาะสมเช่นPATHและMANPATHและ/usr/local/lib{,64}อยู่ใน ldconfig ( /etc/ld.so.conf.d/)

/opt/OTOH ไม่ได้ - ซึ่งทั้งสองข้อได้เปรียบเมื่อต้องการหลาย ๆ เวอร์ชันหรือแพคเกจที่ขัดแย้งกันจะมีอยู่ในระบบ แต่ต้องการการจัดการสิ่งแวดล้อมบางประเภท (เช่นสิ่งแวดล้อม - โมดูลหรือการรวบรวมซอฟต์แวร์ ) และเสียเปรียบว่ามันอาจจะ "เสีย" "พื้นที่เก็บข้อมูลโดยการทำซ้ำไลบรารีที่แชร์เนื่องจากการติดตั้งในแต่ละครั้ง/optจะมีอยู่ในตัวเองอย่างสมบูรณ์

สำหรับลักษณะ/usr/localการทำงานที่ใช้ร่วมกันของมันจะถือว่าสมมติว่าไบนารีมีการติดตั้งโดยตรงกับ/usr/local/bin(และ man pages ตามความเหมาะสม/usr/local/share/man/...) มากกว่า/usr/local/app/{bin,share/man,...}เป็นต้น

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