“모든 것이 파일입니다”라는 평신도의 설명 —Windows와 다른 점은 무엇입니까?


36

"모든 것이 파일"이라는 것은 장치조차도 Unix 및 Unix와 같은 시스템에서 파일 이름과 경로를 가지고 있으며 이는 일반적인 도구를 그 특성에 관계없이 다양한 리소스에서 사용할 수 있다는 것을 의미합니다. 그러나 내가 작업 한 다른 OS 인 Windows와는 대조적입니다. 개념에 대한 기사를 읽었지만 개발자가 아닌 사람에게는 이해하기가 다소 어렵다고 생각합니다. 평신도의 설명은 사람들이 필요로하는 것입니다!

예를 들어, 카드 리더기에 부착 된 CF 카드에 파일을 복사하려면 다음과 같은 것을 사용합니다.

zcat name_of_file > /dev/sdb

Windows에서는 카드 리더가 드라이버로 표시 될 것이라고 생각하며 비슷한 작업을 수행 할 것입니다. 그렇다면 "모든 것이 파일입니다"라는 철학이 어떻게 다른 점이 있습니까?


2
평신도의 설명을 이미 이해하고있는 것 같습니다.
James Reinstate Monica Polk

전적으로 MS Windows와 비교하여 이점을 이해하고 싶습니다. 그리고 프로세스 간 통신에 대해서는 관여하지 않았습니다.
Mohamed Ahmed

이 예제로 판단하면 파일 시스템의 작동 방식을 잘 이해하지 못합니다. name_of_file적절한 파일 시스템 이미지가 아니라면 CF 카드를 난파했습니다 ...
Shadur

1
@Shadur 예, 파일 시스템 이미지입니다. wiki.ipfire.org/en/installation/…
Mohamed Ahmed

답변:


101

"모든 것이 파일입니다"는 약간 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 아키텍처 영역이 있습니다. 몇 가지 예 :

  1. 드라이버.

    Windows의 드라이버 하위 시스템은 Unix만큼 강력하고 강력하지만 드라이버를 조작하기위한 프로그램을 작성하려면 일반적으로 C 또는 .NET 코드 작성을 의미 하는 Windows Driver Kit 를 사용해야합니다 .

    Unix 유형 OS에서는 명령 줄에서 드라이버를 많이 사용할 수 있습니다. 원치 않는 출력을 /dev/null.³ 로 리디렉션하여이 작업을 수행 한 경우는 거의 확실합니다.

  2. 프로그램 간 통신.

    Windows 프로그램은 서로 쉽게 통신 할 수 없습니다.

    유닉스 커맨드 라인 프로그램은 텍스트 스트림과 파이프를 통해 쉽게 통신합니다. GUI 프로그램은 종종 명령 행 프로그램 위에 구축되거나 텍스트 명령 인터페이스를 내 보내서 동일한 간단한 텍스트 기반 통신 메커니즘도 GUI 프로그램과 함께 작동합니다.

  3. 레지스트리.

    유닉스에는 Windows 레지스트리와 직접적으로 동등한 것이 없습니다. 동일한 정보가 파일 시스템을 통해 흩어져 있으며 대부분은 /etc, /proc및에 /sys있습니다.

드라이버, 파이프 및 Windows 레지스트리에 대한 Unix의 대답이 "모든 것이 파일입니다"와 관련이있는 경우 계속 읽으십시오.

"모든 것이 파일입니다"라는 철학이 어떻게 다른 점이 있습니까?

위의 세 가지 사항을 자세하게 확장하여 설명하겠습니다.

긴 대답, 1 부 : 드라이브 및 장치 파일

CF 카드 리더기가 E:Windows 및 /dev/sdcLinux에서 와 같이 나타납니다 . 실질적인 차이점은 무엇입니까?

단지 사소한 구문 차이가 아닙니다.

리눅스에서는 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전달한 파일이나 노드에 기록합니다.

mkfsUnixy 시스템의 유형 프로그램은 장치와 일반 파일을 인공적으로 구분하지 않고 파일에서 작동 하기 때문에 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-DOSLAN 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를 통합했다면 netcatvs socatvs Ncatvs 엉망 이 없을 것입니다 . 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 -cFIFO (파일과 같은) 또는 /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 만있는 경우와 같으며, 이를 통해 모든 임시 시스템 관리를 수행해야합니다. 이제 저는 펄 팬이지만 모든 사람이 아닙니다. 유닉스를 사용하면 일반 텍스트 파일을 조작 할 수있는 한 원하는 도구를 사용할 수 있습니다.


각주 :

  1. 계획 9 /net가상 파일 시스템을 통해 네트워크 I / O를 노출시키는이 디자인 실수를 수정했습니다 .

    Bash에는 일반 파일 시스템 기능을 통해 네트워크 I / O를 허용 하는 기능/dev/tcp 이 있습니다. 커널 기능인 Bash 기능이므로 Bash 외부 나 Bash를 전혀 사용하지 않는 시스템에서는 보이지 않습니다 . 이것은 반례로 파일 시스템을 통해 모든 데이터 자원을 볼 수있게하는 것이 좋은 이유를 보여줍니다.

  2. "현대 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 : 이 주제에 대해 자세히 알아 보려면 내용을 참조하십시오 .

  3. 실수 /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.

  4. 이 실제로 높은 수준 "형식 디스크"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천명을 고용하는 회사 , 그리고 필요 유지 를 사용.

  5. 루프 장치에 관해서는 루프 장치가 Unix 유형 시스템간에 이식 가능하지 않기 때문에 일반적으로 Unix가 아닌 Linux에 대해서만 이야기합니다. OS X, BSD 등에는 비슷한 메커니즘이 있지만 구문은 약간 다릅니다 .

  6. 디스크 드라이브가 세탁기 크기 였고 부서장의 고급차보다 가격이 비싸던 시절에, 큰 컴퓨터 실습실은 현대 컴퓨팅 환경에 비해 전체 디스크 공간의 비율을 더 많이 공유했습니다. 원격 디스크를 로컬 파일 시스템에 투명하게 이식 할 수 있기 때문에 이러한 분산 시스템을 훨씬 쉽게 사용할 수 있습니다. /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는이 경우 도움이되지 않습니다.)

  7. Linux 박스는 부팅 순서에서 항상 가상 디스크 이미지를 사용하지 않습니다. 있습니다 그것을 할 다른 방법의 무리 .

  8. man ed

  9. 그런데 네트워크 소켓 디스크립터도 FD입니다.


7
흥미롭게도 cygwin은 /proc/registryMS Windows 의 의사 파일 시스템을 통해 Windows 레지스트리를 사용할 수있게합니다 (현재는 읽기 전용이지만) .
Stéphane Chazelas

-3

당신이 생각하는 경우 Linux는 AS 영어 의는 file systems있는 알파벳 기본적를위한 기초 블록입니다 영어는 .

에서 위키 파일 시스템의 페이지,

컴퓨팅에서 파일 시스템 (또는 파일 시스템)은 데이터 저장 및 검색 방법을 제어하는 ​​데 사용됩니다. 파일 시스템이 없으면 저장 영역에 배치 된 정보는 하나의 정보가 중지되고 다음 정보가 시작되는 위치를 알 수있는 방대한 양의 데이터가됩니다.

따라서 영어에 대한 적절한 언어 구조 (알파벳으로 만들어 짐)가없는 평신도 용어에서 인간의 상호 작용은 의미가 없습니다. 마찬가지로, 파일 시스템이 없으면 기본 스토리지 장치에있는 모든 데이터에 실제 의미가 없습니다.


초록이 아닙니다.이 답변은 짧습니다.
Mohamed Ahmed

@MohamedAhmed, 지금보십시오.
Ramesh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.