อะไรคือข้อดีของวิธีที่ Linux จัดการไฟล์ของโปรแกรมที่ติดตั้งไว้? [ปิด]


10

ใน Windows ไดรฟ์ระบบC:มีไดเรกทอรีprogram_filesซึ่งแต่ละโปรแกรมมีไดเรกทอรีเป็นของตนเอง

ใน Linux ภายใต้/usr/และ/usr/local/มี/bin, /etc, /share, /srcฯลฯ

ดังนั้นใน windows ไฟล์ทั้งหมดของแต่ละโปรแกรมจะถูกจัดกลุ่มในไดเรกทอรีเดียวกันขณะที่ใน Linux ไฟล์ประเภทเดียวกันจากโปรแกรมทั้งหมดคือ

ฉันรู้สึกว่าวิธีที่ Windows จัดระเบียบโปรแกรมที่ติดตั้งนั้นมีเหตุผลมากกว่าทาง Linux ดังนั้นโปรแกรมที่ติดตั้งจึงจัดการได้ง่ายขึ้นด้วยตนเอง

อะไรคือข้อดีของวิธีที่ Linux จัดการไฟล์ของโปรแกรมที่ติดตั้งไว้? ขอบคุณ

ฉันมีคำถามนี้เมื่อมีปัญหาวิธีการจัดระเบียบโปรแกรมที่ติดตั้งใน $ HOME สำหรับเชลล์เพื่อค้นหาพวกเขาเมื่อเรียกใช้พวกเขา? ที่ฉันพยายามจัดระเบียบโปรแกรมของฉันใน$HOMEทางของ Windows แต่มีปัญหาบางอย่างในการระบุเส้นทางการค้นหาสำหรับโปรแกรม


9
@Randall เริ่ม " unpredictable and กระจัดกระจาย " ของคุณคือการจัดวางเหตุผลและการทำซ้ำ DLLs ของเรา
RonJohn

1
นี่คือพื้นฐานทางประวัติศาสตร์ - ส่วนใหญ่เพื่อให้สามารถติดตั้งพาร์ติชั่นดิสก์ได้หลายตัวในขณะที่สามารถบู๊ตได้โดยมีเพียงสิ่งจำเป็นเท่านั้น สถานการณ์ที่คล้ายกันคือเมื่อ PC BIOS'es เห็นเฉพาะส่วนแรกของฮาร์ดดิสก์ที่มีขนาดใหญ่มากเท่านั้นดังนั้นพาร์ติชันแยกต่างหากที่ประกอบด้วยทุกสิ่งที่จำเป็นสำหรับการบูทจะถูกวางไว้ในส่วนแรก โดยทั่วไปเรียกว่า "/ boot" วันนี้ความต้องการแซนด์บ็อกซ์และแอพที่ไม่น่าเชื่อถือส่งผลให้มีการคิดใหม่ - ดูเช่น Ubuntu snaps
Thorbjørn Ravn Andersen

9
ให้ฉันเป็นคนแรกที่ชี้ให้เห็นว่าในปัจจุบัน Windows ไม่ได้ใส่ไฟล์ทั้งหมดของแต่ละโปรแกรมไว้ในไดเรกทอรี smae นอกจาก "ไฟล์โปรแกรม" และ "ไฟล์โปรแกรม (x86)" ยังมี "Users \ <username> \ Appdata" ไดเรกทอรีของ "Local", "LocalLow" และ "Roaming" Windows ไม่เคยใช้โฟลเดอร์ "Program Files" สำหรับโปรแกรมหรือใช้สิ่งนี้ตลอดเวลาที่ผ่านมา * ระวังมีความสอดคล้องกันมากขึ้นในการจัดการไฟล์เมื่อเวลาผ่านไป
YLearn

5
@ JAB เห็นด้วยและเข้าใจสิ่งนี้ ฉันชี้ให้เห็นว่าคำสั่งโดย OP คือ "ดังนั้นใน windows ไฟล์ทั้งหมดของแต่ละโปรแกรมจะถูกจัดกลุ่มในไดเรกทอรีเดียวกัน" นั้นไม่จริง ฉันยังไม่ได้พูดคุยถึงเรื่องการลงทะเบียน Windows ซึ่งอาจถูกมองว่าเป็นการจัดเก็บการกำหนดค่าและข้อมูลอื่น ๆ เกี่ยวกับโปรแกรม Windows และไม่ได้เป็นส่วนหนึ่งของไดเรกทอรี "Program Files"
YLearn

2
Linux จัดการไฟล์ของโปรแกรมที่ติดตั้งไว้หรือไม่ ตั้งแต่เมื่อไหร่
ฮอบส์

คำตอบ:


17

ในลีนุกซ์ตำแหน่งที่แตกต่างโดยปกติเมื่อได้รับการดูแลอย่างดีจะสะท้อนตรรกะบางอย่าง เช่น.:

  • /bin มีเครื่องมือพื้นฐานที่สุด (โปรแกรม)
  • /sbin มีโปรแกรมผู้ดูแลระบบขั้นพื้นฐานที่สุด

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

/usr/binจากนั้นจะดูใน ที่นี่คุณควรพบตัวเลือกคำสั่ง (โปรแกรม) ที่ใหญ่กว่าซึ่งมักจะมีมากกว่า 1,000 คำสั่ง พวกเขาเป็นเครื่องมือมาตรฐาน แต่ไม่เป็นที่สำคัญเป็นผู้ที่อยู่ในและ/bin/sbin

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

ลองดูที่ของฉันPATH,

$ echo "$PATH" | perl -F: -anlE'$,="\n"; say @F'
/home/tomas/bin
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games

มีสถานที่หกแห่งที่มีคำสั่งที่ฉันสามารถเรียกใช้ได้โดยตรง (เช่นไม่ใช่เส้นทางของพวกเขา

  • /home/tomas/bin เป็นไดเรกทอรีส่วนตัวของฉันในโฟลเดอร์บ้านของฉันสำหรับ executables ส่วนตัวของฉัน
  • /usr/local/bin ฉันจะอธิบายแยกกันด้านล่าง
  • /usr/bin อธิบายไว้ข้างต้น
  • /bin ยังอธิบายไว้ข้างต้น
  • /usr/local/gamesเป็นการรวมกันของ/usr/local(ที่จะอธิบายด้านล่าง) และเกม
  • /usr/gamesเป็นเกม เพื่อไม่ให้ปะปนกับไฟล์ปฏิบัติการที่เป็นประโยชน์พวกมันมีที่ตั้งแยกต่างหาก

/usr/local/binตอนนี้ อันนี้ค่อนข้างลื่นและได้อธิบายไว้แล้วที่นี่: / usr / local / bin คืออะไร? . เพื่อให้เข้าใจได้คุณต้องรู้ว่าโฟลเดอร์/usrอาจถูกแชร์โดยเครื่องหลายเครื่องและติดตั้งจากตำแหน่งเน็ต คำสั่งที่ไม่จำเป็นต้องใช้ในการบูตตามที่ระบุไว้ก่อนหน้าไม่เหมือนคำสั่งเหล่านั้น/binดังนั้นตำแหน่งสามารถติดตั้งได้ในขั้นตอนต่อไปของกระบวนการบูท นอกจากนี้ยังสามารถติดตั้งในแบบอ่านอย่างเดียว /usr/local/binในทางกลับกันสำหรับโปรแกรมที่ติดตั้งในเครื่องและจำเป็นต้องเขียนใหม่ได้ ดังนั้นในขณะที่เครื่องเครือข่ายหลายคนอาจจะแบ่งปันทั่วไป/usrไดเรกทอรีหนึ่งของพวกเขาแต่ละคนจะมีของตัวเองที่ติดตั้งอยู่ภายในทั่วไป/usr/local/usr

ในที่สุดลองดูที่PATHผู้ใช้รูทของฉัน:

# echo "$PATH" | perl -F: -anlE'$,="\n"; say @F'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

มันมีสิ่งเหล่านี้:

  • /usr/local/sbinซึ่งมีคำสั่งผู้ดูแลระบบของประเภท /usr/local
  • /usr/local/binซึ่งเป็นสิ่งเดียวกันกับที่ผู้ใช้ทั่วไปสามารถใช้ /usr/localอีกครั้งประเภทของพวกเขาสามารถอธิบายได้ว่า
  • /usr/sbin เป็นเครื่องมือการบริหารที่ไม่จำเป็น
  • /usr/bin คือการจัดการที่ไม่จำเป็นและยูทิลิตี้ผู้ใช้ปกติ
  • /sbin เป็นเครื่องมือสำหรับผู้ดูแลระบบที่จำเป็น
  • /bin เป็นเครื่องมือสำหรับผู้ดูแลระบบและผู้ใช้ทั่วไป

ขอบคุณ ฉันสนใจวิธีที่คุณจัดระเบียบโปรแกรมที่จะติดตั้ง/home/tomasz/bin/ดูunix.stackexchange.com/questions/431793/…
Tim

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

4
@Keiji ผู้ขายกับการจัดการในท้องถิ่นเป็นวิธีที่ใช้กันมากที่สุด (และทั่วไป) สำหรับความแตกต่างในวันนี้ แต่ถ้าคุณดูการติดตั้ง UNIX แบบดั้งเดิม/usr-off-a-network (เทียบกับ/usr/localการเป็นอยู่ที่ดีในท้องถิ่น ) ไม่แปลก ของ.
Charles Duffy

นี่เป็นความคิดที่ไม่ดีในปี 2561
อมรา

7

ทุกวันนี้ฉันคิดว่านี่เป็นมรดกทางประวัติศาสตร์จากยูนิกซ์คลาสสิค

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

นอกจากนี้สภาพแวดล้อม UNIX ถูกพิจารณาว่าเป็นผลิตภัณฑ์สำเร็จรูป (สำหรับการเตรียมเอกสาร) ดังนั้นเส้นทางของเครื่องมือทั้งหมดจึงได้รับการแก้ไข

ประโยชน์บางอย่างจากการแก้ไขเส้นทางในวัน HDD (ฮาร์ดดิสก์ไดรฟ์) มีอยู่ในปัจจุบัน ถ้า FSH (ลำดับชั้นของระบบไฟล์) แยกพาร์ติชั่นดิสก์แยกจากกันและวางพาร์ติชันด้วยไบนารีและไลบรารีใกล้เซกเตอร์หลักของ HDD จากนั้นเวลาของการเริ่มโปรแกรมจะเร็วขึ้นเล็กน้อย


6
มีข้อได้เปรียบที่น่าสนใจที่ยังคงมีประโยชน์ในปัจจุบัน การรักษาไบนารีใน/usr/binไฟล์ข้อมูลแบบคงที่/usr/shareและไฟล์ที่สามารถแก้ไขได้/varหรือ/usr/varหมายความว่ามาตรการความปลอดภัยสามารถใช้เพื่อบังคับใช้ว่าไม่มีสิ่งใดในshareหรือvarสามารถใช้งานได้ (โดยใช้noexecแฟล็กสำหรับการเมานต์) ไม่varสามารถแก้ไขสิ่งใดภายนอก(ในระบบที่ใช้dm_verityหรือมาตรการที่คล้ายกันเพื่อสร้างสื่อที่มีลายเซ็นและอ่านได้อย่างเดียว) ฯลฯ
Charles Duffy

3

สิ่งที่คุณเห็นว่าเป็นระบบ Unix ที่ทันสมัยไม่ได้เป็นแบบดั้งเดิมจริงๆ

โดยปกติจะมีขั้นต่ำ/และ/usrมีลำดับชั้นที่มีเพียงแค่ระบบสาธารณูปโภคจากนั้นโปรแกรมจะถูกติดตั้งแยกต่างหากในไดเรกทอรีย่อย/usr/localและจากนั้นให้ใช้งานได้โดยการสร้างลิงก์สัญลักษณ์

การตั้งค่าทั่วไปสำหรับซอฟต์แวร์ GNU คือการรวบรวมและติดตั้ง

./configure
make
make install prefix=/usr/local/DIR/program-1
cd /usr/local/DIR
stow program-1

ยูทิลิตี้GNU Stowสร้างลิงก์สัญลักษณ์เพื่อให้ซอฟต์แวร์มีอยู่ในเส้นทางมาตรฐานโดยไม่ต้องเพิ่มไดเรกทอรีใด ๆ ลงในตัวแปร PATH (เช่นเดียวกับ Windows และ cruft มีแนวโน้มที่จะสะสมอยู่ที่นั่น)

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

หากคุณต้องการติดตั้งซอฟต์แวร์ลงในโฮมไดเร็กตอรี่ของคุณฉันขอแนะนำให้คุณใช้ GNU stow เช่นกัน - สิ่งนี้จะช่วยให้คุณแยกโปรแกรมของคุณออกจากกันซึ่งเหมาะสมถ้าคุณไม่ได้ใช้โปรแกรมจัดการแพ็คเกจ

การตั้งค่าดั้งเดิมของฉันสำหรับที่เป็นหนึ่งในไดเรกทอรี~/software/DIRที่ผมติดตั้งโปรแกรมลงแล้วใช้ภายใน Stow DIRการสร้าง~/software/bin, ~/software/shareฯลฯ ซึ่งหมายความว่าฉันมีเพียงแค่เพิ่ม~/software/binให้กับตัวแปร PATH ที่จะได้รับการติดตั้งซอฟต์แวร์ของฉันทั้งหมด

ใช้:

./configure --prefix=~/software
make
make install prefix=~/software/DIR/program-1
cd ~/software/DIR
stow program-1

เพื่อติดตั้งถ้าโปรแกรมปฏิบัติตามอนุสัญญา GNU


2

ดูเหมือนว่าคุณกำลังพูดถึงสไตล์ของการแบ่งไฟล์แต่ละไฟล์ตามวัตถุประสงค์ ( /usr/binสำหรับไฟล์ปฏิบัติการ/usr/libสำหรับไลบรารี) แทนที่จะเป็นด้วยแอปพลิเคชั่นแพ็กเกจ (คอมไพเลอร์ C ++ ในคอมไพเลอร์หนึ่งโปรแกรมแก้ไขรูปภาพในอีกไฟล์หนึ่ง) ในขณะที่ระบบ Unix เหตุผลส่วนใหญ่ในประวัติศาสตร์นี้ยังมีกองกำลังในปัจจุบันที่มีแนวโน้มที่จะทำให้ระบบที่คล้าย Unix พึ่งพาสิ่งนี้: ผู้จัดการแพ็คเกจที่จัดการโปรแกรมส่วนใหญ่ในระบบ

ใน Windows ทั้งในอดีตและปัจจุบันยังคงค่อนข้างมากแอปพลิเคชันมีหน้าที่รับผิดชอบในการจัดหาตัวติดตั้งของตัวเองและโดยเฉพาะอย่างยิ่งตัวถอนการติดตั้งและแม้ตอนนี้บ่อยครั้งไม่ต้องลงทะเบียนตัวเอง ในสถานการณ์เช่นนี้โดยทั่วไปแล้วแอปพลิเคชันจะมีไดเรกทอรี "ของตัวเอง" ที่ดีที่สุดสำหรับไฟล์มากที่สุด สิ่งนี้จะช่วยหลีกเลี่ยงความขัดแย้งกับแอปพลิเคชั่นอื่น ๆ แม้ว่าจะไม่ได้ผลเสมอไป (โดยเฉพาะในกรณีของDLLs )

ในทางตรงกันข้ามระบบ Unix นั้นมีมาตั้งแต่ยุค 90 โดยทั่วไปแต่ละคนมีผู้จัดการแพคเกจเดียวที่ได้รับการยอมรับและกลุ่มที่ให้ซอฟต์แวร์ที่ใช้กันทั่วไปจำนวนมากผ่านตัวจัดการแพ็คเกจนี้ (ผู้จัดการแพคเกจอย่างเป็นทางการสำหรับ Unices ต่างๆรวมyumและaptสำหรับระบบลินุกซ์pkgsrcสำหรับ NetBSD และportsสำหรับ FreeBSD. ระบบ Unix บ่อยครั้งในเชิงพาณิชย์ยังท้ายด้วยแพคเกจผู้จัดการทางการ แต่ได้รับการยอมรับอย่างกว้างขวางว่าเป็นกันเช่นbrewสำหรับ MacOS.)

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

ที่กล่าวว่ามีประเพณีที่ยาวนานของการติดตั้ง "แยกไดเรกทอรีต่อแอปพลิเคชัน" ใน Unix เช่นกันมักจะอยู่ภายใต้/optไดเรกทอรี

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