Linux에서 저장 용어 및 개념 소개

소개

리눅스는 저장 장치를 관리하기 위한 견고한 시스템과 도구를 갖추고 있습니다. 이 기사에서는 리눅스가 이러한 장치를 어떻게 표현하고 원시 저장 공간을 서버에서 사용 가능한 공간으로 어떻게 변환하는지에 대해 전반적으로 다룰 것입니다.

블록 저장소란?

블록 저장소는 리눅스 커널에서 블록 장치라고 하는 것에 대한 다른 이름입니다. 블록 장치는 전통적인 회전하는 하드 디스크 드라이브(HDD), 솔리드 스테이트 드라이브(SSD), 플래시 메모리 스틱 등과 같은 데이터를 저장하는 데 사용할 수 있는 하드웨어입니다. 커널은 고정 크기의 블록 또는 공간의 청크를 참조하여 하드웨어와 상호 작용하기 때문에 블록 장치라고 불립니다.

다시 말해, 블록 저장소는 컴퓨터의 정규 디스크 저장소로 생각할 수 있습니다. 설정되면 현재 파일 시스템 트리의 확장으로 작동하며 각 드라이브에 정보를 쓰거나 읽을 수 있어야 합니다.

디스크 파티션은 무엇인가요?

디스크 파티션은 저장 드라이브를 작은 사용 가능한 단위로 나누는 방법입니다. 파티션은 드라이브 자체와 거의 동일한 방식으로 다룰 수 있는 저장 드라이브의 일부입니다.

파티션을 사용하면 사용 가능한 공간을 분할하고 각 파티션을 다른 목적으로 사용할 수 있습니다. 이를 통해 사용자는 단일 디스크를 여러 운영 체제, 스왑 공간 또는 특수 파일 시스템을 위해 분할할 수 있는 더 많은 유연성을 갖게 됩니다.

디스크를 파티션 없이 포맷하고 사용할 수는 있지만, 파티션 테이블을 찾을 것으로 예상하는 것이 일반적입니다. 심지어 디스크에 하나의 파티션만 작성되어 있더라도 말이죠. 일반적으로 새로운 드라이브를 파티션으로 나누는 것이 더 큰 유연성을 제공하기 때문에 이를 권장합니다.

MBR 대 GPT

디스크를 파티션하기 위해 사용할 파티션 포맷을 선택하는 것이 중요합니다. 일반적으로 MBR (Master Boot Record)과 GPT (GUID Partition Table) 사이에서 선택해야 합니다.

MBR은 30년 이상의 오래된 기술입니다. 그렇기 때문에 일부 제한 사항이 있습니다. 예를 들어, 2TB를 초과하는 디스크에는 사용할 수 없으며, 최대 네 개의 기본 파티션만 생성할 수 있습니다.

GPT는 MBR에 내재된 일부 문제를 해결하는 더 현대적인 파티션 구성 방식입니다. GPT를 실행하는 시스템은 디스크 당 훨씬 많은 파티션을 가질 수 있습니다. 이는 일반적으로 운영 체제가 부과하는 제한만큼만 제한됩니다. 게다가, GPT에는 디스크 크기 제한이 없으며 파티션 테이블 정보는 손상을 방지하기 위해 여러 위치에 사용할 수 있습니다. GPT는 또한 MBR 전용 도구와의 호환성을 위해 “보호 MBR”을 작성할 수도 있습니다.

대부분의 경우, GPT는 사용할 수 없는 운영 체제를 제외하고는 더 좋은 선택입니다.

포맷 및 파일 시스템

Linux 커널은 원시 디스크를 인식할 수 있지만, 사용하려면 포맷되어야 합니다. 포맷은 파일 시스템을 디스크에 작성하고 파일 작업에 대비하는 과정입니다. 파일 시스템은 데이터를 구조화하고 정보를 기록하고 디스크에서 검색하는 방식을 제어하는 시스템입니다. 파일 시스템이 없으면 표준 파일 시스템 작업을 위해 저장 장치를 사용할 수 없습니다.

다양한 파일 시스템 형식이 있으며, 각각은 운영 체제 지원을 포함한 트레이드 오프가 있습니다. 모두 사용자에게 유사한 디스크 표현을 제공하지만, 지원하는 기능과 플랫폼은 매우 다를 수 있습니다.

Linux에서 인기 있는 일부 파일 시스템은 다음과 같습니다:

  • Ext4: 가장 인기 있는 기본 파일 시스템은 Ext2와 Ext3의 후속인 Ext4입니다. Ext4 파일 시스템은 저널링이 되어 있으며, 레거시 시스템과의 하위 호환성이 있으며, 안정적이며, 성숙한 지원 및 도구를 갖추고 있습니다. 특수한 요구 사항이 없다면 좋은 선택입니다.
  • XFS: XFS는 성능과 대용량 데이터 파일에 특화되어 있습니다. 큰 파일을 처리하거나 대용량 디스크를 다룰 때 좋은 처리량 특성을 갖고 있습니다. 또한 실시간 스냅샷 기능을 갖고 있습니다. XFS는 메타데이터와 데이터를 함께 저널링하는 대신 메타데이터 저널링을 사용합니다. 이는 빠른 성능을 제공하지만 갑작스러운 전원 손실로 인해 데이터 손상이 발생할 수도 있습니다.
  • Btrfs: Btrfs는 현대적이고 기능이 풍부한 복사 기반 파일 시스템입니다. 이 아키텍처는 스냅샷 및 클론을 포함한 어떤 볼륨 관리 기능이 파일 시스템 레이어 내에 통합될 수 있게 합니다. Btrfs는 일부 소비자 및 상용 NAS(네트워크 연결 스토리지) 하드웨어에서 기본으로 사용되며, 전용 다중 디스크 배열에 인기가 있습니다.
  • ZFS: ZFS는 다른 복사 기반 파일 시스템 및 볼륨 관리자로서 강력하고 성숙한 기능 세트를 갖추고 있습니다. Btrfs와 직접적으로 경쟁하며 데이터 무결성 기능을 갖추고 있으며 대형 파일 시스템 크기를 다룰 수 있으며, 스냅샷 및 클론과 같은 일반적인 볼륨 기능을 갖추고 있으며, 중복성 및 성능 목적을 위해 볼륨을 RAID 및 RAID 유사 배열로 구성할 수 있습니다. ZFS는 라이센스 문제로 인해 논란이 있었지만, 상용 지원을 고려할 때 Btrfs와 크게 인기 차이가 없습니다.

게다가, Windows는 주로 *NTFSExFAT을 사용하며, macOS는 주로 HFS+APFS를 사용합니다. 일반적으로 다른 플랫폼에서 이러한 파일 시스템 형식을 읽고 때로는 쓸 수 있지만, 추가 호환성 도구가 필요할 수 있습니다.

Linux의 저장 장치 관리

/dev에서의 장치 파일

Linux에서 거의 모든 것은 파일 시스템 계층구조의 어딘가에 있는 파일로 표현됩니다. 이에는 저장 드라이브와 같은 하드웨어도 포함되며, 시스템에서는 /dev 디렉토리의 파일로 표현됩니다. 일반적으로, 저장 장치를 나타내는 파일은 sd 또는 hd로 시작하고 그 뒤에 문자가 옵니다. 예를 들어, 서버의 첫 번째 드라이브는 일반적으로 /dev/sda와 같은 형식입니다.

이러한 드라이브의 파티션들도 /dev 내에 파일로 표현되며, 드라이브 이름 뒤에 파티션 번호를 추가하여 표시됩니다. 예를 들어, 이전 예제의 드라이브의 첫 번째 파티션은 /dev/sda1입니다.

/dev/sd*/dev/hd* 장치 파일은 드라이브와 파티션을 참조하는 전통적인 방법을 나타내지만, 이러한 값들만 사용하는 것에는 상당한 단점이 있습니다. Linux 커널은 각 부팅 시 어떤 장치가 어떤 이름을 받을지 결정하므로 장치가 디바이스 노드가 변경될 수 있는 혼란스러운 상황이 발생할 수 있습니다.

이 문제를 해결하기 위해 /dev/disk 디렉토리에는 시스템의 디스크와 파티션을 더 일관적으로 식별하기 위한 다양한 하위 디렉토리가 포함되어 있습니다. 이러한 디렉토리에는 부팅 시 올바른 /dev/[sh]da* 파일로 되돌아가는 심볼릭 링크가 생성됩니다. 링크의 이름은 디렉토리의 식별 특성에 따라 지정됩니다 (예: 파티션 레이블에 대한 /dev/disk/by-partlabel 디렉토리). 이러한 링크는 항상 올바른 장치를 가리키므로 저장 공간의 정적 식별자로 사용할 수 있습니다.

/dev/disk 아래에는 다음과 같은 하위 디렉토리 중 일부 또는 모두가 존재할 수 있습니다:

  • by-label: 대부분의 파일 시스템은 디스크 또는 파티션에 임의로 지정된 사용자 지정 이름을 할당할 수 있는 라벨링 메커니즘을 가지고 있습니다. 이 디렉토리는 이러한 사용자 제공 라벨을 따라 이름이 지정된 링크로 구성됩니다.
  • by-uuid: UUID(Universally Unique Identifier)는 장치를 식별하기 위해 사용되는 긴 고유한 문자열입니다. 이는 일반적으로 사람이 읽을 수는 없지만, 시스템 간에도 거의 항상 고유하기 때문에 시스템 간 이동할 수 있는 저장 공간을 참조하는 데 UUID를 사용하는 것이 좋을 수 있습니다. 이는 명명 충돌이 덜 발생하기 때문입니다.
  • by-partlabelby-partuuid: GPT 테이블은 고유한 라벨과 UUID를 제공하며, 식별에 사용할 수도 있습니다. 이전 두 디렉터리와 유사한 방식으로 작동하지만 GPT 특정 식별자를 사용합니다.
  • by-id: 이 디렉터리에는 하드웨어 자체의 일련번호와 해당 하드웨어에 연결된 링크가 포함되어 있습니다. 장치를 시스템에 연결하는 방식에 따라 by-id 이름이 변경될 수 있으므로 완전히 지속적이지는 않습니다.
  • by-path: by-id와 마찬가지로 이 디렉터리는 저장 장치의 시스템 연결을 기반으로 합니다. 여기에 있는 링크는 장치에 액세스하는 데 사용되는 하드웨어에 대한 시스템의 해석을 사용하여 구성됩니다. 이는 장치를 다른 포트에 연결하면 값이 변경될 수 있으므로 by-id와 동일한 단점을 가지고 있습니다.

일반적으로 특정 장치를 지속적으로 식별하기 위해서는 by-label 또는 by-uuid가 가장 좋은 옵션입니다.

참고: DigitalOcean 블록 스토리지 볼륨은 운영 체제에 보고되는 장치 일련번호를 제어합니다. 이로 인해 by-id 분류가 이 플랫폼에서 신뢰할 수 있게 지속적으로 유지됩니다. 이는 DigitalOcean 볼륨을 참조하는 용도로 가장 권장되는 방법이며 최초 부팅 시 예측 가능하고 지속적으로 사용할 수 있습니다.

블록 장치 마운트하기

Linux 및 기타 Unix 유사 운영 체제에서는 물리적 장치의 수에 관계없이 전체 시스템이 단일 통합 파일 트리로 표시됩니다. 드라이브나 파티션의 파일 시스템을 사용하려면 기존 트리에 연결해야 합니다. 마운트는 포맷된 파티션이나 드라이브를 Linux 파일 시스템의 디렉토리에 연결하는 프로세스입니다. 그런 다음 해당 디렉토리에서 드라이브의 내용에 액세스할 수 있습니다.

드라이브는 거의 항상 빈 디렉토리에 마운트됩니다. 빈 디렉토리에 마운트하지 않으면 드라이브가 마운트 해제될 때까지 디렉토리의 일반적인 내용에 액세스할 수 없습니다). 마운트된 장치의 동작을 변경하기 위해 설정할 수 있는 여러 가지 마운트 옵션이 있습니다. 예를 들어 드라이브를 읽기 전용 모드로 마운트하여 내용이 변경되지 않도록 할 수 있습니다.

파일 시스템 계층 구조 표준은 일시적으로 마운트된 파일 시스템에는 /mnt 또는 그 하위 디렉토리를 사용하는 것을 권장합니다. 더 영구적인 저장소를 마운트할 위치에 대해서는 권장 사항이 없으므로 필요에 따라 원하는 체계를 선택할 수 있습니다. 많은 경우에는 영구적인 저장소에도 /mnt 또는 /mnt 하위 디렉토리가 사용됩니다.

/etc/fstab을 사용하여 영구적으로 마운트 생성하기

Linux 시스템은 부팅 프로세스 중에 어떤 파일 시스템을 마운트해야 할지 결정하기 위해 /etc/fstab (파일 시스템 테이블)이라는 파일을 사용합니다. 이 파일에 항목이 없는 파일 시스템은 다른 소프트웨어에 의해 스크립트되지 않는 한 자동으로 마운트되지 않습니다.

/etc/fstab 파일의 각 줄은 마운트해야 할 다른 파일 시스템을 나타냅니다. 이 줄에는 블록 장치, 연결할 마운트 포인트, 드라이브의 포맷, 마운트 옵션 및 몇 가지 다른 정보가 지정됩니다.

더 복잡한 저장소 관리

이러한 기본 기능으로 대부분의 사용 사례를 처리할 수 있지만, 여러 디스크를 결합하는 더 복잡한 관리 패러다임도 사용할 수 있습니다. 특히 RAID입니다.

RAID란?

RAIDredundant array of independent disks의 약자입니다. RAID는 드라이브를 그룹화하고 추가 기능을 제공하는 단일 유닛으로 관리할 수 있는 저장소 관리 및 가상화 기술입니다.

RAID 배열의 특성은 해당하는 RAID 레벨에 따라 다릅니다. RAID 레벨은 배열 내 디스크 간의 관계를 정의합니다. 일반적으로 사용되는 몇 가지 레벨은 다음과 같습니다:

  • RAID 0: 이 레벨은 드라이브 스트라이핑을 나타냅니다. 데이터가 배열에 기록될 때, 데이터는 분할되어 선형적으로 디스크들 사이에 분산됩니다. 이는 여러 디스크가 동시에 쓰기 또는 읽기를 수행하여 성능을 향상시킵니다. 단점은 하나의 드라이브 장애가 전체 배열의 데이터를 잃을 수 있다는 점입니다. 왜냐하면 어떤 하나의 디스크도 내용에 대한 충분한 정보를 포함하지 않기 때문에 재구축할 수 없습니다. 이러한 이유로 RAID 0은 일반적으로 제품화되지 않았지만 비교를 위한 기준으로 유용할 수 있습니다.
  • RAID 1: RAID 1은 드라이브 미러링을 나타냅니다. RAID 1 배열에 기록된 데이터는 여러 디스크에 동시에 기록됩니다. 주요 장점은 데이터 중복성으로, 미러의 양쪽 하드 드라이브 손실로부터 데이터를 보호합니다. 여러 드라이브에 동일한 데이터가 포함되므로 사용 가능한 용량은 적어도 절반으로 감소합니다.
  • RAID 5: RAID 5는 RAID 0와 유사하게 데이터를 여러 드라이브에 스트라이핑합니다. 그러나 이 레벨은 드라이브 사이에 분산 패리티를 구현합니다. 이는 하나의 드라이브가 실패할 경우, 남은 드라이브들이 패리티 정보를 사용하여 배열을 재구축할 수 있음을 의미합니다. 일반적으로 하나의 디스크를 재구축하는 데 충분하므로, 배열은 한 개의 디스크 손실을 견딜 수 있습니다. RAID 5는 배열의 사용 가능한 공간을 한 개의 디스크 용량만큼 감소시킵니다.
  • RAID 6: RAID 6는 RAID 5와 동일한 속성을 갖지만 이중 패리티를 제공합니다. 이는 RAID 6 배열이 2개의 드라이브 손실을 견딜 수 있다는 것을 의미합니다. 배열의 용량은 다시 패리티 양에 의해 영향을 받으며, 사용 가능한 용량은 2개의 디스크 공간만큼 감소됩니다.
  • RAID 10: RAID 10은 레벨 1과 0의 조합입니다. 먼저, 두 개의 미러된 배열 세트를 만듭니다. 그런 다음, 데이터가 이들에게 스트라이핑됩니다. 이는 일부 중복 특성을 갖으면서 좋은 성능을 제공하는 배열을 생성합니다. 그러나 이를 위해 상당수의 드라이브가 필요하며, 총 용량은 여전히 결합된 디스크 공간의 절반보다 작습니다.

다음으로 어디로 가야 할까요?

Linux 시스템에서 사용하려는 새로운 저장 장치가 있다면, 이 글은 새로운 파일 시스템의 파티션 생성, 포맷팅, 마운트 과정을 안내해줄 것입니다. 이는 주로 추가 용량을 추가하는 대부분의 사용 사례에 충분할 것입니다. 저장 관리 작업을 수행하는 방법을 알고 싶다면, Linux에서 저장 장치의 기본 관리 작업 수행 방법을 확인해보세요.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-storage-terminology-and-concepts-in-linux