ทางเลือกของ FHS คืออะไร?


32

ฉันเป็นผู้ใช้ลีนุกซ์มานานกว่า 15 ปีแล้ว แต่สิ่งหนึ่งที่ฉันเกลียดด้วยความหลงใหลคือโครงสร้างไดเรกทอรีที่ได้รับคำสั่ง ฉันไม่ชอบที่/usr/binเป็นพื้นทุ่มตลาดสำหรับไบนารีหรือ libs ใน/usr/lib, /usr/lib32, /usr/libx32, /lib, /lib32ฯลฯ ... สิ่งที่สุ่มใน/usr/shareฯลฯ มันเป็นใบ้และทำให้เกิดความสับสน แต่บางคนก็ชอบและรสนิยมต่างกัน

ฉันต้องการโครงสร้างไดเรกทอรีที่แยกแต่ละแพ็คเกจ ลองนึกภาพถ้า Dragon Media Player มีโครงสร้างเป็นของตัวเอง:

/software/dragon
/software/dragon/bin/x86/dragon
/software/dragon/doc/README
/software/dragon/doc/copyright
/software/dragon/lib/x86/libdragon.so

หรือ:

/software/zlib/include/zlib.h
/software/zlib/lib/1.2.8/x86/libz.so
/software/zlib/lib/1.2.8/x64/libz.so
/software/zlib/doc/examples/...
/software/zlib/man/...

คุณได้รับคะแนน ตัวเลือกของฉันคืออะไร? มีลินุกซ์ distro ที่ใช้บางอย่างเช่นโครงร่างของฉันหรือไม่? distro บางอย่างสามารถปรับเปลี่ยนให้ทำงานได้ตามที่ต้องการ (Gentoo ??) หรือฉันต้องการ LFS หรือไม่? มีงานศิลปะก่อนหน้านี้ในบริเวณนี้หรือไม่? เช่นเดียวกับสิ่งตีพิมพ์ในกรณีที่โครงการมีความเป็นไปได้หรือไม่สามารถทำได้?

ไม่มองหา OS X. :) แต่แรงบันดาลใจของ OS Xก็โอเคโดยสิ้นเชิง

แก้ไข : ฉันมีความคิดไม่ว่าPATH, LD_LIBRARY_PATHและตัวแปรสภาพแวดล้อมอื่น ๆ ที่ขึ้นอยู่กับชุดเล็ก ๆ ของเส้นทางที่ควรจะทำงานออก ฉันคิดว่าถ้าฉันมีโปรแกรมแก้ไข KDE ติดตั้งเคทอยู่/software/kate/bin/x86/bin/kateแล้วฉันก็ไม่ต้องพิมพ์พา ธ เต็มไปยังไบนารี่เพื่อเริ่มต้น มันควรทำงานอย่างไรกับไลบรารีและการdlopenโทรแบบไดนามิกฉันไม่รู้ แต่มันไม่สามารถเป็นปัญหาทางวิศวกรรมที่แก้ไม่ตก


3
เส้นทางการค้นหาของคุณจะเป็นอย่างไรถ้าไบนารีทั้งหมดของคุณถูกซ่อนอยู่ทุกที่ คุณจะอัปเดตพา ธ ในกระบวนการ / เซสชันที่กำลังรันอยู่เมื่อคุณติดตั้งซอฟต์แวร์หลังจากเริ่มต้นได้อย่างไร สิ่งที่มาตรการรักษาความปลอดภัยของคุณจะป้องกันผู้ใช้โดยเฉลี่ยจากการจัดการเพื่อแก้ไขไบนารีในบางสาขา bin ชัดเจน แน่นอนคุณหลวมความสะดวกสบายของอาจทำให้ / usr Parition อ่านอย่างเดียวอาจจะเป็นเรื่องธรรมดาสุทธิ-mount สำหรับจำนวนมากของเครื่อง ...
ฮาเจนฟอน Eitzen

1
@HagenvonEitzen แต่ (โดยใช้รูปแบบการตั้งชื่อและตัวอย่างของ OP) คุณสามารถสร้างแบบ/softwareอ่านอย่างเดียวแทนเพื่อผลประโยชน์และข้อเสียเดียวกับการ/usrอ่านอย่างเดียวใน FHS
CVn

ไลบรารีไดนามิกสามารถใช้ชื่อการติดตั้งหรือ RPATH
asmeurer

1
คำถามของคุณทำให้ผมนึกถึงcr.yp.to/slashpackage.html ไม่แน่ใจว่าสิ่งนี้เกี่ยวข้องกัน
bli

คำตอบ:


50

ข้อแรกข้อจำกัดความรับผิดชอบที่ขัดแย้งทางผลประโยชน์ล่วงหน้า: ฉันเป็นผู้พัฒนา GoboLinux มาเป็นเวลานาน

ประการที่สองการอ้างสิทธิ์ในหน้าแรกของความเชี่ยวชาญด้านโดเมน: ฉันเป็นนักพัฒนา GoboLinux มาเป็นเวลานาน

มีโครงสร้างที่แตกต่างกันเล็กน้อยในการใช้งานในปัจจุบัน GoboLinuxมีหนึ่งและเครื่องมือเช่นGNU Stow , Homebrewฯลฯ ใช้สิ่งที่ค่อนข้างคล้ายกัน (ส่วนใหญ่สำหรับโปรแกรมผู้ใช้) NixOSยังใช้ลำดับชั้นที่ไม่เป็นมาตรฐานสำหรับโปรแกรมและปรัชญาของชีวิต นอกจากนี้ยังเป็นการทดลอง LFS ทั่วไปที่สมเหตุสมผล

ฉันจะอธิบายทั้งหมดเหล่านั้นจากนั้นแสดงความคิดเห็นจากประสบการณ์เกี่ยวกับวิธีการทำงานในทางปฏิบัติ ("ความเป็นไปได้") คำตอบสั้น ๆ ว่าใช่มันเป็นไปได้ แต่คุณต้องไปจริงๆอยากให้มัน


GoboLinux

GoboLinux มีโครงสร้างคล้ายกับสิ่งที่คุณอธิบาย ซอฟต์แวร์ถูกติดตั้งภายใต้/Programs: /Programs/ZSH/5.0.8บรรจุไฟล์ทั้งหมดที่เป็นของ ZSH 5.0.8 ในไดเร็กทอรีปกติbin/ lib/ ... เครื่องมือระบบสร้าง symlink ไปยังไฟล์เหล่านั้นภายใต้/System/Linksลำดับชั้นซึ่งแม็พกับ/usr¹ PATHตัวแปรมีเพียงไดเรกทอรีปฏิบัติการแบบครบวงจรที่เดียวและLD_LIBRARY_PATHไม่ได้ใช้ ซอฟต์แวร์หลายเวอร์ชันสามารถอยู่ร่วมกันได้ในคราวเดียว แต่bin/zshจะมีการเชื่อมโยงไฟล์เพียงหนึ่งไฟล์โดยใช้ชื่อที่กำหนด ( ) คุณสามารถเข้าถึงผู้อื่นได้โดยใช้เส้นทางเต็ม

ชุดของ symlink ที่เข้ากันได้ก็มีอยู่เช่นกัน/binและ/usr/binแมปไปยังไดเรกทอรี executables รวมและอื่น ๆ สิ่งนี้ทำให้ชีวิตของซอฟต์แวร์ในเวลาทำงานง่ายขึ้น GoboHide แพทช์เคอร์เนลช่วยให้ลิงก์ความเข้ากันได้เหล่านั้นถูกซ่อนจากรายชื่อไฟล์ (แต่ยังสามารถผ่านได้)

ในทางตรงกันข้ามคำตอบอื่นคุณไม่จำเป็นต้องแก้ไขรหัสเคอร์เนล: GoboHide เป็นเครื่องสำอางอย่างหมดจดและเคอร์เนลไม่ได้ขึ้นอยู่กับเส้นทางของพื้นที่ผู้ใช้โดยทั่วไป² GoboLinux มีระบบเริ่มต้น bespoke แต่ไม่จำเป็นต้องทำเช่นนี้

สโลแกนนั้นมักจะเป็น "ระบบไฟล์คือตัวจัดการแพ็กเกจ" แต่มีเครื่องมือการจัดการแพ็กเกจตามปกติในระบบ คุณสามารถทำทุกอย่างโดยใช้cp, rmและlnแม้ว่า

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

สิ่งพิมพ์

มี "สิ่งพิมพ์" สองสามฉบับ ฉันให้งานนำเสนอที่linux.conf.au 2010บนระบบโดยรวมซึ่งครอบคลุมทุกอย่างโดยทั่วไปซึ่งมีอยู่ในวิดีโอ: ogv mp4 (บนกระจก Linux Australia ของคุณ) ฉันยังเขียนบันทึกย่อของฉันเป็นร้อยแก้ว นอกจากนี้ยังมีเอกสารเก่า ๆ สองสามฉบับรวมถึง " I not not clueless " ที่มีชื่อเสียงบนเว็บไซต์ GoboLinuxซึ่งระบุถึงการคัดค้านและปัญหา ฉันคิดว่าวันนี้พวกเราทุกคนไม่พอใจกันมากขึ้นและฉันสงสัยว่าการเปิดตัวในอนาคตจะนำมาใช้/usrเป็นตำแหน่งพื้นฐานสำหรับการเชื่อมโยง


NixOS

NixOS/nix/storeทำให้แต่ละโปรแกรมที่ติดตั้งลงในไดเรกทอรีของตัวเองภายใต้ ไดเรกทอรีเหล่านั้นมีชื่อคล้าย/nix/store/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-firefox-3.5.4/- มีแฮชการเข้ารหัสที่แสดงถึงชุดการพึ่งพาทั้งหมดและการกำหนดค่าที่นำไปสู่โปรแกรมนั้น ภายในไดเรกทอรีนั้นเป็นไฟล์ที่เกี่ยวข้องทั้งหมดโดยมีตำแหน่งปกติมากกว่าหรือน้อยกว่าในเครื่อง

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


LFS

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

ฉันรู้สึกเหมือนมีคำแนะนำ LFSเกี่ยวกับสิ่งนั้น ณ จุดหนึ่ง แต่ฉันไม่สามารถหาได้ในตอนนี้


ในความเป็นไปได้

สิ่งที่เกี่ยวกับ FHS ก็คือมันเป็นมาตรฐานมันเป็นเรื่องธรรมดามากและมันสะท้อนให้เห็นถึงการใช้งานที่มีอยู่ในปัจจุบันในเวลาที่เขียน ผู้ใช้ส่วนใหญ่จะไม่อยู่ในระบบที่ไม่เป็นไปตามเค้าโครงดังกล่าว ผลที่ตามมาก็คือซอฟต์แวร์จำนวนมากมีการพึ่งพาที่แฝงอยู่ซึ่งไม่มีใครรู้ตัว

สคริปต์ทั้งหมดที่มี#!/bin/bash? ไม่ดีถ้าคุณไม่มี Bash ที่นั่น นั่นคือเหตุผลที่ GoboLinux มี symlinks ที่เข้ากันได้ทั้งหมด เป็นเพียงการปฏิบัติ ซอฟต์แวร์จำนวนมากล้มเหลวในการทำงานไม่ว่าจะเป็นเวลาสร้างหรือขณะทำงานภายใต้รูปแบบที่ไม่ได้มาตรฐานและจากนั้นจะต้องทำการปะแก้ไขเพื่อแก้ไข

โปรแกรม Autoconf พื้นฐานของคุณมักจะติดตั้งตัวเองอย่างมีความสุขทุกที่ที่คุณบอกมันและมันค่อนข้างง่ายที่จะทำให้กระบวนการส่งผ่านถูกต้อง--prefixโดยอัตโนมัติ ระบบการสร้างอื่น ๆ อาจไม่ได้ดีเสมอไปไม่ว่าจะโดยการอบในลำดับชั้นหรือโดยผู้เขียนชั้นนำเพื่อเขียนการกำหนดค่าที่ไม่ใช่แบบพกพา CMake เป็นผู้กระทำผิดที่สำคัญในประเภทหลัง นั่นหมายความว่าถ้าคุณต้องการมีชีวิตอยู่ในโลกนี้คุณจะต้องเตรียมพร้อมที่จะทำงานมากขึ้นในระบบสร้างของคนอื่น มันเป็นเรื่องยุ่งยากที่จะต้องแก้ไขไฟล์ที่สร้างขึ้นแบบไดนามิกในระหว่างการรวบรวม

รันไทม์เป็นอีกเรื่องหนึ่งอีกครั้ง หลายโปรแกรมมีข้อสันนิษฐานว่าไฟล์ของพวกเขาเองหรือไฟล์ของคนอื่นนั้นมีความเกี่ยวข้องกับพวกเขาหรืออย่างแน่นอน เมื่อคุณเริ่มใช้ symlink เพื่อแสดงมุมมองที่สอดคล้องกันโปรแกรมจำนวนมากมีข้อบกพร่องในการจัดการกับพวกเขา (หรือบางครั้งพฤติกรรมที่ถูกต้องที่ไม่สามารถช่วยเหลือคุณได้) ยกตัวอย่างเช่นเครื่องมือfoobarอาจคาดหวังที่จะหาต่อไปปฏิบัติการไปหรือในbaz ../sbinขึ้นอยู่กับว่ามันอ่าน symlink หรือไม่สิ่งเหล่านั้นอาจเป็นสองที่ที่แตกต่างกันและทั้งสองอย่างนั้นอาจไม่ถูกต้อง

ปัญหารวมคือ/usr/shareไดเรกทอรี แน่นอนว่าสำหรับไฟล์ที่แชร์ แต่เมื่อคุณใส่ทุกโปรแกรมไว้ในคำนำหน้าของตัวเองมันจะไม่ถูกแชร์อีกต่อไป สิ่งนี้นำไปสู่โปรแกรมที่ไม่สามารถหาไอคอนมาตรฐานและสิ่งที่คล้ายกันได้ GoboLinux จัดการกับสิ่งนี้ในวิธีที่น่าเกลียดมาก: ณ เวลาที่สร้าง$prefix/shareเป็น symlink $prefix/Sharedและหลังจากสร้างลิงค์แล้วชี้ไปที่shareไดเรกทอรีทั่วโลกแทน ตอนนี้ใช้ sandboxing เวลาคอมไพล์และการเคลื่อนย้ายไฟล์เพื่อจัดการกับshare(และไดเร็กทอรีอื่น ๆ ) แต่ข้อผิดพลาดรันไทม์จากลิงก์การอ่านอาจยังคงเป็นปัญหา

สวีทของหลายโปรแกรมเป็นปัญหาอื่น GoboLinux ไม่เคยได้รับ GNOME ทำงานอย่างเต็มที่และฉันไม่เชื่อว่า NixOS ก็มีเช่นกันเพราะรูปแบบการพึ่งพาซึ่งกันและกันได้รับการอบจึงเป็นเพียงว่ายากที่จะรักษาพวกเขาทั้งหมด

ดังนั้นใช่เป็นไปได้แต่:

  • มีงานจำนวนมากที่เกี่ยวข้องในการทำสิ่งต่างๆ
  • ซอฟต์แวร์บางตัวอาจไม่ทำงาน
  • ผู้คนจะมองคุณตลก

สิ่งเหล่านี้อาจเป็นปัญหาสำหรับคุณหรือไม่ก็ได้


¹เวอร์ชัน 14.01 ใช้ซึ่งแผนที่โดยตรง/System/Index /usrฉันสงสัยว่ารุ่นในอนาคตอาจวางลำดับชั้นของลิงค์ / ดัชนีและใช้/usrทั่วกระดาน

²มันจำเป็นต้อง/bin/shมีอยู่โดยค่าเริ่มต้น


1
คำตอบที่ดี! ผู้เขียนซอฟต์แวร์ส่วนใหญ่เปิดรับแพทช์เพื่อให้ทำงานใน gobolinux หรือเป็นศัตรูกับมันได้หรือไม่?
Björn Lindqvist

เวลาส่วนใหญ่แพทช์อัปสตรีมไปได้ด้วยดี แต่บางครั้งผู้ดูแลอาจดูไม่พอใจกับการพึ่งพา FHS ฉันยังจำผู้ดูแลระบบ KDE ได้ยืนยันว่าการคัดลอก symlink ไปยังไฟล์เทมเพลตที่แก้ไขไม่ได้แทนการยกเลิกการลงทะเบียนเพื่อคัดลอกไฟล์นั้นโดยการออกแบบ แพตช์จำนวนมากมาจากเส้นทางที่มีการเข้ารหัสยากไปยังเส้นทางอื่นมากกว่าการแก้ไขที่เหมาะสมดังนั้นจึงไม่คุ้มค่าที่จะส่งอัปสตรีม
Michael Homer

ดังนั้นหากคุณพบและให้เงินทุน (ตามเวลาหรือเงิน) การสร้าง / การฟอร์กกิ้ง / การแพตช์ของซอฟต์แวร์ทั้งหมดที่คุณต้องการ / ต้องการ (เอ๊ะอย่างที่ Apple / Microsoft ทำ / ดูเหมือนจะทำ) แล้วล่ะ? นั่นเป็นสิ่งที่ฉันฟัง ฉันสนใจในนวัตกรรมที่ทำลายบรรทัดฐานที่ไม่เป็นศัตรูกับเดสก์ท็อปแบบนี้
ThorSummoner

2
@ThorSummoner: การกระจายส่วนใหญ่แก้ไขซอฟต์แวร์ทั้งหมดของพวกเขาอย่างหนัก ว่า "เงินทุน" เป็นจริงแล้ว แพตช์เหล่านั้นเป็นการผสมผสานระหว่างหน้าที่การใช้งานและใช่การเปลี่ยนแปลงพา ธ เพื่อให้ตรงกับลักษณะเฉพาะของการกระจาย แน่นอนว่าในฐานะผู้ใช้ปลายทางคุณไม่ได้สังเกตเห็นจริง ๆ แต่มี - มีแรงงานจำนวนมากที่อยู่เบื้องหลังการแจกจ่ายซึ่งง่ายต่อการรับสิทธิ์ โดยขนาดใหญ่คุณไม่จำเป็นต้องแก้ไขสิ่งต่าง ๆ - เพียง 13% ของสูตร GoboLinux ที่เกี่ยวข้องกับการแก้ไขใด ๆ ตัวอย่างเช่นซึ่งจริง ๆ แล้วต่ำกว่าพูด Debian - แม้ว่ามันจะเป็นการเรียงลำดับที่น่ารำคาญเมื่อต้องทำ จำเป็น.
Michael Homer

6

ทั้งGoboLinux (ซึ่ง F.sb พูดถึง) และGNU guixคือการแจกแจงที่ใช้โครงสร้างไดเรกทอรีต่อแพ็คเกจพร้อมกับ symlinks เพื่อชี้ไปยังรุ่น "ปัจจุบัน" ของไบนารี

GoboLinux น่าจะเป็นทางออกที่ดีกว่าถ้าคุณต้องการระบบที่มั่นคง GNU guix กล่าวอย่างชัดเจนว่ายังไม่พร้อมสำหรับการผลิต GoboLinux มีมานานหลายปีแล้ว ฉันไม่เคยลองด้วยตัวเอง


5

ตรวจสอบGoboLinux

หากคุณต้องการให้โครงสร้างไดเรกทอรีเปลี่ยนแปลงคุณควรเปลี่ยนรหัสเคอร์เนลกระบวนการบู๊ต runlevels ไดเรกทอรีตามไฟล์ rc และตัวจัดการแพ็คเกจจากนั้นโครงสร้างไดเรกทอรี


5

Linux FHS ขึ้นอยู่กับสิ่งที่ Sun และ บริษัท UNIX อื่น ๆ ตัดสินใจในช่วงปลายทศวรรษ 1980

การเปลี่ยนแปลงที่สำคัญในเวลานั้นคือการละทิ้ง/usr/local/และแนะนำ/opt// { bin! lib! man! ... }

หากคุณกำลังมองหาสาเหตุที่ทำให้ / usr / bin วันนี้ถูกใช้เป็นพื้นที่ทิ้งขยะฉันเชื่อว่า GNOME เป็นหนึ่งในโครงการที่มีความรับผิดชอบมากที่สุด

เกิดอะไรขึ้นกับไลบรารี 32 บิตเทียบกับ 64 บิตดูเหมือนว่าเกิดจาก FHS

Solaris แนะนำไดเรกทอรีย่อยแพลตฟอร์มที่เฉพาะเจาะจงในและ/lib /usr/bin /usr/libสิ่งที่คุณปรารถนาคือดวงอาทิตย์ที่ปรับปรุงแนวคิดพื้นฐานจากปี 1988


ฉันไม่เห็นความหมายของคุณโดยการพูดว่า "ละทิ้ง / usr / local" FHS กล่าวถึงเฉพาะ / usr / localเช่นเดียวกับ/ เลือก
CVn

2
FHS ดั้งเดิมที่พัฒนาโดย Sun, HP, IBM, AT&T, SGI แน่นอนได้ลบระบบ / usr / local ที่ไม่มีระบบและมีปัญหา ฉันไม่รู้ว่าทำไมคนลินุกซ์แนะนำความผิดพลาดนั้นอีกครั้ง
schily

2
"ความปรารถนาของคุณคือวิธีที่ Sun ปรับปรุงแนวคิดพื้นฐานจาก 1988" ฉันไม่เข้าใจประโยคนี้
Faheem Mitha

4

ถ้าแพคเกจทุกคนมีส่วนหนึ่งของตัวเองของระบบไฟล์ที่คุณจะต้องมีขนาดใหญ่มากและตัวแปรสภาพแวดล้อมเทอะทะPATH, LD_LIBRARY_PATHและที่คล้ายกัน

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

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