/dev/zero

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

/dev/zero는 유닉스 계열 운영체제에서 사용되는 특수 파일의 일종으로, 읽을 때 널 문자(0x00)를 반환하며 데이터 소스로 활용될 수 있다. 쓰기 동작은 성공하지만 아무런 영향을 미치지 않으며, 메모리에 매핑하면 익명 메모리를 사용하는 효과를 가진다. 1988년 SunOS 4.0에서 익명 메모리를 이용한 공유 라이브러리 매핑을 위해 도입되었으나, 이후 `MAP_ANONYMOUS` 플래그 지원으로 인해 사용 목적이 변화했다. `dd` 유틸리티를 사용하여 파일 시스템 파티션 데이터를 널 문자로 덮어쓰거나, 특정 크기의 파일을 생성하는 데 활용될 수 있으며, 희소 파일 생성에도 사용된다.

/dev/zero
📚 더 읽어볼만한 페이지
  • 장치 파일 - /dev/random
    /dev/random은 리눅스 커널에서 제공하는 난수 장치 파일로, 안전한 난수 생성을 위해 사용되며, 엔트로피 풀이 비어있을 경우 블로킹되는 특징을 가진다.
  • 장치 파일 - 널 장치
    널 장치는 Version 5 Unix에서 처음 소개된 특수 파일로, 의도하지 않은 출력 스트림을 버리거나 입력 스트림을 위해 빈 파일 역할을 하며, 유닉스 및 유닉스 계열 운영체제에서 메시지 출력을 제어하는 데 활용된다.
  • 유닉스 파일 시스템 기술 - 아이노드
    아이노드는 파일 시스템에서 파일의 메타데이터를 저장하는 자료 구조이며, 파일 소유자, 접근 권한, 파일 크기 등의 정보를 포함하고, 파일 시스템 드라이버가 파일 정보에 접근하도록 돕는다.
  • 유닉스 파일 시스템 기술 - 널 장치
    널 장치는 Version 5 Unix에서 처음 소개된 특수 파일로, 의도하지 않은 출력 스트림을 버리거나 입력 스트림을 위해 빈 파일 역할을 하며, 유닉스 및 유닉스 계열 운영체제에서 메시지 출력을 제어하는 데 활용된다.

2. 기능

/dev/zero는 읽기 요청 시 요청한 만큼의 널 문자(0x00)를 반환한다.

/dev/null과 달리 /dev/zero는 데이터의 소스(source)로 사용될 수 있다. /dev/zero에 대한 쓰기 동작은 성공하지만 아무런 영향을 미치지 않는다.

/dev/zero를 메모리에 매핑(mmap)하면 익명 메모리를 사용하는 것과 같은 효과를 가진다. (파일에 연결되지 않은 메모리)

3. 역사

`/dev/zero`는 익명 메모리를 사용하여 공유 라이브러리에 매핑 가능한 BSS 세그먼트를 허용하기 위해 1988년 SunOS-4.0에 도입되었다. HP-UX 8.x는 `/dev/zero`를 열 필요 없이 익명 메모리를 직접 매핑하는 mmap()에 MAP_ANONYMOUS 플래그를 도입했다. 1990년대 후반 이후, MAP_ANONYMOUS 또는 MAP_ANON은 대부분의 유닉스 버전에서 지원되어 `/dev/zero`의 원래 목적이 사라졌다.

4. 예

`dd` 유틸리티를 사용하여 파일 시스템 파티션의 데이터를 널 문자로 덮어씌워 삭제 (로우 레벨 포맷) 할 수 있다.

```bash
dd if=/dev/zero of=/dev/
```

널 문자로 채워진, foobar라는 이름의 1 MiB 파일을 생성할 수 있다.

```bash
dd if=/dev/zero of=foobar count=1024 bs=1024
```

블록 크기 값은 SI(십진)값으로 줄 수 있다. (예: GB, MB 등) 1 GB 파일을 생성하는 예시는 다음과 같다.

```bash
dd if=/dev/zero of=foobar count=1 bs=1GB
```

0바이트로만 채워진 읽기 파일을 만드는 대신 수많은 파일 시스템들은 또한 희소 파일의 생성도 지원하며, 이는 실제 공간을 덜 사용하면서 읽기 시 0을 반환한다.

`cp` 명령어를 사용하여 데이터를 삭제할 수 있다.

```bash
cp /dev/zero /dev/<대상 드라이브 또는 파티션>
```

(이것은 안전한 삭제를 수행하지 않으며, 데이터를 전혀 파괴하지 못할 수 있고, 필요한 시간보다 훨씬 더 오래 걸릴 수 있다. 이러한 목적으로는 TRIM을 지원하는 장치의 경우 blkdiscard와 같은 도메인별 도구가 선호될 수 있다.)

`head` 명령어를 사용하여 특정 크기의 파일을 생성할 수 있다. 널 문자로 채워진 1 MiB 파일 foobar 생성 예시는 다음과 같다.

```bash
head -c $(( 1024 * 1024 )) /dev/zero > foobar
```

실제로 0 바이트로만 채워진 파일을 만드는 대신, 많은 파일 시스템은 읽을 때 0을 반환하지만 실제 공간을 덜 사용하는 희소 파일 생성을 지원한다. 이를 수행하는 고전적인 방법 (도메인별 truncate 유틸리티 없이)은 1 GiB 파일을 만드는 것이다.

```bash
dd bs=1 seek=$(( 1024 * 1024 * 1024 - 1 )) count=1 < /dev/zero > foobar
```

이는 출력에서 위치 seek·bs=1GiB−1로 이동하여 /dev/zero에서 count·bs=1 바이트를 복사하여 파일에 하나의 데이터 블록만 포함하도록 한다.