"ทุกอย่างเป็นไฟล์" เป็นบิตกะล่อน "ทุกสิ่งปรากฏขึ้นที่ใดที่หนึ่งในระบบไฟล์ " ใกล้กับเครื่องหมายและยิ่งกว่านั้นมันยิ่งกว่าอุดมคติของกฎหมายการออกแบบระบบ
ตัวอย่างเช่นซ็อกเก็ตโดเมน Unixไม่ใช่ไฟล์ แต่จะปรากฏในระบบไฟล์ คุณสามารถls -l
ซ็อกเก็ตโดเมนเพื่อแสดงคุณสมบัติcat
ข้อมูลจาก / หนึ่งแก้ไขการควบคุมการเข้าถึงผ่านchmod
ฯลฯ
แต่ถึงแม้ว่าซ็อกเก็ตเครือข่าย TCP / IPปกติจะถูกสร้างและจัดการกับBSDระบบซ็อกเก็ตเดียวกันเรียกว่าเป็นซ็อกเก็ตโดเมน Unix, ซ็อกเก็ต TCP / IP ไม่ปรากฏขึ้นในระบบไฟล์¹แม้ว่าจะไม่มีเหตุผลที่ดีโดยเฉพาะอย่างยิ่ง เป็นจริง
ตัวอย่างของวัตถุที่ไม่ใช่ไฟล์ที่ปรากฏในระบบแฟ้มก็คือลินุกซ์/proc
ระบบแฟ้ม คุณลักษณะนี้แสดงรายละเอียดจำนวนมากเกี่ยวกับการดำเนินการรันไทม์ของเคอร์เนลไปยังพื้นที่ผู้ใช้ซึ่งส่วนใหญ่เป็นไฟล์ข้อความธรรมดาเสมือน /proc
รายการจำนวนมากเป็นแบบอ่านอย่างเดียว แต่มีจำนวนมากที่/proc
สามารถเขียนได้ดังนั้นคุณสามารถเปลี่ยนวิธีที่ระบบทำงานโดยใช้โปรแกรมใด ๆ ที่สามารถแก้ไขไฟล์ได้ อนิจจาที่นี่อีกครั้งเรามีความไม่เท่าเทียมกัน: ประเภท BSD Unixes โดยทั่วไปทำงานโดยไม่ใช้/proc
และ System V Unixes เปิดเผยผ่านทางน้อย/proc
กว่า Linux
ฉันไม่สามารถเปรียบเทียบได้กับ MS Windows
อันดับแรกความเชื่อมั่นส่วนใหญ่ที่คุณสามารถพบได้ทั่วไปและในหนังสือเกี่ยวกับ Unix คือทั้งหมดที่เกี่ยวกับไฟล์ I / O และ Windows จะ "เสีย" ในเรื่องนี้ล้าสมัย Windows NT ได้แก้ไขสิ่งนี้มากมาย
Windows รุ่นที่ทันสมัยมีระบบ I / O แบบครบวงจรเช่นเดียวกับ Unix ดังนั้นคุณสามารถอ่านข้อมูลเครือข่ายจากซ็อกเก็ต TCP / IP ผ่านReadFile()
แทน Windows Sockets API เฉพาะWSARecv()
หากคุณต้องการ วิธีนี้สอดคล้องกับวิธี Unixอย่างแท้จริงซึ่งคุณสามารถอ่านจากซ็อกเก็ตเครือข่ายด้วยการread(2)
เรียกระบบ Unix ทั่วไปหรือการโทรเฉพาะซ็อกเก็ตrecv(2)
²
อย่างไรก็ตาม Windows ยังคงล้มเหลวในการนำแนวคิดนี้ไปสู่ระดับเดียวกับ Unix แม้แต่ที่นี่ในปี 2018 มีหลายพื้นที่ของสถาปัตยกรรม Windows ที่ไม่สามารถเข้าถึงได้ผ่านระบบไฟล์หรือไม่สามารถดูได้เหมือนไฟล์ ตัวอย่างบางส่วน:
ไดร์เวอร์
ระบบย่อยไดรเวอร์ของ Windows นั้นมีความสมบูรณ์และทรงพลังเหมือนกับของ Unix แต่หากต้องการเขียนโปรแกรมเพื่อควบคุมไดรเวอร์โดยทั่วไปคุณต้องใช้Windows Driver Kitซึ่งหมายถึงการเขียนรหัส C หรือ. NET
บน Unix type OSes คุณสามารถทำสิ่งต่างๆมากมายให้กับไดรเวอร์จากบรรทัดคำสั่ง คุณเกือบจะทำสิ่งนี้เสร็จแล้วหากเพียงเปลี่ยนเส้นทางไปยังเอาต์พุตที่ไม่ต้องการแล้ว/dev/null
เท่านั้น
การสื่อสารระหว่างโปรแกรม
โปรแกรม Windows ไม่สามารถสื่อสารระหว่างกันได้อย่างง่ายดาย
โปรแกรมบรรทัดคำสั่ง Unix สื่อสารได้อย่างง่ายดายผ่านสตรีมข้อความและไพพ์ โปรแกรม GUI มักจะถูกสร้างขึ้นบนโปรแกรมบรรทัดคำสั่งหรือส่งออกอินเตอร์เฟสคำสั่งแบบข้อความเพื่อให้กลไกการสื่อสารแบบข้อความที่ใช้งานง่ายสามารถทำงานร่วมกับโปรแกรม GUI ได้เช่นกัน
รีจิสทรี
Unix นั้นไม่เทียบเท่ารีจิสทรีของ Windows โดยตรง ข้อมูลเดียวกันจะกระจายผ่านระบบแฟ้มที่มากที่สุดของมันใน/etc
, และ/proc
/sys
หากคุณไม่เห็นว่าไดรเวอร์ไพพ์และคำตอบของ Unix ในรีจิสตรี Windows มีส่วนเกี่ยวข้องกับ "ทุกอย่างเป็นไฟล์" อ่านต่อ
ปรัชญา "ทุกอย่างเป็นไฟล์" สร้างความแตกต่างได้อย่างไรที่นี่
ฉันจะอธิบายเรื่องนี้โดยการขยายจุดสามจุดด้านบนอย่างละเอียด
คำตอบยาวตอนที่ 1: ไดรฟ์เทียบกับไฟล์อุปกรณ์
สมมติว่าเครื่องอ่าน CF card ของคุณปรากฏขึ้นE:
ภายใต้ Windows และ/dev/sdc
Linux มีความแตกต่างในทางปฏิบัติอะไรบ้าง?
มันไม่ได้เป็นเพียงความแตกต่างของไวยากรณ์เล็กน้อย
บน Linux ฉันสามารถบอกว่าdd if=/dev/zero of=/dev/sdc
เขียนทับเนื้อหาของ/dev/sdc
ด้วยศูนย์
ลองคิดดูว่ามันมีความหมายเป็นอย่างไร ที่นี่ฉันมีโปรแกรมพื้นที่ผู้ใช้ปกติ ( dd(1)
) ที่ฉันขอให้อ่านข้อมูลจากอุปกรณ์เสมือน ( /dev/zero
) และเขียนสิ่งที่อ่านไปยังอุปกรณ์ทางกายภาพจริง ( /dev/sdc
) ผ่านระบบไฟล์ Unix dd
ไม่รู้ว่ามันกำลังอ่านจากและเขียนไปยังอุปกรณ์พิเศษ มันจะทำงานกับไฟล์ปกติเช่นกันหรือรวมกันของอุปกรณ์และไฟล์ตามที่เราจะเห็นด้านล่าง
ไม่มีวิธีง่ายๆในการทำให้E:
ไดรฟ์เป็นศูนย์ใน Windows เนื่องจาก Windows สร้างความแตกต่างระหว่างไฟล์และไดรฟ์ดังนั้นคุณจึงไม่สามารถใช้คำสั่งเดียวกันเพื่อจัดการกับพวกเขา ที่ใกล้เคียงที่สุดคุณจะได้รับคือการทำรูปแบบดิสก์โดยไม่มีตัวเลือก Quick Format ซึ่งเป็นศูนย์ส่วนใหญ่ของเนื้อหาไดรฟ์ แต่จากนั้นเขียนระบบไฟล์ใหม่ที่ด้านบนของมัน ถ้าฉันไม่ต้องการระบบไฟล์ใหม่ล่ะ? ถ้าฉันต้องการให้ดิสก์เต็มโดยไม่มีอะไรเลยนอกจากเป็นศูนย์
E:
ขอให้เป็นคนใจกว้างและบอกว่าเราจริงๆไม่ต้องการระบบแฟ้มใหม่สดบน ในการทำเช่นนั้นในโปรแกรมบน Windows ฉันต้องเรียก API การฟอร์แมตแบบพิเศษบน Linux คุณไม่จำเป็นต้องเขียนโปรแกรมเพื่อเข้าถึงฟังก์ชั่น "ฟอร์แมตดิสก์" ของระบบปฏิบัติการ คุณเพียงแค่เรียกใช้โปรแกรมผู้ใช้พื้นที่ที่เหมาะสมกับชนิดของระบบแฟ้มที่คุณต้องการที่จะสร้าง: mkfs.ext4
, mkfs.xfs
หรือสิ่งที่มีคุณ โปรแกรมเหล่านี้จะเขียนระบบไฟล์ลงในไฟล์หรือ/dev
โหนดที่คุณผ่าน
เนื่องจากmkfs
โปรแกรมประเภทบนระบบ Unixy ทำงานกับไฟล์โดยไม่สร้างความแตกต่างระหว่างอุปกรณ์และไฟล์ปกตินั่นหมายความว่าฉันสามารถสร้างระบบไฟล์ ext4ภายในไฟล์ปกติบนกล่อง Linux ของฉัน:
$ dd if=/dev/zero of=myfs bs=1k count=1k
$ mkfs.ext4 -F myfs
ที่แท้จริงสร้างภาพดิสก์ 1 myfs
เอ็มไอในไดเรกทอรีปัจจุบันเรียกว่า ฉันสามารถเมานต์ได้เหมือนเป็นระบบไฟล์ภายนอกอื่น ๆ :
$ mkdir mountpoint
$ sudo mount -o loop myfs mountpoint
$ grep $USER /etc/passwd > mountpoint/my-passwd-entry
$ sudo umount mountpoint
ตอนนี้ฉันมีดิสก์อิมเมจ ext4 พร้อมไฟล์ที่เรียกว่าmy-passwd-entry
อยู่ในนั้นซึ่งมี/etc/passwd
รายการของผู้ใช้ของฉัน
หากต้องการฉันสามารถระเบิดภาพนั้นลงในการ์ด CF ของฉันได้:
$ sudo dd if=myfs of=/dev/sdc1
หรือฉันสามารถแพ็คอิมเมจของดิสก์นั้นขึ้นส่งให้คุณและให้คุณเขียนลงในสื่อที่คุณเลือกเช่นหน่วยความจำ USB:
$ gzip myfs
$ echo "Here's the disk image I promised to send you." |
mutt -a myfs.gz -s "Password file disk image" you@example.com
ทั้งหมดนี้เป็นไปได้บน Linux ⁵เนื่องจากไม่มีความแตกต่างอย่างแน่นอนระหว่างไฟล์ระบบไฟล์และอุปกรณ์ หลายสิ่งในระบบ Unix ไม่ว่าจะเป็นไฟล์หรือเข้าถึงได้ผ่านระบบไฟล์เพื่อให้ดูเหมือนไฟล์หรือในทางอื่นดูคล้ายไฟล์มากพอที่จะถือว่าเป็นเช่นนั้น
แนวคิดของระบบไฟล์ของ windows เป็นเพียงการผสมกัน มันสร้างความแตกต่างระหว่างไดเรกทอรีไดรฟ์และทรัพยากรเครือข่าย มีสามไวยากรณ์ที่แตกต่างกันทั้งหมดเข้าด้วยกันผสมใน Windows คือ: Unix เหมือน..\FOO\BAR
ระบบเส้นทางอักษรไดรฟ์ชอบC:
และเส้นทาง UNC \\SERVER\PATH\FILE.TXT
เช่น นี่เป็นเพราะมันเป็นการเพิ่มความคิดจาก Unix, CP / M , MS-DOSและLAN Managerแทนที่จะเป็นการออกแบบที่เชื่อมโยงกันเดียว มันเป็นเหตุผลที่มีตัวละครที่ผิดกฎหมายจำนวนมากดังนั้นในชื่อไฟล์ของ Windows
Unix มีระบบไฟล์ที่รวมเป็นหนึ่งเดียวกับทุกสิ่งที่เข้าถึงได้ด้วยโครงร่างทั่วไปเดียว ในการเขียนโปรแกรมที่ทำงานบนกล่อง Linux ที่ไม่มีความแตกต่างระหว่างการทำงาน/etc/passwd
, และ/media/CF_CARD/etc/passwd
/mnt/server/etc/passwd
ไฟล์ในเครื่องสื่อภายนอกและเครือข่ายที่ใช้ร่วมกันทั้งหมดจะได้รับการปฏิบัติเช่นเดียวกัน⁶
Windows สามารถบรรลุจุดสิ้นสุดคล้ายกับตัวอย่างอิมเมจดิสก์ของฉันด้านบน แต่คุณต้องใช้โปรแกรมพิเศษที่เขียนโดยโปรแกรมเมอร์ที่มีความสามารถพิเศษ นี่คือเหตุผลที่มีจำนวนมากดังนั้น "เสมือน DVD" พิมพ์โปรแกรมบน Windows การขาดคุณสมบัติหลักของระบบปฏิบัติการได้สร้างตลาดประดิษฐ์สำหรับโปรแกรมเพื่อเติมเต็มช่องว่างซึ่งหมายความว่าคุณมีผู้คนมากมายที่แข่งขันกันเพื่อสร้างโปรแกรมประเภทดีวีดีเสมือนที่ดีที่สุด เราไม่จำเป็นต้องโปรแกรมดังกล่าวในระบบ ix * เพราะเราก็สามารถติดภาพดิสก์ ISO ใช้อุปกรณ์ห่วง
เช่นเดียวกันกับเครื่องมืออื่น ๆ เช่นโปรแกรมเช็ดดิสก์ซึ่งเราไม่ต้องการในระบบ Unix ต้องการเนื้อหาของการ์ด CF ของคุณถูกรบกวนอย่างไม่น่าเชื่อแทนที่จะเป็นศูนย์? ตกลงใช้/dev/random
เป็นแหล่งข้อมูลแทน/dev/zero
:
$ sudo dd if=/dev/random of=/dev/sdc
บนลีนุกซ์เราไม่ได้คิดค้นล้อเหล่านี้ใหม่เพราะคุณสมบัติหลักของระบบปฏิบัติการไม่เพียงทำงานได้ดีพอพวกมันทำงานได้ดีจนใช้งานได้อย่างแพร่หลาย แบบแผนทั่วไปในการบูทกล่องลีนุกซ์เกี่ยวข้องกับอิมเมจดิสก์เสมือน, ตัวอย่างหนึ่ง, สร้างขึ้นโดยใช้เทคนิคอย่างที่ฉันแสดงด้านบน.
ฉันรู้สึกว่ามันยุติธรรมที่จะชี้ให้เห็นว่าถ้า Unix ได้รวม TCP / IP I / O เข้ากับระบบไฟล์ตั้งแต่เริ่มต้นเราจะไม่มีnetcat
vs socat
vs Ncat
vs messสาเหตุซึ่งเป็นจุดอ่อนการออกแบบเดียวกันที่นำไปสู่ ภาพดิสก์และการเพิ่มเครื่องมือลบภาพบน Windows: ไม่มีระบบปฏิบัติการที่ยอมรับได้nc
คำตอบยาวตอนที่ 2: ไพพ์เป็นไฟล์เสมือน
แม้จะมีพื้นฐานมาจาก DOS แต่ Windows ก็ไม่เคยมีบรรทัดคำสั่งที่สมบูรณ์
นี่คือไม่ได้บอกว่า Windows ไม่ได้มีบรรทัดคำสั่งหรือว่ามันขาดโปรแกรมบรรทัดคำสั่งจำนวนมาก ของ Windows ยังมีคำสั่งที่มีประสิทธิภาพมากเปลือกวันนี้เรียกว่าเหมาะสมPowerShell
ถึงกระนั้นก็ยังมีผลกระทบจากการขาดประเพณีบรรทัดคำสั่งนี้ คุณได้รับเครื่องมือแบบDISKPART
ที่แทบจะไม่เป็นที่รู้จักในโลก Windows เพราะคนส่วนใหญ่ทำการแบ่งพาร์ติชันดิสก์และผ่านสแน็ปอิน MMC การจัดการคอมพิวเตอร์ จากนั้นเมื่อคุณจำเป็นต้องเขียนสคริปต์การสร้างพาร์ติชันคุณจะพบว่าไม่ได้DISKPART
ถูกขับเคลื่อนโดยโปรแกรมอื่น ใช่คุณสามารถเขียนชุดคำสั่งลงในไฟล์สคริปต์และเรียกใช้ผ่านทางDISKPART /S scriptfile
แต่มันคือทั้งหมดหรือไม่มีอะไร สิ่งที่คุณจริงๆต้องการในสถานการณ์ดังกล่าวเป็นสิ่งที่มากขึ้นเช่นGNUparted
parted /dev/sdb mklabel gpt
ซึ่งจะยอมรับคำสั่งเดียวเช่น ที่ช่วยให้สคริปต์ของคุณทำการจัดการข้อผิดพลาดทีละขั้นตอน
สิ่งนี้เกี่ยวข้องกับ "ทุกอย่างเป็นไฟล์" หรือไม่? ง่าย: ไพพ์สร้างโปรแกรมบรรทัดคำสั่ง I / O ให้เป็น "ไฟล์" ของการเรียงลำดับ ไพพ์เป็นสตรีมทิศทางเดียวไม่ใช่การเข้าถึงแบบสุ่มเช่นไฟล์ดิสก์ปกติ แต่ในหลาย ๆ กรณีความแตกต่างจะไม่มีผล สิ่งสำคัญคือคุณสามารถแนบสองโปรแกรมที่พัฒนาขึ้นอย่างอิสระและทำให้พวกเขาสื่อสารผ่านข้อความธรรมดา ในแง่นั้นโปรแกรมสองโปรแกรมที่ออกแบบด้วยUnix Wayในใจสามารถสื่อสารได้
ในกรณีที่คุณต้องการไฟล์จริงๆมันง่ายที่จะเปลี่ยนเอาต์พุตของโปรแกรมเป็นไฟล์:
$ some-program --some --args > myfile
$ vi myfile
แต่ทำไมเขียนผลลัพธ์ไปยังไฟล์ชั่วคราวเมื่อปรัชญา "ทุกอย่างเป็นไฟล์" ให้วิธีที่ดีกว่า หากสิ่งที่คุณต้องการทำคืออ่านเอาต์พุตของคำสั่งนั้นลงในvi
บัฟเฟอร์เอดิเตอร์คุณvi
สามารถทำสิ่งนั้นได้โดยตรง จากvi
โหมด "ปกติ" ให้พูดว่า:
:r !some-program --some --args
ที่แทรกเอาท์พุทของโปรแกรมนั้นลงในบัฟเฟอร์เอดิเตอร์แอ็คทีฟที่ตำแหน่งเคอร์เซอร์ปัจจุบัน ใต้ฝากระโปรงvi
ใช้ท่อเพื่อเชื่อมต่อเอาท์พุทของโปรแกรมไปยังโค้ดที่ใช้ระบบปฏิบัติการเดียวกันกับที่เรียกใช้เพื่ออ่านจากไฟล์แทน ฉันจะไม่ต้องแปลกใจถ้าทั้งสองกรณี:r
- นั่นคือมีและไม่มี!
- vi
ทั้งใช้ข้อมูลทั่วไปเดียวกันอ่านห่วงในการใช้งานร่วมกันทั้งหมด ฉันไม่สามารถคิดด้วยเหตุผลที่ดีไม่ได้
นี่ไม่ใช่คุณสมบัติล่าสุดของvi
ทั้ง; มันกลับไปที่ed(1)
เท็กซ์เอดิเตอร์แบบโบราณ
ความคิดอันทรงพลังนี้ปรากฏขึ้นซ้ำแล้วซ้ำอีกใน Unix
สำหรับตัวอย่างที่สองของสิ่งนี้ให้จำmutt
คำสั่งอีเมลของฉันด้านบน เหตุผลเดียวที่ฉันต้องเขียนว่าเนื่องจากคำสั่งสองคำสั่งแยกกันคือฉันต้องการให้มีชื่อไฟล์ชั่วคราวเพื่อ*.gz
ให้ไฟล์แนบของอีเมลนั้นตั้งชื่อถูกต้อง หากฉันไม่สนใจเกี่ยวกับชื่อไฟล์ฉันสามารถใช้การทดแทนกระบวนการเพื่อหลีกเลี่ยงการสร้างไฟล์ชั่วคราว:
$ echo "Here's the disk image I promised to send you." |
mutt -a <(gzip -c myfs) -s "Password file disk image" you@example.com
ที่หลีกเลี่ยงชั่วคราวโดยการเปลี่ยนผลลัพธ์ของgzip -c
การเป็น FIFO (ซึ่งเป็นไฟล์เหมือน) หรือ/dev/fd
วัตถุ (ซึ่งเป็นเหมือนไฟล์) (Bash เลือกวิธีการตามความสามารถของระบบเนื่องจาก/dev/fd
ไม่สามารถใช้ได้ทุกที่)
สำหรับวิธีที่สามความคิดที่ทรงพลังนี้ปรากฏใน Unix ให้พิจารณาgdb
ระบบ Linux นี่คือโปรแกรมดีบั๊กที่ใช้กับซอฟต์แวร์ใด ๆ ที่เขียนด้วย C และ C ++ โปรแกรมเมอร์มาที่ Unix จากระบบอื่น ๆ ดูgdb
และเกือบจะจับต้องไม่ได้ "Yuck มันดั้งเดิมมาก!" จากนั้นพวกเขาไปค้นหาตัวดีบัก GUI หาหนึ่งในหลาย ๆ ที่ที่มีอยู่และทำงานต่อไปอย่างมีความสุข ... มักจะไม่เคยรู้เลยว่า GUI เพิ่งทำงานgdb
ภายใต้การจัดหาเปลือกสวย ๆ ไว้ด้านบน ไม่มีการแข่งขัน debuggers ระดับต่ำในระบบ Unix ส่วนใหญ่เพราะไม่จำเป็นสำหรับโปรแกรมที่จะแข่งขันในระดับนั้น สิ่งที่เราต้องการคือเครื่องมือระดับต่ำที่ดีอย่างหนึ่งที่เราสามารถใช้เป็นเครื่องมือระดับสูงของเราได้หากเครื่องมือระดับต่ำสื่อสารผ่านท่อได้อย่างง่ายดาย
ซึ่งหมายความว่าตอนนี้เรามีอินเตอร์เฟซดีบักเอกสารซึ่งจะช่วยให้หล่นในการเปลี่ยนgdb
แต่โชคไม่ดีที่คู่แข่งหลักในการไม่ได้ใช้เส้นทางต่ำแรงเสียดทานgdb
อย่างน้อยก็เป็นไปได้ว่าการgdb
เปลี่ยนในอนาคตบางอย่างอาจทำให้เกิดความโปร่งใสโดยการโคลนอินเตอร์เฟสบรรทัดคำสั่ง หากต้องการดึงสิ่งเดียวกันออกจากกล่อง Windows ผู้สร้างเครื่องมือที่เปลี่ยนได้จะต้องกำหนดประเภทของปลั๊กอินหรือ API อัตโนมัติอย่างเป็นทางการ นั่นหมายความว่ามันจะไม่เกิดขึ้นยกเว้นสำหรับโปรแกรมที่ได้รับความนิยมมากที่สุดเนื่องจากเป็นงานที่ต้องสร้างทั้งส่วนติดต่อผู้ใช้บรรทัดคำสั่งปกติและ API การเขียนโปรแกรมที่สมบูรณ์
มายากลนี้เกิดขึ้นโดยพระคุณของข้อความตามแพร่หลายIPC
แม้ว่าเคอร์เนลของ Windows จะมีท่อที่ไม่ระบุตัวตนในรูปแบบ Unixแต่ก็ยากที่จะเห็นโปรแกรมผู้ใช้ทั่วไปใช้พวกมันสำหรับIPCนอกเชลล์คำสั่งเนื่องจาก Windows ขาดประเพณีในการสร้างบริการหลักทั้งหมดในเวอร์ชันบรรทัดคำสั่งก่อนจากนั้นจึงสร้าง GUI บน ด้านบนของมันแยกจากกัน สิ่งนี้นำไปสู่การไม่สามารถทำบางสิ่งหากไม่มี GUI ซึ่งเป็นเหตุผลหนึ่งที่ทำให้มีระบบเดสก์ท็อประยะไกลมากมายสำหรับ Windows เมื่อเทียบกับ Linux: Windows ใช้งานยากมากหากไม่มี GUI
ในทางตรงกันข้ามเป็นเรื่องปกติที่จะจัดการกล่อง Unix, BSD, OS X และ Linux จากระยะไกลผ่าน SSH และวิธีการทำงานคุณถาม? SSH เชื่อมต่อซ็อกเก็ตเครือข่าย (ซึ่งเป็นไฟล์) ไปยังpseudo tty at /dev/pty*
(ซึ่งเป็นไฟล์) ขณะนี้ระบบรีโมตของคุณเชื่อมต่อกับโลคัลของคุณผ่านการเชื่อมต่อที่สอดคล้องกับ Unix Way อย่างไร้รอยต่อซึ่งคุณสามารถไพพ์ข้อมูลผ่านการเชื่อมต่อ SSH ได้หากคุณต้องการ
คุณได้รับแนวคิดว่าตอนนี้แนวคิดนี้มีประสิทธิภาพเพียงใด
สตรีมข้อความ piped แยกไม่ออกจากไฟล์จากมุมมองของโปรแกรมยกเว้นว่าเป็นทิศทางเดียว โปรแกรมอ่านจากท่อทางเดียวกันก็อ่านจากไฟล์: ผ่านอธิบายไฟล์ FDs เป็นหัวใจสำคัญของยูนิกซ์อย่างแน่นอน ความจริงที่ว่าไฟล์และท่อใช้นามธรรมที่เหมือนกันสำหรับ I / O บนทั้งสองควรบอกคุณบางสิ่งบางอย่าง
โลกของ Windows ขาดประเพณีของการสื่อสารข้อความที่เรียบง่ายนี้ทำให้ทำอย่างไรกับเฮฟวี่เวทOOPการเชื่อมต่อผ่านCOMหรือ.NET หากคุณต้องการทำให้โปรแกรมดังกล่าวเป็นอัตโนมัติคุณต้องเขียนโปรแกรม COM หรือ. NET นี่เป็นบิตที่ยากกว่าการตั้งค่าไปป์บนกล่อง Unix
โปรแกรม Windows ที่ไม่มี API การเขียนโปรแกรมที่ซับซ้อนเหล่านี้สามารถสื่อสารผ่านอินเตอร์เฟสที่ยากจนเช่นคลิปบอร์ดหรือไฟล์ / บันทึกตามด้วยไฟล์ / เปิด
คำตอบยาว ๆ ตอนที่ 3: ไฟล์เทียบกับรีจิสตรี
ความแตกต่างในทางปฏิบัติระหว่างการลงทะเบียน Windows และการกำหนดค่าระบบ Unix ยังแสดงให้เห็นถึงประโยชน์ของปรัชญา "ทุกอย่างเป็นไฟล์"
บนระบบชนิด Unix ฉันสามารถดูข้อมูลการกำหนดค่าระบบจากบรรทัดคำสั่งเพียงตรวจสอบไฟล์ ฉันสามารถเปลี่ยนพฤติกรรมของระบบโดยการแก้ไขไฟล์เดียวกันเหล่านั้น ส่วนใหญ่แล้วไฟล์กำหนดค่าเหล่านี้เป็นเพียงไฟล์ข้อความธรรมดาซึ่งหมายความว่าฉันสามารถใช้เครื่องมือใด ๆ บน Unix เพื่อจัดการกับไฟล์เหล่านั้นที่สามารถทำงานกับไฟล์ข้อความธรรมดาได้
การเขียนสคริปต์รีจิสทรีไม่ใช่เรื่องง่ายนักบน Windows
วิธีที่ง่ายที่สุดคือการเปลี่ยนแปลงของคุณผ่านทางโปรแกรม Registry Editor GUI บนเครื่องหนึ่งแล้วสุ่มสี่สุ่มห้าใช้การเปลี่ยนแปลงเหล่านั้นไปยังเครื่องอื่น ๆ ที่มีregedit
ผ่านทาง*.reg
ไฟล์ นั่นไม่ใช่ "การเขียนสคริปต์" จริงๆเพราะมันไม่อนุญาตให้คุณทำอะไรตามเงื่อนไข: มันเป็นทั้งหมดหรือไม่มีอะไรเลย
หากการเปลี่ยนแปลงรีจิสทรีของคุณต้องการตรรกะจำนวนหนึ่งตัวเลือกที่ง่ายที่สุดถัดไปคือการเรียนรู้PowerShellซึ่งโดยทั่วไปแล้วเป็นการเรียนรู้การเขียนโปรแกรมระบบ. NET มันจะเหมือนกับว่า Unix มี Perl เท่านั้นและคุณต้องทำการบริหารระบบเฉพาะกิจทั้งหมดด้วย ตอนนี้ฉันเป็นแฟน Perl แต่ไม่ใช่ทุกคน Unix ให้คุณใช้เครื่องมือใดก็ได้ที่คุณชอบตราบใดที่มันสามารถจัดการไฟล์ข้อความธรรมดาได้
เชิงอรรถ:
แผน 9การแก้ไขความผิดการออกแบบนี้เปิดเผยเครือข่าย I / O ที่ผ่านระบบแฟ้มเสมือน/net
Bash มีคุณสมบัติที่เรียก/dev/tcp
ว่าช่วยให้เครือข่าย I / O ผ่านฟังก์ชั่นระบบไฟล์ปกติ เนื่องจากเป็นคุณลักษณะ Bash แต่เป็นคุณลักษณะเคอร์เนลจึงไม่สามารถมองเห็นได้ภายนอก Bash หรือในระบบที่ไม่ใช้ Bashเลย นี่เป็นตัวอย่างที่แสดงให้เห็นว่าทำไมมันเป็นความคิดที่ดีที่จะทำให้มองเห็นแหล่งข้อมูลทั้งหมดผ่านระบบแฟ้ม
โดย "modern Windows" ฉันหมายถึง Windows NT และการสืบทอดโดยตรงทั้งหมดซึ่งรวมถึง Windows 2000, Windows Server ทุกรุ่นและ Windows รุ่นที่มุ่งเน้นเดสก์ท็อปทั้งหมดจาก XP เป็นต้นไป ฉันใช้คำศัพท์เพื่อแยก Windows รุ่นที่ใช้ DOS เป็น Windows 95 และรุ่นที่สืบทอดโดยตรง Windows 98 และ Windows ME รวมถึงรุ่นก่อนหน้า 16 บิต
คุณสามารถเห็นความแตกต่างจากการขาดระบบ I / O แบบรวมในระบบปฏิบัติการหลังเหล่านั้น คุณไม่สามารถผ่านซ็อกเก็ต TCP / IP ไปReadFile()
ที่ Windows 95; คุณสามารถส่งซ็อกเก็ตไปที่ Windows Sockets API ได้เท่านั้น ดูบทความน้ำเชื้อของ Andrew Schulman, Windows 95: What It Not Notเพื่อการดำน้ำลึกในหัวข้อนี้
ไม่มีข้อผิดพลาด/dev/null
เป็นอุปกรณ์เคอร์เนลจริงในระบบชนิด Unix ไม่ใช่แค่ชื่อไฟล์ที่เน้นพิเศษเช่นเดียวกับที่เทียบเท่าอย่างผิวเผินNUL
ใน Windows
แม้ว่า Windows จะพยายามป้องกันคุณจากการสร้างNUL
ไฟล์ แต่ก็เป็นไปได้ที่จะข้ามการป้องกันนี้โดยใช้เล่ห์เหลี่ยมเพียงอย่างเดียวหลอกชื่อไฟล์ของ Windows ที่แยกวิเคราะห์ตรรกะ ถ้าคุณพยายามที่จะเข้าถึงไฟล์ที่มีcmd.exe
หรือ Explorer ใน Windows จะปฏิเสธที่จะเปิดมัน แต่คุณสามารถเขียนไปผ่าน Cygwin เพราะมันเปิดไฟล์โดยใช้วิธีการคล้ายกับโปรแกรมตัวอย่างและคุณสามารถลบได้ผ่านการใช้กลอุบายที่คล้ายกัน
ในทางตรงกันข้าม Unix จะช่วยให้คุณมีความสุขrm /dev/null
ตราบใดที่คุณมีสิทธิ์ในการเขียน/dev
และให้คุณสร้างไฟล์ใหม่ขึ้นมาแทนโดยปราศจากเล่ห์เหลี่ยมเพราะโหนด devนั้นเป็นอีกไฟล์หนึ่ง แม้ว่าโหนด dev นั้นจะหายไปอุปกรณ์ null ของเคอร์เนลก็ยังคงมีอยู่ มันไม่สามารถเข้าถึงได้จนกว่าคุณจะสร้างโหนด dev ผ่านmknod
ใหม่
คุณสามารถสร้างโหนดอุปกรณ์ dev เพิ่มเติมได้ที่อื่น: มันไม่สำคัญว่าคุณจะเรียกมัน/home/grandma/Recycle Bin
ว่าตราบใดที่มันเป็นโหนด dev สำหรับอุปกรณ์ null มันจะทำงานเหมือนกัน/dev/null
ทุกประการ
มีจริงสองระดับสูง "ดิสก์รูปแบบ" APIs ใน Windows: แล้วSHFormatDrive()
Win32_Volume.Format()
มีสองสิ่งสำหรับ ... ที่ดี ... เหตุผลแบบWindows อันแรกขอให้ Windows Explorer แสดงกล่องโต้ตอบ "Format Disk" ตามปกติซึ่งหมายความว่ามันทำงานได้กับ Windows รุ่นที่ทันสมัยใด ๆ แต่ในขณะที่ผู้ใช้เข้าสู่ระบบแบบโต้ตอบอื่น ๆ ที่คุณสามารถโทรในพื้นหลังโดยไม่ต้องใส่ผู้ใช้ แต่มันก็ไม่ได้เพิ่มไปยัง Windows จนกว่า Windows Server 2003 ที่เหมาะสมพฤติกรรม OS หลักถูกซ่อนอยู่เบื้องหลัง GUI จนถึงปี 2003 ในโลกที่ใช้ระบบปฏิบัติการยูนิกซ์จัดส่งmkfs
ตั้งแต่วันที่ 1
สำเนา Unix V5ของฉันจากปี 1974 รวมถึงไฟล์ปฏิบัติการที่/etc/mkfs
เชื่อมโยงกับPDP-11 4136 ไบต์แบบสแตติก (Unix ไม่ได้รับการเชื่อมโยงแบบไดนามิกจนถึงปลายปี 1980ดังนั้นจึงไม่เหมือนมีห้องสมุดขนาดใหญ่ที่อื่นทำงานจริงทั้งหมด) ซอร์สโค้ดของมัน - รวมอยู่ในอิมเมจระบบ V5 เป็น/usr/source/s2/mkfs.c
- ทั้งหมด 457- ในตัวเอง โปรแกรม line C ไม่มีแม้แต่#include
ข้อความใด ๆ!
ซึ่งหมายความว่าคุณไม่สามารถตรวจสอบสิ่งที่mkfs
ทำในระดับสูงคุณสามารถทดลองกับมันได้โดยใช้ชุดเครื่องมือ Unix ที่สร้างขึ้นด้วยเช่นเดียวกับคุณKen Thompsonเมื่อสี่สิบปีก่อน ลองกับ Windows สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้ในวันนี้คือดาวน์โหลดซอร์สโค้ด DOSซึ่งเปิดตัวครั้งแรกในปี 2014ซึ่งคุณจะพบจำนวนเงินที่เป็นเพียงแหล่งรวมแอสเซมบลี มันจะสร้างด้วยเครื่องมือที่ล้าสมัยซึ่งคุณอาจไม่มีในมือและในที่สุดคุณก็จะได้สำเนาของตัวเองของ DOS 2.0 ซึ่งเป็นระบบปฏิบัติการที่มีประสิทธิภาพน้อยกว่าUnix V5 ในปี 1974 ถึงแม้ว่ามันจะถูกเปิดตัวเกือบทศวรรษต่อมาก็ตาม
(ทำไมพูดคุยเกี่ยวกับระบบปฏิบัติการยูนิกซ์ V5? เพราะมันเป็นระบบยูนิกซ์ที่เก่าแก่ที่สุดที่สมบูรณ์ยังคงมีอยู่. รุ่นก่อนหน้านี้มีการสูญเสียที่เห็นได้ชัดเวลา . มีโครงการที่ปะติดปะต่อ V1 / V2 ยุค Unix แต่ก็ดูเหมือนจะหายไปmkfs
แม้จะมีการดำรงอยู่ ของหน้าคู่มือ V1 ที่เชื่อมโยงด้านบนพิสูจน์แล้วว่ามันต้องมีอยู่ที่ไหนสักแห่งทั่วโลกทั้งที่วางโครงการนี้เข้าด้วยกันไม่สามารถหาสำเนาที่มีอยู่ของmkfs
รวมหรือฉันดูดที่หาไฟล์โดยfind(1)
ที่ไม่ได้อยู่ในระบบนั้น . :)
)
ตอนนี้คุณอาจกำลังคิดว่า "ฉันโทรหาformat.com
ไม่ได้เหรอไม่เหมือนกันกับ Windows ในการโทรหาmkfs
ยูนิกซ์" อนิจจาไม่มันไม่เหมือนกันด้วยเหตุผลหลายประการ:
อย่างแรกformat.com
ไม่ได้ถูกออกแบบมาให้เขียนสคริปต์ มันแจ้งให้คุณ "กด ENTER เมื่อพร้อม" ซึ่งหมายความว่าคุณต้องส่งคีย์ Enter ไปยังอินพุตของมันหรือมันจะแขวน
แล้วถ้าคุณต้องการอะไรมากไปกว่ารหัสสถานะความสำเร็จ / ล้มเหลวคุณต้องเปิดออกมาตรฐานสำหรับการอ่านซึ่งจะห่างไกลความซับซ้อนมากขึ้นกว่าใน Windows มันจะต้องมี (บน Unix ทุกสิ่งในบทความที่เชื่อมโยงนั้นสามารถทำได้ด้วยการpopen(3)
โทรง่าย ๆ)
หลังจากผ่านภาวะแทรกซ้อนนี้ผลลัพธ์ของformat.com
การแยกเป็นเรื่องยากสำหรับโปรแกรมคอมพิวเตอร์กว่าผลลัพธ์ของmkfs
การมีวัตถุประสงค์หลักเพื่อการบริโภคของมนุษย์
หากคุณติดตามสิ่งที่format.com
ไม่คุณจะพบว่ามันไม่พวงของการโทรซับซ้อนให้DeviceIoControl()
, ufat.dll
และเช่น มันไม่เพียงแค่เปิดไฟล์อุปกรณ์และเขียนระบบไฟล์ใหม่ลงในอุปกรณ์นั้น นี้จะเรียงลำดับของการออกแบบที่คุณได้รับจากบริษัท ที่มีพนักงาน 126,000 คนและความต้องการที่จะให้จ้างพวกเขา
เมื่อพูดถึงอุปกรณ์ลูปฉันจะพูดเฉพาะเกี่ยวกับลินุกซ์มากกว่า Unix โดยทั่วไปเพราะอุปกรณ์ลูปไม่ได้พกพาระหว่างระบบประเภท Unix มีกลไกที่คล้ายกันใน OS X, BSD ฯลฯ มี แต่ไวยากรณ์ค่อนข้างแตกต่างกัน
ย้อนกลับไปในสมัยที่ดิสก์ไดรฟ์มีขนาดของเครื่องซักผ้าและมีราคาสูงกว่ารถยนต์หรูหราของแผนกห้องปฏิบัติการคอมพิวเตอร์ขนาดใหญ่จะแบ่งสัดส่วนพื้นที่ดิสก์รวมเป็นสัดส่วนมากกว่าเมื่อเปรียบเทียบกับสภาพแวดล้อมการคำนวณที่ทันสมัย ความสามารถในการต่อกิ่งดิสก์ระยะไกลลงในระบบไฟล์ภายในเครื่องทำให้ระบบการกระจายดังกล่าวใช้งานง่ายขึ้นมาก /usr/share
ตัวอย่างเช่นที่นี่เราได้รับ
Contrast Windows ซึ่งโดยทั่วไปแล้วดิสก์ระยะไกลจะถูกแมปกับตัวอักษรชื่อไดรฟ์หรือต้องเข้าถึงผ่านเส้นทาง UNC แทนที่จะรวมอยู่ในระบบแฟ้มภายในอย่างโปร่งใส ตัวอักษรไดรฟ์นำเสนอทางเลือกเล็กน้อยสำหรับการแสดงออกเชิงสัญลักษณ์ ไม่P:
อ้างถึงพื้นที่ "สาธารณะ" ใน BigServer หรือกับ "แพคเกจ" ไดเรกทอรีบนเซิร์ฟเวอร์กระจกซอฟต์แวร์? เส้นทาง UNC หมายความว่าคุณต้องจำเซิร์ฟเวอร์ระยะไกลที่ไฟล์ของคุณอยู่ซึ่งทำได้ยากในองค์กรขนาดใหญ่ที่มีเซิร์ฟเวอร์ไฟล์นับร้อยหรือพันไฟล์
หน้าต่างไม่ได้รับ symlinks จนกว่า Windows Vista ได้รับการปล่อยตัวในปี 2007 ซึ่งแนะนำNTFS เชื่อมโยงสัญลักษณ์ ลิงก์สัญลักษณ์ของ Windows นั้นมีประสิทธิภาพมากกว่าลิงก์สัญลักษณ์ของ Unix เล็กน้อยซึ่งเป็นฟีเจอร์ของ Unix นับตั้งแต่ปี 2520 เป็นต้นมาซึ่งพวกเขาสามารถชี้ไปที่การแชร์ไฟล์ระยะไกลไม่ใช่เฉพาะเส้นทางในเครื่อง Unix ทำสิ่งนั้นแตกต่างกันผ่านNFS ในปี 1984ซึ่งสร้างขึ้นจากคุณลักษณะจุดเมานต์ที่มีอยู่ก่อนหน้าของ Unix ซึ่งมันมีมาตั้งแต่เริ่มต้น
ดังนั้นขึ้นอยู่กับว่าคุณมองอย่างไร Windows จึงโยงใย Unix ประมาณ 2 หรือ 3 ทศวรรษ
แม้กระนั้นลิงก์สัญลักษณ์ไม่ใช่ส่วนหนึ่งของประสบการณ์ผู้ใช้ Windows ด้วยเหตุผลสองประการ
ขั้นแรกคุณสามารถสร้างได้ด้วยโปรแกรมบรรทัดคำสั่งย้อนหลังMKLINK
เท่านั้น คุณไม่สามารถสร้างได้จาก Windows Explorer ในขณะที่ Unix ที่เทียบเท่ากับ Windows Explorer โดยทั่วไปจะอนุญาตให้คุณสร้าง symlink
ประการที่สองการกำหนดค่าเริ่มต้นของ Windows ป้องกันผู้ใช้ปกติจากการสร้างลิงก์สัญลักษณ์ซึ่งกำหนดให้คุณเรียกใช้เชลล์คำสั่งในฐานะผู้ดูแลระบบหรือให้สิทธิ์ผู้ใช้ในการสร้างผ่านเส้นทางที่ไม่ชัดเจนในเครื่องมือโดยที่ผู้ใช้ทั่วไปไม่เคยเห็นมาก่อน วิธีใช้. (และแตกต่างจากปัญหาสิทธิ์ของผู้ดูแลระบบส่วนใหญ่ใน Windows UAC ไม่มีประโยชน์ในกรณีนี้)
กล่อง Linux ไม่ใช้ดิสก์อิมเมจเสมือนในลำดับการบู๊ตเสมอไป มีพวงของวิธีการที่แตกต่างกันที่จะทำมัน
man ed
ตัวอธิบายซ็อกเก็ตเครือข่ายเป็น FDs ด้วยเช่นกัน