"모든 것이 파일입니다"는 약간 glib입니다. " 파일 시스템 어딘가에 나타나는 모든 것 "은 마크에 더 가깝고 심지어 시스템 디자인의 법칙보다 더 이상적입니다.
예를 들어 Unix 도메인 소켓 은 파일이 아니지만 파일 시스템에 나타납니다. 당신은 할 수 ls -l
도메인 소켓은, 그것의 속성을 표시합니다 cat
, 하나 / 데이터를 통해 자사의 액세스 제어를 수정 chmod
등
그러나 일반적인 TCP / IP 네트워크 소켓 이 Unix 도메인 소켓과 동일한 BSD 소켓 시스템 호출로 작성되고 조작 되더라도 TCP / IP 소켓은 파일 시스템에 표시 되지 않습니다 .¹ 사실이다.
파일 시스템에 나타나는 비 파일 객체의 또 다른 예는 Linux의 /proc
파일 시스템 입니다. 이 기능은 대부분의 가상 텍스트 파일로 커널의 런타임 작업에 대한 많은 정보를 사용자 공간에 노출 합니다. 많은 /proc
항목이 읽기 전용이지만 많은 항목 /proc
도 쓸 수 있으므로 파일을 수정할 수있는 프로그램을 사용하여 시스템이 실행되는 방식을 변경할 수 있습니다. 아아, 여기에도 우리는 비 이상적입니다. BSD 유형 유닉스는 일반적으로없이 실행/proc
되며 System V 유닉스 /proc
는 리눅스보다 훨씬 덜 노출 됩니다.
나는 MS Windows와 대조 할 수 없다
먼저, 온라인과 유닉스에 관한 책에서 파일 I / O에 관한 모든 감정과 Windows가 이와 관련하여 "손상된"감정은 더 이상 사용되지 않습니다. Windows NT 는이 문제를 많이 해결했습니다.
최신 버전의 Windows에는 Unix와 마찬가지로 통합 I / O 시스템이 있으므로 원하는 경우 ReadFile()
Windows 소켓 별 API 대신 TCP / IP 소켓에서 네트워크 데이터를 읽을 수 있습니다 WSARecv()
. 이것은 일반적인 Unix 시스템 호출이나 소켓 별 호출 을 사용하여 네트워크 소켓에서 읽을 수 있는 Unix Way 와 정확히 일치 read(2)
합니다 recv(2)
.²
그럼에도 불구하고 Windows는 2018 년에도이 개념을 Unix와 같은 수준으로 유지하지 못합니다. 파일 시스템을 통해 액세스 할 수 없거나 파일과 같이 볼 수없는 많은 Windows 아키텍처 영역이 있습니다. 몇 가지 예 :
드라이버.
Windows의 드라이버 하위 시스템은 Unix만큼 강력하고 강력하지만 드라이버를 조작하기위한 프로그램을 작성하려면 일반적으로 C 또는 .NET 코드 작성을 의미 하는 Windows Driver Kit 를 사용해야합니다 .
Unix 유형 OS에서는 명령 줄에서 드라이버를 많이 사용할 수 있습니다. 원치 않는 출력을 /dev/null
.³ 로 리디렉션하여이 작업을 수행 한 경우는 거의 확실합니다.
프로그램 간 통신.
Windows 프로그램은 서로 쉽게 통신 할 수 없습니다.
유닉스 커맨드 라인 프로그램은 텍스트 스트림과 파이프를 통해 쉽게 통신합니다. GUI 프로그램은 종종 명령 행 프로그램 위에 구축되거나 텍스트 명령 인터페이스를 내 보내서 동일한 간단한 텍스트 기반 통신 메커니즘도 GUI 프로그램과 함께 작동합니다.
레지스트리.
유닉스에는 Windows 레지스트리와 직접적으로 동등한 것이 없습니다. 동일한 정보가 파일 시스템을 통해 흩어져 있으며 대부분은 /etc
, /proc
및에 /sys
있습니다.
드라이버, 파이프 및 Windows 레지스트리에 대한 Unix의 대답이 "모든 것이 파일입니다"와 관련이있는 경우 계속 읽으십시오.
"모든 것이 파일입니다"라는 철학이 어떻게 다른 점이 있습니까?
위의 세 가지 사항을 자세하게 확장하여 설명하겠습니다.
긴 대답, 1 부 : 드라이브 및 장치 파일
CF 카드 리더기가 E:
Windows 및 /dev/sdc
Linux에서 와 같이 나타납니다 . 실질적인 차이점은 무엇입니까?
단지 사소한 구문 차이가 아닙니다.
리눅스에서는 0으로 dd if=/dev/zero of=/dev/sdc
내용을 덮어 쓸 수 있습니다 /dev/sdc
.
그것이 무엇을 의미하는지 생각해보십시오. 여기에는 일반 사용자 공간 프로그램 ( dd(1)
)이 있는데 가상 장치 ( /dev/zero
) 에서 데이터를 읽고 /dev/sdc
통합 Unix 파일 시스템을 통해 실제 물리적 장치 ( )에 읽은 내용을 쓰도록 요청했습니다 . dd
그것이 특별한 장치에서 읽고 쓰는 것을 모른다. 아래에서 볼 수 있듯이 일반 파일이나 여러 장치 및 파일에서 작동합니다.
E:
Windows는 파일과 드라이브를 구별하기 때문에 Windows 에서 드라이브를 쉽게 제로화 할 수있는 방법이 없으므로 동일한 명령을 사용하여 조작 할 수 없습니다. 가장 가까운 드라이브는 대부분 의 드라이브 내용 을 제로화 한 다음 그 위에 새 파일 시스템을 작성하는 빠른 포맷 옵션없이 디스크 포맷을 수행하는 것입니다. 새로운 파일 시스템을 원하지 않으면 어떻게합니까? 디스크를 0으로 만 채우려면 어떻게해야합니까?
관대하고 정말로 새로운 파일 시스템을 원한다고 가정 해 봅시다 E:
. Windows의 프로그램에서이 작업을 수행하려면 특수 포맷 API를 호출해야합니다. Linux에서는 OS의 "포맷 디스크"기능에 액세스하기 위해 프로그램을 작성할 필요가 없습니다. 당신은 당신이 만들려는 파일 시스템 유형에 해당하는 사용자 공간 프로그램을 실행 mkfs.ext4
, mkfs.xfs
또는 당신이 무엇을 가지고있다. 이 프로그램은 파일 시스템을 /dev
전달한 파일이나 노드에 기록합니다.
mkfs
Unixy 시스템의 유형 프로그램은 장치와 일반 파일을 인공적으로 구분하지 않고 파일에서 작동 하기 때문에 Linux 상자의 일반 파일 내에 ext4 파일 시스템을 만들 수 있습니다 .
$ dd if=/dev/zero of=myfs bs=1k count=1k
$ mkfs.ext4 -F myfs
문자 그대로라는 현재 디렉토리에 1MiB 디스크 이미지를 만듭니다 myfs
. 그런 다음 다른 외부 파일 시스템 인 것처럼 마운트 할 수 있습니다.
$ mkdir mountpoint
$ sudo mount -o loop myfs mountpoint
$ grep $USER /etc/passwd > mountpoint/my-passwd-entry
$ sudo umount mountpoint
이제 my-passwd-entry
사용자의 /etc/passwd
항목 이 들어 있는 파일 이 들어 있는 ext4 디스크 이미지가 있습니다 .
원하는 경우 해당 이미지를 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®에서이 모든 것이 가능합니다. 유닉스 시스템에 많은 일들이 하나 있습니다 파일, 또는 그들이 너무 파일 시스템을 통해 액세스 처럼 파일 또는 다른 방법으로 모양 충분히 파일처럼 그들이 같은 처리 할 수 있습니다.
파일 시스템에 대한 Windows의 개념은 호지 포지입니다. 디렉토리, 드라이브 및 네트워크 자원을 구별합니다. Windows에서 세 가지 구문이 모두 유닉스와 같은 ..\FOO\BAR
경로 시스템, 드라이브 문자와 같은 C:
UNC 경로와 같이 혼합되어 \\SERVER\PATH\FILE.TXT
있습니다. 이는 단일 코 히어 런트 디자인이 아닌 Unix, CP / M , MS-DOS 및 LAN Manager 의 아이디어에 의한 것이기 때문 입니다. Windows 파일 이름에 잘못된 문자 가 너무 많은 이유가 여기에 있습니다 .
유닉스는 단일 파일 시스템으로 모든 것이 액세스되는 통합 파일 시스템을 가지고 있습니다. 리눅스 박스에서 실행되는 프로그램에,이 사이에 기능 차이가 없다 /etc/passwd
, /media/CF_CARD/etc/passwd
하고 /mnt/server/etc/passwd
. 로컬 파일, 외부 미디어 및 네트워크 공유는 모두 같은 방식으로 취급됩니다 .⁶
Windows는 위의 디스크 이미지 예제와 비슷한 결과를 얻을 수 있지만, 재능이없는 프로그래머가 작성한 특수 프로그램을 사용해야합니다. 이것이 Windows에 "가상 DVD"유형 프로그램 이 너무 많은 이유 입니다. 핵심 OS 기능이 없기 때문에 프로그램이 격차를 해소 할 수있는 인공적인 시장이 생겨났다. 이는 많은 사람들이 최고의 가상 DVD 유형 프로그램을 만들기 위해 경쟁하고 있음을 의미한다. 루프 장치를 사용하여 ISO 디스크 이미지 만 마운트 할 수 있기 때문에 * ix 시스템에서는 이러한 프로그램이 필요하지 않습니다 .
디스크 와이 핑 프로그램 과 같은 다른 도구도 마찬가지 입니다. Unix 시스템에는 필요하지 않습니다. CF 카드의 내용이 제로가 아닌 대신 뒤섞 일 수 있기를 원하십니까? 좋아, /dev/random
대신에 데이터 소스로 사용하십시오 /dev/zero
:
$ sudo dd if=/dev/random of=/dev/sdc
Linux에서는 핵심 OS 기능이 충분히 작동 할뿐만 아니라 잘 작동하여 널리 사용되기 때문에 이러한 휠을 계속 재창조하지 않습니다. 리눅스 박스를 부팅하는 일반적인 방법은 가상 디스크 이미지와 관련이 있습니다.
유닉스가 처음부터 파일 시스템에 TCP / IP I / O를 통합했다면 netcat
vs socat
vs Ncat
vs 엉망 이 없을 것입니다 . Windows에서 디스크 이미징 및 삭제 도구 확산 : 수용 가능한 OS 기능이 없습니다.nc
긴 답변, 2 부 : 가상 파일로 파이프
DOS의 뿌리에도 불구하고 Windows에는 풍부한 명령 줄 전통이 없었습니다.
이것은 Windows가하지 않는 것을 말하는 것이 아니다 이 명령 줄을하거나 많은 명령 줄 프로그램을 부족하다. Windows에는 요즘에는 PowerShell 이라고 불리는 매우 강력한 명령 셸이 있습니다.
그러나 이러한 명령 줄 전통의 부재로 인한 영향이 있습니다. DISKPART
대부분의 사람들은 컴퓨터 관리 MMC 스냅인을 통해 디스크 파티셔닝을 수행하기 때문에 Windows 세계에서는 거의 알려지지 않은 도구를 얻을 수 있습니다 . 그런 다음 파티션 작성을 스크립팅해야 할 때 DISKPART
실제로 다른 프로그램으로 구동되지는 않습니다. 예, 일련의 명령을 스크립트 파일에 작성하고을 통해 실행할 수는 DISKPART /S scriptfile
있지만 전혀 또는 아무것도 아닙니다. 당신이 정말 그런 상황에서 원하는 것이 더 같은 것입니다 GNUparted
와 같은 하나의 명령을 받아 들일 것이다 parted /dev/sdb mklabel gpt
. 이를 통해 스크립트는 단계별로 오류 처리를 수행 할 수 있습니다.
이 모든 것이 "모든 것이 파일"과 어떤 관련이 있습니까? 쉬운 방법 : 파이프 는 명령 줄 프로그램 I / O를 일종의 "파일"로 만듭니다. 파이프는 단방향 스트림 이며 일반 디스크 파일과 같은 임의 액세스 는 아니지만 많은 경우 그 차이는 없습니다. 중요한 것은 독립적으로 개발 한 두 개의 프로그램을 첨부하여 간단한 텍스트를 통해 통신 할 수 있다는 것입니다. 그런 의미에서 유닉스 웨이 를 염두에두고 설계된 두 프로그램 은 모두 통신 할 수 있습니다.
실제로 파일이 필요한 경우 프로그램 출력을 파일로 쉽게 전환 할 수 있습니다.
$ some-program --some --args > myfile
$ vi myfile
그러나 "모든 것이 파일입니다"라는 철학이 더 나은 방법을 제공 할 때 왜 출력을 임시 파일에 기록합니까? 해당 명령의 출력을 vi
편집기 버퍼 로 읽는 것만으로도 vi
직접 수행 할 수 있습니다. 로부터 vi
"정상"모드, 말 :
:r !some-program --some --args
그러면 해당 프로그램의 출력이 현재 커서 위치에서 활성 편집기 버퍼에 삽입됩니다. 후드 아래에서 vi
파이프를 사용하여 프로그램의 출력을 파일에서 읽는 데 사용하는 것과 동일한 OS 호출을 사용하는 비트 코드에 연결합니다. 의 :r
유무에 관계없이 두 가지 경우 !
모두의 일반적인 구현에서 동일한 일반 데이터 읽기 루프를 사용 하더라도 놀라지 않을 것 입니다 vi
. 나는하지 않는 좋은 이유를 생각할 수 없습니다.
이것은의 최근 기능이 아닙니다 vi
. 고대 ed(1)
텍스트 편집기로 되돌아갑니다.
이 강력한 아이디어는 유닉스에서 계속해서 나타납니다.
이에 대한 두 번째 예는 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
. 모든 곳에서 사용할 수 없기 때문 입니다.)
이 강력한 아이디어가 유닉스에 나타나는 세 번째 방법 gdb
은 Linux 시스템을 고려하십시오 . C 및 C ++로 작성된 모든 소프트웨어에 사용되는 디버거입니다. 다른 시스템에서 유닉스로 온 프로그래머들은 gdb
"아주 원시적입니다!" 그런 다음 GUI 디버거를 검색하고 존재하는 여러 가지 중 하나를 찾고 행복하게 작업을 계속합니다. 종종 GUI가 gdb
그 아래에서 실행되어 그 위에 예쁜 쉘을 제공 한다는 사실을 결코 깨닫지 못합니다 . 대부분의 Unix 시스템에는 경쟁하는 저수준 디버거가 없습니다. 프로그램이 해당 수준에서 경쟁 할 필요가 없기 때문입니다. 저수준 도구가 파이프를 통해 쉽게 통신한다면, 우리가 필요로하는 것은 저수준 도구를 기반으로 할 수있는 좋은 저수준 도구 중 하나입니다.
이것은 이제 문서화 된 디버거 인터페이스를 가지고 있다는 것을 의미 gdb
하지만 불행히도 주요 경쟁자 gdb
는 낮은 마찰 경로를 취하지 않았습니다 .
그럼에도 불구하고 최소한 미래의 일부 교체는 단순히 명령 줄 인터페이스를 복제하여 투명하게 떨어질 가능성 이 gdb
있습니다. Windows 상자에서 같은 것을 꺼내려면 대체 도구 작성자가 공식 플러그인 또는 자동화 API를 정의해야했을 것입니다. 즉, 일반적인 명령 줄 사용자 인터페이스와 완전한 프로그래밍 API를 모두 빌드하는 작업이 많기 때문에 가장 인기있는 프로그램을 제외하고는 발생하지 않습니다.
이 마술은 널리 퍼진 텍스트 기반 IPC 의 은혜를 통해 발생합니다 .
Windows 커널 에는 Unix 스타일의 익명 파이프가 있지만 일반적인 사용자 프로그램 이 명령 셸 외부 에서 IPC를 위해이를 사용하는 경우 는 거의 없습니다. 그것의 상단 별도로. 이로 인해 GUI없이 일부 작업을 수행 할 수 없게되는데, 이는 Linux에 비해 Windows 용 원격 데스크톱 시스템 이 너무 많은 이유 중 하나입니다 . Windows는 GUI없이 사용하기가 매우 어렵습니다.
반대로 SSH를 통해 원격으로 Unix, BSD, OS X 및 Linux 박스를 원격으로 관리하는 것이 일반적입니다. 어떻게 작동합니까? SSH는 파일과 같은 네트워크 소켓을 파일과 같은 의사 tty 에 연결 /dev/pty*
합니다. 이제 원격 시스템은 Unix Way와 완벽하게 연결되어 필요한 경우 SSH 연결을 통해 데이터를 파이프 할 수 있는 연결을 통해 로컬 시스템에 연결 됩니다.
이 개념이 얼마나 강력한 지에 대한 아이디어를 얻고 있습니까?
파이프 된 텍스트 스트림은 단방향이라는 점을 제외하고 프로그램의 관점에서 파일과 구별 할 수 없습니다. 프로그램은 파일 디스크립터를 통해 파일에서 읽는 것과 같은 방식으로 파이프에서 읽습니다 . FD는 유닉스의 핵심입니다. 파일과 파이프가 I / O에 대해 동일한 추상화를 사용한다는 사실은 무언가를 말해 줄 것입니다.
이러한 단순한 텍스트 통신 전통이없는 Windows 세계는 COM 또는 .NET을 통한 헤비급 OOP 인터페이스 와 관련이 있습니다. 이러한 프로그램을 자동화해야하는 경우 COM 또는 .NET 프로그램도 작성해야합니다. 이것은 유닉스 박스에 파이프를 설치하는 것보다 상당히 어렵습니다.
이러한 복잡한 프로그래밍 API가없는 Windows 프로그램은 클립 보드 또는 파일 / 저장과 같이 빈곤 한 인터페이스를 통해서만 통신 할 수 있습니다.
긴 답변, 3 부 : 레지스트리 및 구성 파일
Windows 레지스트리와 Unix Way of system 구성의 실질적인 차이점은 "모든 것이 파일입니다"라는 철학의 이점을 보여줍니다.
유닉스 타입 시스템에서는 파일을 검사하는 것만으로 명령 행에서 시스템 구성 정보를 볼 수 있습니다. 동일한 파일을 수정하여 시스템 동작을 변경할 수 있습니다. 대부분의 경우 이러한 구성 파일은 일반 텍스트 파일이므로 Unix의 모든 도구를 사용하여 일반 텍스트 파일로 작업 할 수있는 파일을 조작 할 수 있습니다.
레지스트리 스크립팅 은 Windows에서 그리 쉽지 않습니다.
가장 쉬운 방법은 한 컴퓨터에서 레지스트리 편집기 GUI를 통해 변경 한 다음 파일 을 regedit
통해 변경 내용을 다른 컴퓨터에 맹목적으로 적용하는 것*.reg
입니다. 조건부로 아무것도 할 수 없기 때문에 그것은 실제로 "스크립트"가 아닙니다. 그것은 전부 또는 아무것도 아닙니다.
레지스트리 변경에 많은 양의 논리가 필요한 경우 다음으로 가장 쉬운 옵션은 기본적으로 .NET 시스템 프로그래밍 을 배우는 PowerShell 을 배우는 것입니다. 유닉스에 Perl 만있는 경우와 같으며, 이를 통해 모든 임시 시스템 관리를 수행해야합니다. 이제 저는 펄 팬이지만 모든 사람이 아닙니다. 유닉스를 사용하면 일반 텍스트 파일을 조작 할 수있는 한 원하는 도구를 사용할 수 있습니다.
각주 :
계획 9 는 /net
가상 파일 시스템을 통해 네트워크 I / O를 노출시키는이 디자인 실수를 수정했습니다 .
Bash에는 일반 파일 시스템 기능을 통해 네트워크 I / O를 허용 하는 기능/dev/tcp
이 있습니다. 커널 기능인 Bash 기능이므로 Bash 외부 나 Bash를 전혀 사용하지 않는 시스템에서는 보이지 않습니다 . 이것은 반례로 파일 시스템을 통해 모든 데이터 자원을 볼 수있게하는 것이 좋은 이유를 보여줍니다.
"현대 Windows"란 Windows NT, Windows 2000, 모든 Windows Server 버전 및 XP 이후의 모든 데스크톱 지향 버전의 Windows를 포함한 Windows NT 및 모든 직계 후손을 의미합니다. 나는이 용어를 사용하여 DOS 기반 버전의 Windows (Windows 95와 그 직계 후손, Windows 98 및 Windows ME)와 16 비트 이전 버전을 제외합니다.
후자의 OS에 통합 I / O 시스템이 없다는 점을 구별 할 수 있습니다. ReadFile()
Windows 95 에서는 TCP / IP 소켓을 전달할 수 없습니다 . 소켓은 Windows 소켓 API에만 전달할 수 있습니다. Andrew Schulman의 주요 기사 인 Windows 95 : 이 주제에 대해 자세히 알아 보려면 내용을 참조하십시오 .
실수 /dev/null
하지 마십시오 NUL
. Windows 에서 표면적으로 동등한 것처럼 특수한 파일 이름이 아닌 Unix 유형 시스템의 실제 커널 장치입니다 .
Windows가 NUL
파일 을 만들지 못하게하려고하지만 Windows 의 파일 이름 구문 분석 논리를 속이는 것만으로도 이러한 보호 기능을 무시할 수 있습니다 . cmd.exe
또는 탐색기 를 사용하여 해당 파일에 액세스하려고하면 Windows에서 파일 열기를 거부하지만 예제 프로그램과 유사한 방법으로 파일을 열고 유사한 속임수를 통해 파일을 삭제할 수 있으므로 Cygwin을 통해 파일에 쓸 수 있습니다 .
대조적으로, 유닉스는 rm /dev/null
개발자가 쓰기 권한을 가지고있는 한 행복하게 해줄 것이며 /dev
, 그 dev 노드 는 단지 다른 파일 이기 때문에 속임수없이 새 파일을 그 자리에서 다시 만들 수있게 할 것이다. 해당 dev 노드가없는 동안 커널의 널 장치는 여전히 존재합니다. 를 통해 dev 노드를 다시 만들 때까지 액세스 할 수 없습니다 mknod
.
당신은 다른 곳에서 추가 널 dev 장치 노드를 생성 할 수 있습니다 : 그것은 당신이 그것을 호출하는 경우 중요하지 않습니다 /home/grandma/Recycle Bin
만큼이 널 장치에 대한 dev에 노드로, 그것은 정확히 같은 작동합니다 /dev/null
.
이 실제로 이 높은 수준 "형식 디스크"API는 Windows에서 : SHFormatDrive()
와 Win32_Volume.Format()
.
아주 좋은 두 가지가 있습니다 ... Windows 종류의 이유. 첫 번째는 일반적인 "디스크 포맷"대화 상자를 표시하도록 Windows 탐색기에 요청합니다. 즉, 최신 버전의 Windows에서는 작동하지만 사용자가 대화 형으로 로그인 한 상태에서만 작동합니다. 다른 하나는 사용자 입력없이 백그라운드에서 호출 할 수 있습니다. 그러나 Windows Server 2003까지는 Windows에 추가되지 않았습니다. 맞습니다. 핵심 OS 동작은 Unix가 mkfs
1 일부터 선적 된 세계에서 2003 년까지 GUI 뒤에 숨겨져있었습니다 .
내 유닉스 V5의 사본 1974을 포함 /etc/mkfs
하는 4136 바이트 정적으로 링크 PDP-11 실행. (Unix는 1980 년대 후반까지 동적 연결을 얻지 못했기 때문에 실제 작업을 수행하는 다른 곳의 큰 라이브러리는 아닙니다.) V5 시스템 이미지에 포함 된 소스 코드 /usr/source/s2/mkfs.c
는 완전히 독립적 인 457- 라인 C 프로그램. 아무 #include
진술 도 없습니다 !
즉 , 40 년 전의 Ken Thompsonmkfs
처럼 Unix와 동일한 도구 세트를 사용하여 실험 할 수 있습니다 . Windows로 시도하십시오. 오늘날 가장 근접한 것은 2014 년에 처음 릴리스 된 DOS 소스 코드 를 다운로드하는 것입니다.이 소스 코드 는 어셈블리 소스에 불과 합니다. 그것은 아마도 당신이 가지고 있지 않을 쓸모없는 도구로만 빌드 할 것이며 결국 거의 10 년 후 릴리스되었지만 1974 년 Unix V5 보다 훨씬 강력하지 않은 OS 인 DOS 2.0을 얻 습니다.
(유닉스 V5에 대해 왜 이야기해야합니까? 가장 초기의 완전한 유닉스 시스템이기 때문에 아직 초기 버전은 시간을 잃어버린 것 같습니다 . V1 / V2 시대의 유닉스를 하나로 묶은 프로젝트 가 있었지만 mkfs
존재에도 불구하고 누락 된 것으로 보입니다 위에 링크 된 V1 매뉴얼 페이지 중 일부는 어딘가에 존재했음을 증명합니다.이 프로젝트를 함께 만든 사람들 mkfs
은 포함 할 현존하는 사본을 찾을 수 없었습니다. 또는 파일이없는 파일을 찾을 find(1)
때 그 시스템에는 존재하지 않습니다. . :)
)
지금, 당신은 "내가 전화를 할 수는 format.com
없습니까? Windows mkfs
에서 Unix 를 호출하는 것과 동일하지 않습니까?" 아아, 아니, 여러 가지 이유로 동일하지 않습니다.
첫째, format.com
스크립트를 작성하도록 설계되지 않았습니다. "준비되면 ENTER 키를 누르십시오"라는 메시지가 표시됩니다. 입력에 Enter 키를 보내야합니다.
그런 다음 성공 / 실패 상태 코드 이상을 원하는 경우 읽기 위해 표준 출력을 열어야합니다. 이는 Windows보다 훨씬 복잡합니다 . (유닉스에서는 링크 된 기사의 모든 것을 간단한 popen(3)
호출 로 수행 할 수 있습니다 .)
이 모든 복잡한 문제를 겪은 format.com
결과는 mkfs
주로 인간이 소비하기위한 것 보다 컴퓨터 프로그램에 대한 출력을 분석하는 것이 더 어렵다 .
무엇을 추적 format.com
하면 DeviceIoControl()
, ufat.dll
등에 대한 복잡한 호출이 많이 발생합니다 . 단순히 장치 파일을 열고 해당 장치에 새 파일 시스템을 쓰는 것이 아닙니다. 이것은 당신이에서 얻을 디자인의 일종이다 12만6천명을 고용하는 회사 , 그리고 필요 유지 를 사용.
루프 장치에 관해서는 루프 장치가 Unix 유형 시스템간에 이식 가능하지 않기 때문에 일반적으로 Unix가 아닌 Linux에 대해서만 이야기합니다. OS X, BSD 등에는 비슷한 메커니즘이 있지만 구문은 약간 다릅니다 .
디스크 드라이브가 세탁기 크기 였고 부서장의 고급차보다 가격이 비싸던 시절에, 큰 컴퓨터 실습실은 현대 컴퓨팅 환경에 비해 전체 디스크 공간의 비율을 더 많이 공유했습니다. 원격 디스크를 로컬 파일 시스템에 투명하게 이식 할 수 있기 때문에 이러한 분산 시스템을 훨씬 쉽게 사용할 수 있습니다. /usr/share
예를 들어 여기가 있습니다.
원격 디스크는 일반적으로 드라이브 문자에 매핑되거나 로컬 파일 시스템에 투명하게 통합되지 않고 UNC 경로를 통해 액세스해야하는 대비 Windows입니다. 드라이브 문자는 기호 표현을위한 몇 가지 선택을 제공합니다. 않습니다 P:
bigserver에서에, 또는 소프트웨어 미러 서버의 "패키지"디렉토리에있는 "대중"공간을 참조하십시오? UNC 경로는 원격 파일이있는 서버를 기억해야한다는 것을 의미하며, 수백 또는 수천 개의 파일 서버가있는 대규모 조직에서는 어렵습니다.
NTFS 기호 링크 를 도입 한 2007 년에 출시 된 Windows Vista까지 Windows에서 심볼릭 링크를 얻지 못했습니다 . Windows의 심볼릭 링크는 1977 년 이후 Unix의 기능인 Unix의 심볼릭 링크보다 약간 더 강력 합니다. 로컬 경로뿐만 아니라 원격 파일 공유도 가리킬 수 있습니다. Unix는 1984 년 NFS를 통해 다르게 수행했습니다 . 이는 Unix의 기존 마운트 포인트 기능 위에 구축되었습니다 .
따라서 어떻게 보느냐에 따라 Windows는 약 2 ~ 30 년 동안 Unix를 추적했습니다.
그럼에도 불구하고 심볼릭 링크는 몇 가지 이유로 Windows 사용자 경험의 일반적인 부분이 아닙니다.
먼저, 뒤로 명령 행 프로그램을 사용해서 만 만들 수 있습니다 MKLINK
. Windows 탐색기 유닉스 등가물은 일반적 반면 당신은 Windows 탐색기에서 그들을 만들 수 없습니다 않습니다 당신이 심볼릭 링크를 만들 수 있습니다.
둘째, 기본 Windows 구성은 일반 사용자가 기호 링크를 작성 하지 못하도록 하여 명령 쉘을 관리자로 실행하거나 일반 사용자가 보지 못한 도구 의 불명확 한 경로 를 통해 사용자에게 명령 링크를 작성하도록 허용해야합니다. 사용하는 방법. (Windows의 대부분의 관리자 권한 문제와 달리 UAC는이 경우 도움이되지 않습니다.)
Linux 박스는 부팅 순서에서 항상 가상 디스크 이미지를 사용하지 않습니다. 있습니다 그것을 할 다른 방법의 무리 .
man ed
그런데 네트워크 소켓 디스크립터도 FD입니다.