[Linux] 파티션
Ubuntu 설치 시 디스크 파티션 나누기
Ubuntu 18.04를 재설치하며 루트 디렉터리 (/
) 와 홈 디렉터리 (/home
)의 파티션을 나누면서 겪었던 과정과 트러블 슈팅을 정리하여 공유합니다.
파티션을 나누면 좋은 이유#
홈 디렉터리가 별개의 스토리지나 파티션에 있다면 데이터를 잃지 않으면서 운영체제를 재설치하기가 간편해집니다. 재설치를 할 때 홈 디렉터리는 포맷하지 않고 운영체제가 담긴 파티션만 포맷 후 새 운영체제를 설치하는 것으로 끝나기 때문입니다.
참고: 디스크 파티션이란
디스크의 스토리지의 영역을 나누는 것을 “디스크 파티셔닝"이라고 부릅니다. 각 파티션의 위치와 크기는 디스크의 “파티션 테이블"이라는 곳에 저장됩니다. 운영체제는 디스크를 읽을 때 이 테이블을 가장 먼저 읽으며 각 파티션은 운영체제에게 논리적으로 독립된 디스크로 인식됩니다.
프로세스#
0. 백업하기#
중요한 데이터를 백업하는 것을 잊지 마세요.
1. 부팅하기#
USB 등 Ubuntu 설치 장치(Ubuntu Installation media)로 컴퓨터를 부팅합니다. 저는 UNetbootin로 만든 부팅용 Live USB(bootable Live USB drive)를 사용했습니다.
![Installation type](https://dreamgonfly.github.io/images/install-ubuntu-with-partition/KURnS.png)
BIOS/UEFI 모드로 진입해서 부트 메뉴에서 부트 로더를 선택합니다. 이 때 USB에 부트 로더가 BIOS와 UEFI 모드 두 종류 있는 것을 볼 수 있습니다. 제 경우에는 Samsumg Type-C 1100
(제가 가진 USB 이름)과 UEFI: Samsumg Type-C 1100
가 있었습니다. 이 중 UEFI 모드를 선택합니다.
2. 설치 유형 선택하기#
![Installation type](https://dreamgonfly.github.io/images/install-ubuntu-with-partition/KURnS.png)
설치 과정 중 4번째까지 진행하면 설치 유형 선택 창이 나타납니다. 이 과정이 제일 중요합니다. 파티션을 나누어 설치하기 위해서는 여기서 “Something else"를 선택합니다.
3. 파티션 나누기#
![Partitioning](https://dreamgonfly.github.io/images/install-ubuntu-with-partition/3DBJC.png)
/dev/sda
와 같은 이름의 스토리지를 볼 수 있습니다. 파티션을 처음부터 다시 나누고 싶다면 New Parition Table...
을 선택합니다. 이렇게 하면 모든 디스크 영역이 free space로 바뀌게 됩니다. 이미 있는 파티션을 수정하여 새 파티션을 만들 수도 있습니다.
참고: /dev/sda
의 의미
/dev/
는 device의 약자로 Unix에서 모든 장치 파일을 담고 있는 디렉터리입니다. Unix는 접근 가능한 모든 것을 읽고 쓸 수 있는 파일로 취급합니다.sd
는SCSI device
라는 뜻입니다. SCSI는 Small Computer System Interface의 약자로 하드 디스크 등 주변기기와 컴퓨터를 연결하기 위한 인터페이스입니다. 이후sd
는 데이터를 담는 모든 장치를 뜻하는 용어로 쓰이게 되었습니다.sda
,sdb
,sdc
등으로 장치를 구분합니다.
3-1. Swap 파티션#
![Swap Partition](https://dreamgonfly.github.io/images/install-ubuntu-with-partition/lNmDo.png)
Swap 파티션은 메모리가 부족하거나 컴퓨터가 잠자기 모드일 때 메모리 페이지를 담는 파티션입니다. 사용성을 위해 Swap 파티션을 만드는 것을 추천합니다. Swap 파티션의 크기는 메인 메모리 크기보다 커야 잠자기 모드를 사용할 수 있습니다. 또한, Swap 파티션의 위치는 디스크의 끝에 둘 수도 있지만 이 경우 속도가 느려집니다.
3-2 Root 파티션#
![Root partition](https://dreamgonfly.github.io/images/install-ubuntu-with-partition/f9AS5.png)
루트 파일 시스템 /
을 위한 파티션을 만듭니다. 이 곳에는 커널, 부트 파일, 시스템 파일, 커멘드 라인 유틸리티, 라이브러리, 시스템 설정과 로그 파일 등이 들어갑니다. 보통 10 ~ 20GB면 충분하지만 도커 이미지가 디폴트로 시스템 영역에 저장되기 때문에 저는 첨부된 사진보다 더 큰 영역을 할당했습니다. Root 파티션을 생성할 때 제가 쓴 파라미터들은 다음과 같습니다.
- Type for the new partition: Primary
- Location for the new partition: Beginning of this space
- Used as: Ext4 journaling file system
- Mount point: /
참고: Primary vs. Logical
파티션에는 Primary와 Logical 두 가지 유형이 있습니다. 가장 큰 차이는 primary 파티션만이 BIOS가 부트 로더를 찾는 위치로 지정할 수 있다는 것입니다. 즉, primary 파티션에서만 부팅할 수 있으므로 운영체제는 주로 primary 파티션에 담깁니다. 일반적으로, 디스크 드라이브는 최대 4개의 primary 파티션을 갖거나 3개의 primary, 1개의 extended 파티션을 가질 수 있습니다. Logical 파티션의 개수에는 제한이 없습니다.
![Logical vs. Primary](https://dreamgonfly.github.io/images/install-ubuntu-with-partition/logical-vs-primary-3.png)
참고로, parimary 파티션과 logical 파티션의 구분은 MBR 디스크에서만 존재합니다. GPT 디스크에는 primary 파티션만 있습니다.
3-3 Home 파티션#
Home 파티션을 만드는 방법은 Root 파티션과 동일합니다. 파일 시스템을 다른 형식으로 지정하는 것도 얼마든지 가능합니다. Home 파티션에는 모든 남은 스토리지 용량을 할당합니다.
3-4 EFI 파티션#
UEFI 모드로 설치할 때는 반드시 독립된 EFI 파티션이 필요합니다. 이 파티션은 FAT32 포맷으로 구성하고 300MB ~ 500MB 정도의 공간만 할당하면 됩니다.
ESP라고도 불리는 EFI System Partition은 컴퓨터가 부팅될 때 UEFI 펌웨어가 운영체제와 유틸리지를 시작하기 위해 필요한 파일들을 저장하는 곳입니다. ESP에는 부트 로더나 커널 이미지, 디바이스 드라이버, 운영체제 전에 실행되는 시스템 유틸리티 프로그램 등이 들어있습니다.
![EFI partition](https://dreamgonfly.github.io/images/install-ubuntu-with-partition/efi-partition.png)
참고로 BIOS 모드 설치 시에는 EFI 시스템 파티션 대신 /boot
디렉터리에 마운트된 ext4 형식의 파티션이 필요합니다.
3-5 부트 로더 설치 장치#
부트 로더를 설치할 장치는 디폴트로 둡니다. 직접 설정한다면 특정 파티션이 아니라 디스크 전체를 선택해야 합니다.
![Partitioning result](https://dreamgonfly.github.io/images/install-ubuntu-with-partition/psm5Z.png)
트러블 슈팅#
모든 일이 순조롭게 흘러간다면 이 블로그 글을 쓰는 일도 없었을 것입니다. OS 재설치를 하며 겪은 이슈들과 해결한 방법을 정리해 보겠습니다.
Separate Boot loader Code Error#
파티셔닝을 하고 설치를 진행 중에 다음과 같은 에러 메시지가 떴습니다.
“Ubuntu Error: The Partition table format in use on your disks normally requires you to create a separate partition for boot loader code. This partition should be marked for use as a Reserved BIOS boot area and should be at least 1MB in size. Fix this or else you will get errors during the Ubuntu Installation process”.
원인은 간단했습니다. UEFI가 아닌 BIOS를 통해 Ubuntu를 설치하려고 했기 때문입니다. Legacy Mode라고도 불리는 BIOS는 부팅을 하기 위해 독립된 Grub 파티션이 필요하기 때문에 위와 같은 에러가 생긴 것입니다.
해결 방법은 부트 메뉴에서 Ubuntu 설치를 시작할 때 UEFI 이름이 붙은 USB 장치를 선택하는 것입니다. USB를 꽂고 부트 메뉴를 시작하면 같은 USB가 두 가지 이름으로 있는 것을 볼 수 있습니다. 하나는 그냥 USB 이름이고 다른 하나는 UEFI라는 태그가 붙은 이름입니다. 그냥 USB 이름을 선택하면 BIOS 모드로 로딩합니다. UEFI 태그가 붙은 이름을 선택하면 UEFI 모드로 로딩합니다. 설치 과정을 취소하고 재시작한 뒤 UEFI 모드를 선택하면 됩니다.
grub-efi-amd64-signed failed#
설치가 거의 끝나갈 즈음에 다음과 같은 에러 메시지가 뜨며 설치가 중단되었습니다.
grub-efi-amd64-signed failed installation /target/ Ubuntu 18.04
이 에러는 여러 원인에 의해 발생할 수 있습니다. 제 경우에는 설치 USB를 굽기 전에 제대로 포맷하지 않았던 문제였습니다. USB를 포맷한 후 다시 Ubuntu 설치 장치를 만드니 에러가 해결되었습니다.
Turning off Secure Boot#
운영체제 설치 후, nvidia-smi
가 작동하지 않는 문제가 있었습니다. UEFI 설정에 Secure Boot가 Windows optimized로 되어 있어서 Other OS로 변경하니 이슈가 사라졌습니다.
Ubuntu Linux 파티션 설명
Ubuntu Linux 파티션도 주 및 논리 파티션으로 제공됩니다. 이 역시 4개의 주 파티션이나 주 및 논리 파티션의 조합으로 제한됩니다. 하지만 더 이상 비슷한 점은 없습니다.
첫 번째 파티션이 항상 주 파티션의 설치 파티션이 됩니다. 이 파티션은 루트 파티션이라고 부르거나 /로 표시됩니다. Ubuntu 설치 사용 및 구성 방법에 따라 여러 개의 파티션을 만들 수 있습니다. 루트가 가장 중요한 항목입니다. 그러나 이러한 파티션을 만들고 크기, 파일 형식 및 용도를 지정할 수 있습니다. 이 파티션의 /에 마운트해야 작동합니다.
Ubuntu Linux 파티션 범주
Ubuntu Linux에서는 이러한 파티션을 다음과 같이 두 가지 범주로 추가 구분합니다.
데이터 파티션
디렉터리 및 파일 또는 일반 Linux 시스템 데이터를 보관한다는 점에서 부팅 파티션과 비슷한 파티션입니다. 이는 컴퓨터를 시작하고 실행하는 파일입니다.스왑 파티션
파티션을 캐시로 사용하여 컴퓨터의 물리적 메모리를 확장하는 파티션입니다.
Ubuntu Linux 설치에 사용되는 파티션 유형
Ubuntu에 사용되는 몇 가지 일반적인 파티션이 있습니다. 아래의 목록에서 각 파티션에 대한 정보를 제공합니다. 숙련된 Linux 사용자는 이러한 파티션 중 일부를 조합하여 구성표로 사용합니다. 이는 특정 용도를 위해 맞춤형 Ubuntu 설치를 사용한다는 것을 알고 있는 경우입니다. 이러한 특정 파티션을 사용하면 더욱 쉽고 효율적으로 사용할 수 있습니다. 가장 흔한 일반 설치에 필요한 파티션 조합을 나열합니다. 그러나 이 구성표를 사용할 경우 위의 자동 설치 가이드를 사용하는 것이 좋습니다.
참고: 원래 파티션이 다른 것은 재해 발생 시 데이터 보안을 더 높게 유지하기 위함이었습니다. 사고가 발생하면 발생한 파티션의 데이터만 영향을 받습니다. 다른 파티션의 데이터는 그대로 남아 있을 가능성이 높습니다. 이 기능은 전원 장애 또는 갑작스런 스토리지 손실에 대해 파일 시스템을 저널링한 후에도 어느 정도 유지될 수 있습니다. 불량 블록과 논리적 오류는 계속 발생할 수 있습니다. 이 문제를 해결할 수 있는 유일한 방법은 RAID 솔루션이며, 이 솔루션은 여기에서 설명하지 않습니다.
파티션 이름 | 설명 |
---|---|
/ | 슬래시(/)만 있는 경우는 파일 시스템 트리의 루트를 나타냅니다. |
/bin | 바이너리를 뜻하며 모든 사용자에게 필요한 기본 유틸리티가 있습니다. |
/boot | 여기에는 부팅 프로세스에 필요한 모든 파일이 있습니다. |
/dev | 디바이스를 뜻하며 주변 기기 및 의사 디바이스(pseudo device)에 대한 파일을 포함합니다. |
/etc | 컴퓨터 및 컴퓨터 데이터베이스에 대한 구성 파일을 포함합니다. |
/home | 사용자에 대한 모든 홈 디렉터리를 보관합니다. |
/lib | 시스템 라이브러리이며 커널 모듈과 장치 드라이버 등의 파일이 있습니다. |
/lib64 | 시스템 라이브러리이며 64비트 컴퓨터용 커널 모듈 및 디바이스 드라이버 등의 파일이 있습니다. |
/media | USB 드라이브와 미디어 플레이어와 같은 이동식 디바이스에 대한 기본 마운트 지점입니다. |
/mnt | 마운트를 뜻하며 파일 시스템 마운트 지점을 포함합니다. 다중 하드 드라이브, 다중 파티션, 네트워크 파일 시스템, CD ROM 등에 사용됩니다. |
/opt | 추가 기능 소프트웨어가 포함되어 있습니다. 대용량 프로그램을 /usr 대신 여기에 설치할 수 있습니다. |
/proc | 파일로 프로세스 정보를 설명하는 가상 파일 시스템이 있습니다. |
/sbin | 시스템 바이너리를 뜻하며 컴퓨터를 시작, 유지 보수, 복구하는 데 필요한 기본 유틸리티가 있습니다. |
/root | 컴퓨터 관리자 루트의 홈 위치입니다. 이 계정 홈 디렉터리는 일반적으로 첫 번째 파티션의 루트입니다. |
/srv | 컴퓨터에서 제공하는 서비스에 대한 데이터인 서버 데이터입니다. |
/sys | 하드웨어 운영 체제와 관련된 정보를 보관하는 sysfs 가상 파일 시스템이 포함됩니다. |
/tmp | 임시 파일을 저장하는 곳입니다. 부팅 시 마운트된 tmpfs 또는 시작 시 스크립트는 이 옵션을 지웁니다. |
/usr | 시스템에 치명적이지 않은 실행 파일 및 공유 리소스를 보관합니다. |
/var | 변수(variable)를 나타내며 변경 가능한 상태의 파일을 위한 장소입니다. (예: 크기가 증가 및 감소하는 경우) |
/swap | 스왑 파티션은 하드 드라이브의 일부를 지정하여 시스템 메모리를 확장하는 곳입니다. |
가장 일반적인 파티션 체계
이름 | 권장 파티션 공간 |
---|---|
/home | 다른 파티션 또는 두 번째 드라이브를 만든 후에 남은 여유 공간입니다. |
/usr | 최소 20GB |
/var | 2GB |
/lib | 5GB |
/boot | 250MB |
/opt | 500MB~5GB |
/etc | 250MB |
/sbin | 250MB |
/bin | 250MB |
/dev | 250MB |
/srv | 100MB |
/tmp | 이 값은 스왑 파티션의 크기와 일치시킵니다. |
/mnt | 8KB 임시 파일을 위한 마운트 지점으로 사용되는 빈 파티션입니다. |
/media | 8KB CD 및 USB 플래시 드라이브와 같은 이동식 미디어의 마운트 지점을 위한 하위 디렉토리가 포함됩니다. |
/swap | 개인 컴퓨터에 있는 RAM 용량의 두 배입니다. |
다른 구성표와 여러 가지 이유로 인해 디렉토리가 파티션으로 분할되지 않습니다. 특정 프로세스를 간소화하기 위해 특정 파티션을 만드는 이유는 여러 가지가 있습니다. 맞춤형 설치를 원한다면 이를 진행하는 방법은 사용자에게 달려 있습니다. 모든 것이 사용자가 컴퓨터를 사용하려는 용도에 달려 있습니다.
참고: 파티션을 만든 후에는 더 추가하기만 하면 됩니다. 기존 파티션의 크기나 속성을 변경할 수는 있지만 권장하지 않습니다. 이들 파티션의 현재 기본 파일 시스템은 Ext4입니다.
이러한 설정을 위해 Dell 기술 지원의 도움이 필요한 경우 대신 운영 체제 제조업체에 문의하는 것이 좋습니다. 이러한 유형의 지원은 기존 보증에 포함되지 않습니다. OS(Operating System) 개발자만 이 주제에 대한 질문에 답변할 수 있습니다. 이들은 해당 OS에 대해 인정받은 전문가입니다.
디렉토리
Ubuntu Linux의 디렉토리는 간단히 말해 파일을 포함하는 폴더입니다. 위의 섹션에서 파티션에 사용되는 용어들과 어느 정도 겹치는 부분이 있습니다. 그 이유는 Linux가 디렉토리를 별도의 파티션으로 분할하기 때문입니다. 이를 통해 각 공간에 공간을 할당하여 데이터 손실을 대부분 방지할 수 있습니다. 한 파티션이 응답하지 않거나 손실이 발생해도 다른 파티션에는 영향이 주지 않기 위해서입니다. 주로 과거에 Ext3 및 Ext4와 같은 JFS 덕분에 이렇게 할 수 있었습니다. 분리된 파티션이 /로 마운트된 다음에는 그 아래의 디렉토리로 나타납니다.
Ubuntu Linux 컴퓨터에서 디렉토리를 가장 쉽게 생각할 수 있는 방법은 트리의 분기로 생각하는 것입니다. 여기서 트리의 트렁크는 첫 번째 파티션의 루트 디렉토리입니다. 다른 모든 디렉터리가 이 트렁크에 분기로 마운트됩니다. 각 분기마다 목적이 있지만 트렁크를 통해 서로 상호 작용하며 주요 분기에서 하위 디렉토리 분기를 갖습니다.
참고: 완전히 정확한 Ubuntu 내용은 아닙니다. 형식을 보다 잘 이해하고 예외 사항이 발생하는 상황을 스스로 파악할 수 있을 정도면 됩니다.
디렉터리 이름 | 콘텐츠 |
---|---|
/bin | 컴퓨터, 시스템 관리자 및 사용자가 공유하는 공통 프로그램이 포함됩니다. |
/boot | 여기에는 시작 파일과 커널(vmlinuz)이 있습니다. 일부 최신 배포에는 GRUB 데이터도 있습니다. GRUB는 Grand Unified Boot Loader의 약자입니다. |
/dev | 모든 CPU 주변 장치 하드웨어에 대한 참조가 있습니다. 특수 속성이 있는 파일로 표시됩니다. |
/etc | 가장 중요한 시스템 구성 파일이 있습니다. 이 디렉토리는 Windows의 제어판과 비슷합니다. |
/home | 일반 사용자의 홈 디렉터리입니다. |
/initrd | 일부 배포의 부팅에 대한 정보가 있습니다. 제거하지 마십시오. |
/lib | 라이브러리 파일이 있습니다. 사용자에게 필요한 모든 종류의 프로그램에 대한 파일을 포함합니다. |
/lost+found | 파티션마다 상위 디렉토리에 lost+found가 있습니다. 장애가 발생한 동안에 저장된 파일이 여기에 있습니다. |
/misc | 기타 용도로 사용됩니다. |
/mnt | 미디어 플레이어, 디지털 카메라 및 CD ROM과 같은 외부 파일 시스템에 대한 표준 마운트 지점입니다. |
/net | 전체 원격 파일 시스템에 대한 표준 마운트 지점입니다. |
/opt | 타사 소프트웨어와 필요한 모든 추가 파일이 일반적으로 여기에 보관됩니다. |
/proc | 시스템 리소스에 대한 정보가 포함된 가상 파일 시스템입니다. 터미널 창에 man proc 명령을 입력하여 proc에 있는 파일의 의미에 대한 자세한 정보를 확인할 수 있습니다. proc.txt 파일에서는 가상 파일 시스템을 자세하게 설명합니다. |
/root | 시스템 관리자 사용자의 홈 디렉터리입니다. 루트 디렉토리인 /와 루트 사용자의 홈 디렉토리인 /root의 차이를 알아야 합니다. |
/sbin | 시스템 관리자가 사용하는 프로그램이 있습니다. |
/tmp | 컴퓨터에서 사용하는 임시 공간입니다. 정기적으로 지워지기 때문에 보관하려는 항목을 여기에 두면 안 됩니다. |
/usr | 모든 사용자 관련 프로그램에 대한 프로그램, 라이브러리, 문서가 있습니다. |
/var | 사용자가 생성한 임시 파일과 모든 변수 파일이 저장되는 스토리지입니다. 로그 파일, 메일 대기열, 인쇄 스풀러 영역, 인터넷 캐시 공간 등의 항목입니다. CD/DVD를 굽기 전에 이미지를 보관합니다. |
시스템 관련 운영을 해야 한다면 가장 많이 하는 것이 '디스크 관리'.
하드 디스크 추가 설치 절차 (아주 아주 중요)
1) 사용하지 않는 데이터를 삭제한다.
2) 새 디스크를 장착한다.
디스크 장착 확인 방법
# cat /proc/scsi/scsi (스카시 : 디스크가 연결되는 인터페이스(구멍)의 종류)
# lsscsi (더 깔끔하게 보여줌)
# lsblk (트리 구조처럼 더 깔끔하게 보여줌)
3) 파티션을 생성한다.
- 하드파티션
- LVM
4) 파일 시스템을 생성(포멧)한다.
5) 파일 시스템을 마운트한다.
cat /proc/scsi/scsi 명령어 결과
![](https://blog.kakaocdn.net/dn/CjG2k/btq8ZPRWPPO/3DHTm7gW7jLekeY66zF3n0/img.png)
lsscsi 명령어 결과
![](https://blog.kakaocdn.net/dn/nV4sW/btq810FRC2z/uuZvmxzMf1VYdP4wqskg40/img.png)
lsblk 명령어 결과
![](https://blog.kakaocdn.net/dn/bA1yFb/btq85foj8Q9/Kk69QAk8xxg5qDKFySWEu1/img.png)
* device file * : 장치에 대한 접근 정보를 가지고 있는 핸들러, 이 장치 파일을 씀으로써 우리는 장치의 위치, 드라이브 종류 등등을 굳이 알지 않아도 된다. 아래 주소 등을 장치인 것처럼 명령어로 입력하면, OS가 장치로 입출력을 해준다.
![](https://blog.kakaocdn.net/dn/BYaQz/btq86gAco0X/HMF7Gt9T8H1Gu9fxksH4Yk/img.png)
device file의 이름 규칙
IDE(P-ATA) -----------> S-ATA, SAS(Serial Attached SCSI)
/dev/hda /dev/sda
/dev/hdb /dev/sdb
/dev/hdc /dev/sdc
/dev/hdd /dev/sdd
파티션을 분할한 디스크에서는 /dev/sdb1 , /dev/sdb2 처럼 이름 뒤에 고유의 번호가 붙는다.
(고유의 번호는 항상 규칙적이진 않다. 중간에 번호가 건너뛰어질 수도 있다.)
1) 하드파티션 (과거 사용 개념, 현재는 트렌드에 뒤쳐짐)
파티션 종류
- primary partition (주 파티션) : 기본적으로 제공되는 파티션, 최대 4개까지 생성 가능, 파티션 번호 1~4
- extend partition (확장 파티션) : 4개 이상의 파티션 생성을 위해 만드는 것, 파티션 번호1~4,
논리 파티션으로 재구간 분할 사용 가능
- logical partition (논리 파티션) : 확장 파티션을 재분할, 파티션 번호 5번 이상부터 사용 가능, 최대 12개 파티션
--> 전체 사용 가능한 파티션 15개
참고 ) 파티션을 직접 분할하기 때문에 MBR이라는 곳에 파티션을 분할한 정보(테이블)를 저장한다.
MBR(Master Boot Record)는 partition table이라고 하며, 디스크 파티션 분할 정보를 저장하는 일종의 헤더이다.
fdisk ( by MS, 1983 )
# fdisk 디스크이름
fdisk sub-command
m (menu) : fdisk 사용 방법
p (print) : 현재 디스크의 파티션 정보 출력
n (new) : 디스크에 새로운 파티션 생성
d (delete) : 디스크의 파티션 삭제
q (quit) : 메모리에 있는 파티션 변경 정보를 저장하지 않고 fdisk 종료
w (write) : 파티션 변경 정보를 디스크에 저장하고 fdisk 종료
![](https://blog.kakaocdn.net/dn/zRPFD/btq85fu76US/P42PHaHnwkVzD6MlItTauK/img.png)
![](https://blog.kakaocdn.net/dn/blov3z/btq85fWacf7/6sz6MY4XiRUosIfHO6sus0/img.png)
MB : 1000b = 1kb
MiB : 1024b = 1kb
![](https://blog.kakaocdn.net/dn/beWjsp/btq84PweJCv/fbqxdSi8nsfQ1sdI3jrtSk/img.png)
![](https://blog.kakaocdn.net/dn/3taIr/btq84g9kGFr/S8NrQmkFMKq4rAx2qZDTw0/img.png)
![](https://blog.kakaocdn.net/dn/AXDK2/btq85EnSdRA/Fu89yqoJFyGkXjCV5XN5B1/img.png)
![](https://blog.kakaocdn.net/dn/k4lxw/btq85CwPMis/ytutlPM1L9J17JJsWSoOlk/img.png)
모두 끝내고 q 명령어를 입력하면 메모리에만 있던 파티션 정보가 디스크에 적용되지 않고 없어진다.
그러므로 w 명령어로 디스크에 적용시키고 종료해야 한다.
![](https://blog.kakaocdn.net/dn/b0v6SA/btq84JJZpZC/qccqeQFxdxrNsJwK18eaD1/img.png)
![](https://blog.kakaocdn.net/dn/cFJC6S/btq83jk0cvc/RxwzgXkuJNj0eL8WqcDdI1/img.png)
dev(디바이스)파일이 생성되지 않으면 우리는 사실 분할된 파티션들을 사용할 수 없다.
파티션 분할하고 정보를 저장하면 자동으로 디바이스 파일이 생성되지만, 종종 그렇지 않은 경우 partprobe 라는 명령어를 사용하여 디바이스 파일을 생성한다. 그래도 생성이 안되는 최후의 경우에는 재부팅을 해야 한다.
2) LVM (IBM이 90년대 중반 처음 만듦, LVM은 데이터가 많은 서비스에서 거의 무조건 사용)
fdisk와 같은 하드 파티션의 문제
1) 파티션의 확장/축소가 매우 매우 어렵다.
2) 디스크의 공간을 유연하게 관리하기 어렵다. (disk를 논리적으로 합치기 어렵다)
이러한 문제 상황에서 LVM(Logical Volume Manager)이 등장했다.
논리 볼륨 관리자라는 뜻으로, 우리가 사용하는 물리적인 디스크를 논리적인 단위로 관리할 수 있도록 하는 개념
LVM은 뛰어난 확장성을 갖고 있다. 또한 downtime(서버 다운 시간)도 발생하지 않는다.
안전성(자동 이중화)과 효율(분산 처리)도 가진다. (그리하여 최근 LVM은 서비스에서 무조건적인 것)
LVM Object(객체)
PV (Physical Volume) : 물리적인 디스크
VG (Volume Group) : PV들을 논리적으로 묶은 그룹 단위
LV (Logical Volume, LVOL) : VG 안에서 나눠진 논리적 파티션
PE (Physical Extent) : VG의 파티션을 나누기 위한 최소 단위
아래는 LVM을 통한 디스크 추가 절차(파티션 구성 및 파일시스템 생성 절차)이다.
![](https://blog.kakaocdn.net/dn/Ha3x6/btq85UK7sYP/hmCgDsjhPZExYaQ058xWy0/img.png)
![](https://blog.kakaocdn.net/dn/dPg5kJ/btq85mA7fQP/26LKu4hqwZbposxTtXvQOK/img.png)
![](https://blog.kakaocdn.net/dn/rvSu5/btq84QblgWr/tTlPvxFFJCJlQSry1rjiT1/img.png)
# pvcreate : PV(LVM용 디스크) 초기화하는 명령
![](https://blog.kakaocdn.net/dn/ci1vQG/btq89uLA8ek/Kr7SKoO9gKPsKSFCpJC7aK/img.png)
![](https://blog.kakaocdn.net/dn/cbk67s/btq839P4jBU/uGIw7FIA7ePRiZKjq13M6K/img.png)
![](https://blog.kakaocdn.net/dn/WtIyC/btq8741cQji/1Y3vk4Vb2eWt8s2FsHpMHK/img.png)
# vgcreate vg이름 묶을디스크 : VG(볼륨 그룹) 만드는 명령어
![](https://blog.kakaocdn.net/dn/bbWiwS/btq89uSnmhU/E9bUw4tWXF87uzQ1JInbT1/img.png)
![](https://blog.kakaocdn.net/dn/9XpOL/btq88zzScU1/kTE1saLuTl4wd0ss7wdDE0/img.png)
# lvcreate -n 이름 -L 크기(MB가 default) 볼륨그룹 : 크기 이름으로 볼륨그룹에 LV 만들기
![](https://blog.kakaocdn.net/dn/cO9o6n/btq89NEbM63/xmuHzjj1Xx9K5fnjhRukc0/img.png)
장치에 접근을 하려면 device file이 필요하다.
Logical Volume은 논리적 볼륨이지만, 운영체제에서 접근을 하려면 장치로 인식되기 때문에
Logical Volume도 device file이 필요하다.
디바이스 파일의 주소
1) /dev/vg_name/lv_name
---> /dev/vgtest/yumifs
2) /dev/mapper/vg_name-lv_name
---> /dev/mapper/vgtest-yumifs
![](https://blog.kakaocdn.net/dn/snyPW/btq84s2Uq3E/vPWQbvfUqpQgSV8lKlkHIK/img.png)
![](https://blog.kakaocdn.net/dn/dJPpyF/btq89di3UeE/D3vltwsJRAFbyWCMvUbWek/img.png)
![](https://blog.kakaocdn.net/dn/efZ41F/btq873uwSFy/HmKjXF2TJPXXUFHKc6E5mk/img.png)
![](https://blog.kakaocdn.net/dn/xOcva/btq89kbhc9B/DZowA4UKMh1QZsur5schk0/img.png)
![](https://blog.kakaocdn.net/dn/qUcW4/btq88KVAdTG/qKEU52HvTHFsM8hhGM7Fxk/img.png)
VG 확장
![](https://blog.kakaocdn.net/dn/ba7KB8/btq88LfU1bW/BTkU9o5VYLSqKvvxcAx9Fk/img.png)
![](https://blog.kakaocdn.net/dn/bN07A5/btq89L0J2oP/nAXMvsA2GcnWOQYQrSMMWK/img.png)
![](https://blog.kakaocdn.net/dn/dw88T5/btq89NjWOHQ/3wAfonZ3SMtMAOg33hrQe0/img.png)
LV 확장
![](https://blog.kakaocdn.net/dn/115xD/btq88y8Ump7/OaFHyXmUPu5hV4qkoS1hM1/img.png)
![](https://blog.kakaocdn.net/dn/1ORSz/btq85DJ6h1h/bUYKoKW3ytvdwTI4Cw4w2K/img.png)
파일 시스템 확장 (온라인 중에 가능)
![](https://blog.kakaocdn.net/dn/kwTZQ/btq85Eberv1/V5DkFkreDXCKuoRxnPDUSK/img.png)
파일 시스템 축소 작업 --> 온라인 중에 불가능
e2cfsck : 축소하려는 파일 시스템에 문제가 없다는 검증 절차
![](https://blog.kakaocdn.net/dn/HCJ2A/btq84tHAL9G/nkyhw6XkAgHMjpd14arCpk/img.png)
![](https://blog.kakaocdn.net/dn/NieN7/btq88xPJxAt/6nBXdNkVdpMW8XEj19KSh0/img.png)
LV 확장한 후 파일 시스템 확장해야 함.
파일 시스템을 축소한 후 LV 축소해야 함. (항상 FS <= LV)
![](https://blog.kakaocdn.net/dn/UOJWL/btq85CEvBiw/5l27ZZjIXeryVgWGvpi10K/img.png)
확장했던 LV에 FS 구조 데이터가 남아있어서 경고가 뜬다.
FS 크기가 LV보다 작거나 같기만 하면 되기 때문에 y 입력해준다.
VG를 축소해주는 명령어 vgreduce (VG에서 안 쓰는 PV를 빼내는 것)
![](https://blog.kakaocdn.net/dn/c9EMzb/btq88ztgNdP/roDL2Sm43LJXx6yp2bn9Kk/img.png)
![](https://blog.kakaocdn.net/dn/bAtqCs/btq88zfJVxe/XREE1n39W4SZPL8EApzhA1/img.png)
![](https://blog.kakaocdn.net/dn/bEtQTn/btq869V84px/zOecGbHD8pKmOfKQBQZYD0/img.png)
![](https://blog.kakaocdn.net/dn/dlDFnu/btq89L7BXgK/nGEW5DnNVhaukKyZeK8YR0/img.png)
![](https://blog.kakaocdn.net/dn/csGLfA/btq89MMcxU0/ZuuOfDNp2P3xNKNDLlRZq1/img.png)
파일시스템이란 트리라는 논리적인 위치 정보(/etc/passwd)를 실제 데이터가 저장된 위치로 전환할 주소록이다.
파일시스템이 Tree라고 하는 논리적인 구조 안의 위치 정보를 가지고 있다가,
우리가 파일을 요청하면 파일시스템이 디스크의 실제 위치(실제 주소 번지)에서 가져온다.
(우리가 파일들의 실제 주소 번지를 다 외우지 못하기 때문에 사용)
윈도우의 파일시스템은 NTFS(New Technology File System), FAT32... 등이 있다.
리눅스의 파일시스템은 ext2, ext3, ext4... xfs 등을 사용한다.
디스크를 파일시스템으로 포맷하지 않으면 데이터를 파일 형태로 쓰지 못한다.
파티션 파일시스템 생성 --> 포멧
포멧은 데이터를 지우는 것이 아니라, 주소록(위치 정보 목록)을 초기화해서 접근하지 못하게 하는 것이다.
우리가 데스크탑에서 데이터를 삭제해도 디스크에는 데이터들이 그대로 남아있다.
(이러한 데이터를 지우기보단 덮어쓰기 위해 zeroning 등을 한다. 또는 디스크를 물리적으로 파손시킨다.)
리눅스의 파일 시스템 종류
1) ext (extended file system) : 리눅스 전용으로 개발된 파일 시스템 (리눅스에 최적화)
ext1 : 현재 리눅스에서 지원하지 않음 (성능 느림)
ext2 : ext1 성능 개선
ext3 : ext2 + 저널링(journaling, 매일매일 기록하는 것 = 파일 시스템 구조 정보 변경 사항 로그에 기록) 추가
(저널링이 없었던 ext2에서는 업데이트하다 중단되면 모두 찾아 복원(roll back, roll forward)을 해야 한다.)
(장애 이후 파일 시스템 복구 시간 단축을 위해 저널링 사용(현재 모든 시스템은 저널링 사용))
ext4 (default) : 최적화된 상태, 우분투에서는 기본으로 사용
2) xfs(eXetended file system) : SGI에서 iris라는 OS에 사용하기 위해 만듦, 파일 입출력 병렬처리 능력 좋음 (속도 빠름), 용량이 엄청 큼 --> 기업용 리눅스(enterprise)에서 사용 --> RedHat의 기본 파일 시스템으로 사용
파일시스템을 생성(포맷)하는 명령어
# mke2fs ( ext2/3/4만 생성 가능한 명령어, default ext2 )
# mkfs -t ext4 ( make file system의 약자 )
# mkfs -t xfs
# mkfs.xfs
# mkfs.ext4
![](https://blog.kakaocdn.net/dn/GTSsv/btq84fiof7J/2fG5IfkuaPxHRKi220lid1/img.png)
![](https://blog.kakaocdn.net/dn/buyrg8/btq84gn29p2/FU7uKBMjHaaDajYarsoqOk/img.png)
파일 시스템 마운트 : 새로운 파일 시스템을 기존의 root 파일 시스템의 특정 디렉토리의 연결
윈도우와 다르게 리눅스는 반드시 Single /(root)로 구성되어야 한다.
즉, 트리 구조가 단일해야 한다. (윈도우에서는 C:\, D:\ 루트가 따로 이루어짐)
- 연결시 지점이 되는 디렉토리 : 마운트 포인트 (mount-point)
# mount (umount 하면 연결 해제)
# df -hT : 파일 시스템의 사용량을 확인 (마운트된 파일 시스템만 용량)
# lsblk
# mkdir /red
# mount /dev/sda1 /red
# mount -a (all) : /etc/fstab에 기록된 모든 항목을 마운트 연결
해당 파일 시스템을 사용하는 유저나 프로세스가 존재하는 경우 언마운트(umount)할 수 없다.
그래서 fuser 명령어를 사용해서 사용중인 유저/프로세스를 정리 후 언마운트해야 한다.
# fuser -cu /red 라는 명령어로 /red 디렉토리에 현재 누가 있는지 알 수 있다.
# fuser -ku /red 라는 명령어로 /red 디렉토리에 있는 유저(유저의 프롬프트)를 kill할 수 있다.
quota : 파일 시스템 단위로 사용자/그룹에게 디스크 사용량을 제한
/home 아래는 사용자별 1G까지 공간을 허락
/home/kim/9G의 파일을 저장하려고 하면 --> 오류남.
/home/lee
이런 것을 Disk quota라고 함.
**** /etc/fstab (file system table) : 부팅 시 자동으로 마운트할 파일 시스템 정보 기록
오타, 오류 있을 시 부팅 진행 안됨 (안전모드)
<file system> <mount point> <type> <options> <dump> <pass>
dev/sde1 /red ext4 defaults 0 0
dump : 리눅스의 백업하는 명령어, 리눅스 dump 명령어를 통해 백업할 때 해당 파일 시스템 포함(1)/불포함(0) 결정
fsck order : file system check의 약자, 비정상적인 시스템 종료 후 다음 부팅 시 복구 ---> 이것이 pass 컬럼이 됨.
(복구하겠다 1, 복구하지 않겠다 0)
하드디스크 추가하고 영구 마운트 하는 방법
![](https://blogimgs.pstatic.net/nblog/mylog/post/og_default_image_160610.png)
하드 디스트 추가후 root 용량 증가 시키기
![](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxtYBE%2FbtrMJtuJ6EQ%2FQgjSJK3lA1akDdiJSy16vk%2Fimg.png)
!!!! linux 파티션관리
몇 달 전, 라즈베리파이3 B+ 모델을 구입했다. 다른건 다 좋았으나 디스크 공간이 부족하여 안 쓰는 노트북에서 2.5인치 하드디스크를 떼어내어 외장 하드로 쓰기로 했다. (SATA to USB 케이스 별도 구매)
처음에는 USB를 꼽기만 하면 자동으로 마운트 되면서 Kodi에서 인식을 했었기 때문에 만족하면서 잘 쓰고 있었는데 얼마 전부터는 USB를 꼽아도 마운트가 되지 않아 Kodi 에서 디스크에 접근할 수 없는 상태가 되었다. 결국 수동으로 마운트해서 사용하게 되었고 이 경험을 공유하고자 한다.
마운트 작업을 하기 위해 먼저 ssh로 접속해야 한다. 운영체제는 데비안 기반의 라즈비안을 사용한다.
1. 디바이스와 파티션 확인
우선 lsblk
명령어를 통해 연결되어 있는 디바이스 목록을 확인해보자.
pi@raspberrypi:/media $ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 698.7G 0 disk
├─sda1 8:1 0 18G 0 part
└─sda2 8:2 0 680.6G 0 part
mmcblk0 179:0 0 14.9G 0 disk
├─mmcblk0p1 179:1 0 1.8G 0 part
├─mmcblk0p2 179:2 0 1K 0 part
├─mmcblk0p5 179:5 0 32M 0 part
├─mmcblk0p6 179:6 0 66M 0 part /boot
└─mmcblk0p7 179:7 0 13G 0 part /
sda 디바이스가 현재 연결된 외장하드이고 마운트포인트가 비어있는 것을 볼 수 있다. mmcblk0으로 나오는 것은 라즈베리파이가 메인 저장소로 사용하는 15G 용량의 SD카드이다.
sda는 18G의 sda1과 680G의 sda2 파티션으로 나누어져 있는데, sda1은 아마도 시스템에서 사용하는 것 같고 내가 사용할 파티션은 680G 용량의 sda2가 되겠다.
2. 파일 시스템 확인
이제 해당 파티션의 파일 시스템이 무엇인지 알아내야 한다. fdisk
명령어를 사용해보자.
pi@raspberrypi:~ $ sudo fdisk -l
.
.
.
Disk /dev/sda: 698.7 GiB, 750156374016 bytes, 1465149168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd1633466
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 37750783 37748736 18G 27 Hidden NTFS WinRE
/dev/sda2 37750784 1465143295 1427392512 680.6G 7 HPFS/NTFS/exFAT
맨 밑줄의 sda2 파티션 부분을 보면 타입이 HPFS/NTFS/exFAT로 나타나는걸 볼 수 있다. 왜인지는 정확히 모르겠으나 구글링 해보니 이건 NTFS 파일 시스템이라고 한다. (정확히 아시는 분은 댓글 달아주시면 감사하겠습니다)
3. 마운트 작업(부팅 시 자동 마운트)
일반적으로 마운트/언마운트는 mount/umount
명령어를 사용한다. 하지만 이렇게 명령어로 작업하면 재부팅될 때 자동으로 마운트 되지 않으므로 수동으로 다시 작업해줘야하는 번거로움이 있다.
그래서 자동으로 마운트할 수 있는 fstab을 사용해봤다. fstab은 마운트 정보를 설정 파일의 형태로 저장해둔 것인데, 부팅될 때 이 설정파일에 있는 대로 자동으로 마운트가 된다.
우선 파일을 열어보면 다음과 같다.
pi@raspberrypi:~ $ sudo vim /etc/fstab
proc /proc proc defaults 0 0
/dev/mmcblk0p6 /boot vfat defaults 0 2
/dev/mmcblk0p7 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
부팅될 때마다 자동으로 /dev/sda2
파티션을 /media/hdd
디렉토리에 마운트하기 위해 맨 밑줄에 다음 라인을 추가했다.
/dev/sda2 /media/hdd ntfs rw,user,auto,suid,uid=1000,gid=1000 0 2
/dev/sda2
: 마운트하려는 파티션/media/hdd
: 마운트 디렉토리- ntfs: 파티션의 파일 시스템 타입
- rw,user,auto.suid,uid…: 마운트 옵션
- 0: 덤프 관련 옵션
- 2: 무결성 검사 관련 옵션
uid와 gid를 설정해주지 않으면 마운트 디렉토리의 owner와 group은 root가 된다.
root가 되어버리면 일반 유저가 접근할 수 없으니 당연히 Kodi에서도 접근할 수 없기 때문에, owner와 group을 일반 유저 계정으로 바꿔주었다.
pi@raspberrypi:/media $ ls -al
dr-x------ 1 pi pi 4096 5월 30 23:58 hdd
만약 마운트 디렉토리의 퍼미션(rwx)을 원하는대로 변경하고 싶다면 umask, dmask, fmask옵션을 활용할 수 있다.
이것은 여기를 참고하면 된다.
이렇게 마운트가 완료되면서 Kodi에서 외장하드에 접근할 수 있게 되었다! 😎
음에 민감한 분들은 미리 확인하시길 바랍니다.
하드디스크 포맷
라즈베리파이에 usb 케이블을 이용해 하드디스크를 연결했으면, 하드디스크를 사용하기 위해서 포맷을 해야 합니다.
먼저 터미널을 이용해 원격으로 라즈베리파이에 접속합니다. 모니터를 연결해 라즈베리파이를 사용한다면, 원격으로 접속할 필요 없이 라즈베리파이에서 직접 터미널을 열어서 사용할 수 있습니다.
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMjAw/MDAxNjExMzMyMjM4MTQx.t8N7Ob66LEVAp1lUL6SkCQB1plVd1GBE_YSIQk-N0Pog.B_6ST6ChZpnJAKkh5_52YUDXJUbRb6p1zdnoqEntpJsg.PNG.lovespreads/Screen_Shot_2021-01-22_at_11.50.48_PM.png?type=w800)
리눅스의 'lsblk' 명령어를 사용해서 라즈베리파이에 하드디스크가 연결되었는지 확인합니다.
lsblk는 'list block devices'로 리눅스에 연결된 블록 디바이스(저장 장치)의 목록을 확인할 수 있는 명령어입니다.
$ lsblk
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMjEy/MDAxNjExMzMyMjQxMzMy.l8priZYEwkg1HVAWyyXlkQbCoMPMj9I1vkkC-U0s--Ag.xjzScSuITP6DbY20MKsRqS4PBZJ5hmJJPiuTuuU7B30g.PNG.lovespreads/Screen_Shot_2021-01-22_at_11.51.44_PM.png?type=w800)
위에 보이는 'sda'라는 녀석이 바로 하드디스크입니다. 실제 하드디스크의 위치는 /dev/sda입니다.
3TB 하드디스크를 연결하니, 2.7TB로 인식됩니다.
정상적으로 하드디스크가 인식된 것을 확인했으니, 포맷을 하겠습니다. 하드디스크를 포맷한다는 말은 하드디스크의 파일시스템을 구성한다는 말입니다.
파일시스템에는 일반적으로 윈도우즈 PC에서 사용하는 NTFS와 리눅스에서 사용하는 ext4 파일시스템이 있습니다. NTFS의 경우, 마이크로소프트에서 개발한 파일시스템으로 기술의 공개가 되지 않은 기술이기 때문에 리눅스에서 사용하기에 불안전할 수 있습니다.
실제로 리눅스에서 NTFS를 사용하는 것보다 ext4 파일 시스템을 사용할 경우, 안정성이나 성능 면에서 더 좋다고 합니다.
어쨌거나 저는 ext4 파일시스템으로 포맷을 합니다.
터미널에서 아래와 같이 관리자 권한(sudo)으로 ext4 파일시스템 생성 명령을 내립니다.
$ sudo mkfs.ext4 /dev/sda
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfNjUg/MDAxNjExMzMyMjUwNDk0.clvJmfjRdkUHZxPkxP2h0CGvSLH8m6T7oxZY8Fs14FIg.LSNcCqXSEM3KZMX01rt0C8Zm72B2t7BY6VMvBfEz92Ug.PNG.lovespreads/Screen_Shot_2021-01-22_at_11.54.49_PM.png?type=w800)
ext4 파일시스템 포맷이 완료되면, 파일시스템을 마운트(mount) 해야 사용할 수 있습니다.
마운트는 뭔가를 고정시킨다는 의미입니다. 리눅스에서는 파일시스템을 사용하기 위해서는 특정 위치(디렉터리)에 고정(마운트)를 시켜야 사용할 수 있습니다.
네..
리눅스란 녀석이 그렇게 생겨 먹었습니다. ㅎㅎ
전통적으로 '/mnt' 또는 '/media'에 마운트를 많이 하는데요, 저는 직접 마운트 할 디렉터리를 하나 생성해서 그 위치에 마운트 하겠습니다.
mkdir로 디렉터리를 하나 생성합니다.
$ mkdir ~/hdd_storage
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMjE3/MDAxNjExMzMxNjY4NDY0.3mgSODQp8gULWAwejmNOl4nKkYcFFYvtD8QlCsLrsLIg.Pw5DU1gOUe8lLYt7EpwA9cR6Zuff-reqO4jBj3HaKGAg.PNG.lovespreads/Screen_Shot_2021-01-23_at_12.13.37_AM.png?type=w800)
그리고, 관리자 권한으로 아래 명령을 사용해 하드디스크를 마운트 합니다.
$ sudo mount /dev/sda ~/hdd_storage
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMjYg/MDAxNjExMzMxNjcxNjUw.5e5BIe72q35kK-aPpJO9NWu6czxHHA5qewG_Yi7Hsjsg.wHts5jQf2SKu3uJr8tEbb7iE70JxRpIiXbO7_TwPw6Ug.PNG.lovespreads/Screen_Shot_2021-01-23_at_12.13.53_AM.png?type=w800)
~/hdd_storage 디렉터리의 경로는 각자 마운트 하기 원하는 디렉터리의 경로를 적어주면 됩니다.
그러고 나서 lsblk 명령을 내리면, 하드디스크(sda)가 원하는 위치에 정상적으로 마운트 된 것을 볼 수 있습니다.
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMjQw/MDAxNjExMzMxNjc2Mzcw.odLLnoHT4yn1f-9Ceqm4LoA8_KglV5Z-Kb38YnSSamgg.6jpeavpNvdCQZw2dfv3aCQD3ODg0Cd5NeKcbAJC1jM0g.PNG.lovespreads/Screen_Shot_2021-01-23_at_12.14.06_AM.png?type=w800)
제 경우, 하드디스크는 /home/pi/hdd_storage인 것입니다. 이곳에 이것저것 저장하고 마음대로 사용할 수 있습니다. ㅎㅎ
추가로 'blkid'라는 명령을 사용하면, 각 블록 디바이스(저장 장치)의 아이디를 볼 수 있습니다. 마운트가 안되면 확인을 할 수 없습니다.
맨 아래 /dev/sda라는 디바이스가 보이네요~
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMjU3/MDAxNjExMzMxNjc5MzA4.-qa-ADfwSppdUSPAwJBHJj4clSVjEtpt7hy_Vl2Nt40g.2aHfN6ybZd0MAtO2eFYgv3tEtEX2VNXa-56ic02YMPgg.PNG.lovespreads/Screen_Shot_2021-01-23_at_12.14.48_AM.png?type=w800)
하드디스크를 ext4 파일시스템으로 포맷하고 마운트 하는 과정을 동영상으로 녹화해봤습니다.
00:59라즈베리파이에서 usb 외장하드 사용하는 방법재생56좋아요0접기/펴기라즈베리파이에서 usb 외장하드 사용하는 방법
마운트 한 하드디스크에 저장을 하기 위해서는 마운트 한 디렉터리의 권한 설정을 해 줘야 합니다.
맨 아래 보시면, 'hdd_storage'라는 디렉터리가 보이는데, 다른 녀석들과 조금 달라 보이죠?
'pi'라고 되어 있는 것이 아니라 'root'라고 되어 있습니다. 이 부분을 다른 것들과 동일하게 'pi'로 만들어 줘야 합니다.
pi는 개인이 사용하는 사용자 아이디고, root는 리눅스 관리자(슈퍼유저)의 아이디입니다. 개인 사용자의 권한으로 바꿔줘야 개인이 사용할 수 있는 것이죠~
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMTAz/MDAxNjExMzMzNjIwNjIw.svI-2wFKR4FKwMiSPrV9xpyzquAoEP6XD0Ehlvl945Mg.670qRKxS6JJs8178pN3zcr9BKB1X75_blVj_l4Y_r8wg.PNG.lovespreads/Screen_Shot_2021-01-23_at_1.38.45_AM.png?type=w800)
다음 명령을 내려서 hdd_storage 디렉터리의 소유자를 pi로 수정합니다.
$ sudo chown pi:pi hdd_storage
그럼 아래와 같이 hdd_storage 디렉터리의 소유자가 pi로 수정된 것을 볼 수 있습니다.
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfNTAg/MDAxNjExMzMzNjM5MDQ1.H8Zjj75r__fycxYlOsUrq5BAjjKEBmHQbnx6sFmP2q0g.OsPma6r_JmOvkObzzp7WzMjE8lVfW8Zd9fFcDH90kGgg.PNG.lovespreads/Screen_Shot_2021-01-23_at_1.40.30_AM.png?type=w800)
참 쉽죠~
하드디스크 자동 마운트 설정
위에서 마운트를 했었는데요, 이는 일시적인 마운트입니다. 즉, 라즈베리를 껐다 다시 켜면 마운트가 해제되어 버린다는 거죠...
그래서 라즈베리파이 부팅 시 자동으로 마운트를 하도록 설정을 해 줘야 합니다.
리눅스 부팅 시 파일시스템 마운트에 관한 설정 파일이 있습니다. 바로 '/etc/fstab'라는 파일입니다.
에디터로 /etc/fstab 파일을 열어 하드디스크 자동 마운트 설정을 합니다.
$ sudo vi /etc/fstab
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMzkg/MDAxNjExMzMxNjgxNjAw.IvfEHdGjXGvK0_RANhGeyO3AJCyNxsj1-0BbCkZNO04g.w-6fWduay-ATf2O0nIiTufs2ko24hII3Xmj4ZfwgVLwg.PNG.lovespreads/Screen_Shot_2021-01-23_at_12.15.19_AM.png?type=w800)
아래 설정 파일에서 맨 아래 다음 한 줄을 추가합니다.
/dev/sda /home/pi/hdd_storage ext4 default,noatime. 0. 0
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMTI1/MDAxNjExMzMxNjg1MTc5.cA8G_z_QK0imP8lfV7OBtnxbR9DHp3A7-na83y8XULEg.UV_rVIUSze31ooJOEBfSW2P7CW1hIIeoc6gsCxOtv2Mg.PNG.lovespreads/Screen_Shot_2021-01-23_at_12.15.38_AM.png?type=w800)
변경한 설정을 저장한 후 빠져나옵니다.
그리고 라즈베리파이를 재부팅 합니다.
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMTk5/MDAxNjExMzMxNjg3NTU5.TnQFafCM8_W2gAOleZei_ww9hSsfaTbFrys1fVzYTJ8g.-KdaiSfYXXmXMt-V_WWwn-mVrILKIKBIvLqWndZycZYg.PNG.lovespreads/Screen_Shot_2021-01-23_at_12.29.52_AM.png?type=w800)
이것으로 라즈베리파이에서 하드디스크를 사용하기 위한 설정은 끝입니다.
삼바 설정
추가로 파일 서버로 사용하기 위한 삼바 설정을 추가하겠습니다.
삼바에 대해 잘 모른다면, 먼저 아래 링크를 보고 오세요~!!!
![](https://dthumb-phinf.pstatic.net/?src=%22https%3A%2F%2Fblogthumb.pstatic.net%2FMjAyMTAxMDJfOTYg%2FMDAxNjA5NTE4MDcxOTc5.cr3LVXgpezYlHhCyEdnT5TJsayZMB_s_DsUqyXrkfMYg.06UJNh4q8ACAo9DCPDUpPbzNqsuJV8W0xNbGm1LCeQAg.PNG.lovespreads%2F%25C0%25A9%25B5%25B5%25BF%25EC%25BF%25CD_%25C6%25C4%25C0%25CF%25C0%25BB_%25B0%25F8%25C0%25AF%25C7%25CF%25B1%25E2_%25C0%25A7%25C7%25D1_%25B6%25F3%25C1%25EE%25BA%25A3%25B8%25AE%25C6%25C4%25C0%25CC_%25B6%25F3%25C1%25EE%25BA%25F1%25BE%25C8_%25BB%25EF%25B9%25D9%2528Samba%2529_%25BC%25B3%25C4%25A1_%25B9%25D7_%25BC%25B3%25C1%25A4.png%3Ftype%3Dw2%22&type=ff500_300)
윈도우와 파일을 공유하기 위한 라즈베리파이 라즈비안 삼바(Samba) 설치 및 설정
윈도우와 파일을 공유하기 위해 라즈베리파이에 삼바(Samba)를 설치하고 설정하는 방법에 대해서 알아보겠...
blog.naver.com
삼바 설정을 위해 삼바 설정 파일을 에디터로 오픈합니다.
$ sudo vi /etc/samba/smb.conf
그리고, 맨 하단에 하드디스크를 추가합니다.
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMjg1/MDAxNjExMzMxNjkxMTE1.Cwpnwqb7kS6xltHdx8Fxv9mtiYi4uA907iD6hCmi3JYg.IlM-YAnv28pZIB_rWDhxr2LXaY8GAs44Lmu-ObvuC4Ig.PNG.lovespreads/Screen_Shot_2021-01-23_at_12.39.30_AM.png?type=w800)
수정한 삼바의 내용을 적용하기 위해 삼바 서비스를 재시작합니다.
![](https://mblogthumb-phinf.pstatic.net/MjAyMTAxMjNfMTA4/MDAxNjExMzMxNjk0NjAz.lsl5tOykBJ_4R3E9zDK2c-PUztx7hGrNQiqAU550dIQg.PU_Ke5JnopzzZXaV7HalUxh7yhkkjYMIMXSAC7ad0pIg.PNG.lovespreads/Screen_Shot_2021-01-23_at_12.40.08_AM.png?type=w800)
이제 인터넷이 되는 집에 있는 어떠한 디바이스라도 라즈베리파이의 대용량 하드디스크에 접속할 수 있습니다.
저는 주로 침대에 누워서 스마트폰으로 애니메이션을 보는데요, 라즈베리파이에 usb로 연결한 대용량 하드디스크에 한가득 있답니다~ ㅎㅎ
지금까지 라즈베리파이에 usb 외장하드를 연결하는 방법과 삼바 연결을 통해 파일 서버로 사용하는 방법에 대해서 알아봤습니다.
구매한 usb to sata 케이블과 하드디스크에 대해서는 아래 링크를 참고하세요.
포스트 작성시 참고할 페이지
.https://flyingdeuk.github.io/posts/Pi-mount/#google_vignette
!! dd 로 디스크 이미지로 제작 및 디스크에 복구
물리적인 저장 디스크 관리
Linux의 경우 저장 디스크는 block device로 /dev 디렉토리에 아래와 같은 디바이스 파일이 생성된다. 아래의 예는 sda SSD 디스크로 한 개의 파티션(sda1)이 있다.
$ ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 10월 24 13:40 /dev/sda
brw-rw---- 1 root disk 8, 1 10월 24 13:40 /dev/sda1
해당 디스크의 파티션을 보거나 수정하려면 fdisk나 parted를 사용할 수 있다. 일반적인 용도로 사용시에는 크게 차이는 없으나 script로 배치 작업을 하기 위하여는 parted를 사용하는 것이 좋다.
$ sudo parted -s /dev/sda print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 118GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 118GB 118GB primary ext4 boot
- 디스크를 엑세스 하는 것이므로 root 권한 필요
- -s: 스크립트 모드. print command를 실행
생성된 파티션에 이미지를 쓰기 위하여는 dd를 이용할 수 있다.
$ sudo dd if=image.ext4 of=/dev/sda1
dd의 각각의 필드는 다음과 같다.
- if: input file
- of: output file. 실제 write할 디스크 파티션
dd로 쓴 파티션은 mount를 이용하여 원하는 디렉토리에 마운트하여 사용할 수 있다. 아래의 예는 EXT4 형식의 파일 시스템인 /dev/sda1를 /media 디렉토리로 마운트 한 것이다.
$ mount -t ext4 /dev/sda1 /media
디스크 이미지
SD card나 MMC는 저장 방식은 다를 수 있지만 실제 사용 관점에서는 일반 하드디스크와 동일한 개념의 block device라고 보면 된다. 즉, sector 단위로 나뉘어진 공간에 읽거나 쓸수 있다.
초기화 되지 않은 SD card나 MMC는 위의 방법처럼 디스크에 직접 직접 쓸 수 있지만, 임베디드 시스템 개발 과정에서는 빌드 시 저장 장치에 쓸 디스크 이미지를 만들고, 이를 SD card나 MMC에 통으로 쓰는 경우도 많다.
이와 같은 가상의 디스크 이미지를 만드는 것도 직접 디스크에 쓰는 과정과 동일하다. 하나의 차이점이 있다면 물리적인 디스크 공간은 늘거나 줄지 않지만, 가상의 디스크 이미지는 파일 저장 공간만큼 늘리거나 줄일 수 있다는 것이다.
우선 필요한 만큼 파일로 공간을 할당하여야 한다. 아래 예는 1GiB 만큼의 공간을 할당하는 것이다.
$ dd if=/dev/null of=test.img bs=1kx1k seek=1k
0+0 records in
0+0 records out
0 bytes copied, 0.000174626 s, 0.0 kB/s
$ ls -l
total 1
-rw-rw-r-- 1 yslee yslee 1073741824 10월 24 17:51 test.img
dd를 이용하여 블럭디바이스에 쓰는 것이나 파일에 쓰는 것이나 동일하다고 보면 된다.
- if=/dev/null: 입력을 null device로 부터 받는다. 즉, 입력이 없음
- of=test.img: test.img로 파일을 생성한다.
- bs=1kx1x: 1KiB x 1KiB, 즉 1MiB 단위로 block size를 설정. Block size는 실제 저장 장치의 block(sector) size 가 아니라 한번에 read 또는 write 하는 단위라고 생각하면 된다.
- seek=1k: 1KiB(1,024) 번째로 이동. 즉 1,024 * 1MiB(bs) = 1GiB 위치가 된다.
위와 같이 입력이 null로 된 상태에서 seek로 위치만 설정해 주면 해당 크기만큼의 파일이 생성된다.
이와 같은 방식으로 생성한 파일은 sparse file로 Unix 계열이나, NTFS에서 지원된다. Sparse file이란 실제로 해당 공간만큼 물리적인 공간에 할당하는 것이 아니라 실제로 데이타가 있는 부분만 저장하는 방식이다.
![Sparse File](https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Sparse_file_%28en%29.svg/495px-Sparse_file_%28en%29.svg.png)
그림: Sparse Image의 개념(Wikipedia)
실제로 디스크에 할당된 공간은 du를 이용하거나 ls의 -s 옵션을 이용하여 확인할 수 있다.
$ du -h test.img
0 test.img
$ ls -lhs
4.0K -rw-rw-r-- 1 yslee yslee 1.0G 10월 24 18:05 test.img
dd 이외에도 truncate를 이용하여서도 sparse file을 생성할 수 있다.
$ truncate -s 1G test2.img
$ ls -l
total 2
-rw-rw-r-- 1 yslee yslee 1073741824 10월 24 17:51 test.img
-rw-rw-r-- 1 yslee yslee 1073741824 10월 24 18:03 test2.img
$ du -h test2.img
0 test2.img
이와 같이 디스크 이미지로 1GiB 공간을 할당하고, block device와 동일한 방식으로 설정을 할 수 있다. 예를 들어 fdisk로 partition을 할당할 수도 있다.
$ fdisk test.img
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2097151, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151):
Created a new partition 1 of type 'Linux' and of size 1023 MiB.
Command (m for help): p
Disk test.img: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x37672bca
Device Boot Start End Sectors Size Id Type
test.img1 2048 2097151 2095104 1023M 83 Linux
Command (m for help): w
The partition table has been altered.
Syncing disks.
MBR(Master Boot Record)
디스크 파티션을 이해하기 위하여는 마스터 부트 레코드를 이해하여야 하는데, 여기에서는 필요한 부분만 간단하게 설명한다.
마스터 부트 레코드는 디스크의 처음 실행을 위한 코드와 파티션 분할 정보가 들어가 있는 디스크의 첫번째 sector라고 할 수 있다. 하드디스크의 섹터 크기는 512bytes이고, setctor라는 개념은 하드디스크에서 읽고 쓰기를 하는 단위로 최근의 SD card 나 MMC에서도 대부분 논리적인 개념으로 512bytes sector 단위를 사용한다 (내부적으로 write/erase block size는 이보다 더 크지만).
MBR에는 앞부분에 일반 PC에서 사용하던 것처럼 작은 실행 코드가 들어 갈 수 있고(PC에서만 사용하는 것으로 임베디드에서는 의미 없음), offset 0x1be 부터 16bytes씩 4개의 partiton 정보가 들어간다. 이 4개가 보통 fdisk에서 보이는 primary partition이다. 다양한 변이들이 생기면서 여러 버전이 있지만 최소한 primary partition 위치는 동일하다. 자세한 사항은 MBR/EBR Partition Tables 등을 참고 할 수 있다 (MSDOS partition이 아닌 GPT(GUID Partition Table)등을 사용하는 경우는 여기서 설명하지 않는다).
SD card나 MMC의 경우 MSDOS 파티션을 사용하는 경우 마찬가지로 512bytes 단위의 섹터를 사용하고 위치를 표시하기 위하여 32bits 크기로 기록된다. 즉, MBR 섹터는 0번, 그 다음 섹터는 1번 식으로 최대 2 tera bytes까지 할당 가능(2^32 x 512bytes)하다.
위의 예를 든 fdisk 파티션은 2,048 섹터에서 시작해서 2,095,151 섹터까지 총 2,095,104 섹터 크기이다. 크기는 2,095,104 x 512 = 1023MiB (1,072,693,248)가 된다.
Device Boot Start End Sectors Size Id Type
test.img1 2048 2097151 2095104 1023M 83 Linux
dd를 이용하여 직접 파티션에 이미지를 쓸때 이 offset 정보가 필요하다.
디스크 이미지 샘플
이제 실제로 디스크 이미지를 만들어 보기로 한다.
dd를 이용하여 1GiB 공간의 디스크 이미지를 만든다.
$ dd if=/dev/null of=test.img bs=1kx1k seek=1k
$ ls -l
-rw-rw-r-- 1 yslee yslee 1073741824 10월 25 17:48 test.img
parted의 script를 이용하여 각각 200MiB, 나머지 전체 공간의 두 파티션을 생성한다.
$ parted -s test.img mklabel msdos
$ parted -s test.img mkpart primary 2048s 200MiB
$ parted -s -- test.img mkpart primary 200MiB -1s
$ parted -s test.img print
Model: (file)
Disk /home/yslee/tmp/test.img: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 210MB 209MB primary
2 210MB 1074MB 864MB primary
- line 1: MSDOS 파티션을 설정
- line 2: 시작은 2048 sector, end를 200MiB로 파티션 할당 (리눅스 파티션)
- line 3: 시작은 200MiB 위치, 끝까지(-1s) 할당. 중간에 double dsah(–)는 -1s 를 option 으로 처리되지 않도록 하기
- line4: 파티션 정보 프린트
디스크 이미지에 파티션 정보를 만들고, 여기에 ext4 디스크 이미지를 만들어서 dd로 복사해 보기로 한다. 디스크 이미지는 genext2fs와 tune2fs로 파일로 부터 직접 이미지를 생성할 수 있으나, 여기에서는 간단하게 loop 디바이스로 마운트 하여 이미지를 생성하도록 한다.
$ dd if=/dev/null of=test.ext4 bs=1kx1k seek=1
$ mkfs.ext4 test.ext4
$ mkdir test
$ sudo mount -t ext4 test.ext4 test
$ sudo sh -c 'echo "Hello, World!" > test/test.txt'
$ sudo umount test
- line 1: test.ext4 파일로 1MiB 이미지 생성
- line 2: 이미지를 ext4 형식으로 초기화
- line 3: test 디렉토리 만들기
- line 4: 이미지를 test 디렉토리에 마운트
- line 5: test.txt를 생성해 넣기
- line 6: 언마운트
첫번째 파티션의 시작 섹터 2,048에 ext4 이미지를 쓴다.
dd if=test.ext4 of=test.img bs=512 seek=2048 conv=notrunc
- if: 입력은 text.ext4 이미지
- of: 쓰는 곳은 test.img
- bs: 블럭 크기를 sector 크기로 설정
- seek: 2048s 에 쓰기
- conv=notrunc: 파일 형식의 이미지에 유효한 것으로, open()함수의 O_TRUNC flag를 끄기. 만일 이 옵션을 주지 않으면 결과 파일인 test.img는 모두 삭제된 후(O_TRUNC)에 입력이 써지게 된다. notrunc 옵션을 주면 overwrite이다. 일반 block device에서는 이렇게 크기가 줄어들 일이 없어 사용치 않는다.
이제 만들어진 이미지를 SD card에 dd로 write를 한 후에 확인을 해보아도 되나 loop device로 마운트 하여 확인할 수 있다.
$ sudo losetup -Pf --show test.img
/dev/loop0
$ ls -l /dev/loop0*
brw-rw---- 1 root disk 7, 0 10월 25 18:32 /dev/loop0
brw-rw---- 1 root disk 259, 0 10월 25 18:32 /dev/loop0p1
brw-rw---- 1 root disk 259, 1 10월 25 18:32 /dev/loop0p2
위와 같이 하면 loop 디바이스를 이용하여 이미지를 attach 할 수 있다. 즉, ls 를 해보면 위처럼 loop0으로 시작하는 디바이스가 생성된다. loop0은 이미지, loop0p1은 첫번째 파티션, loop0p2는 두번째 파티션이다.
첫번째 파티션을 마운트 해서 확인해 본다.
$ sudo mount -t ext4 /dev/loop0p1 test
$ ls test/
lost+found test.txt
$ cat test/test.txt
Hello, World!
아까 test.img의 첫번째 파티션에 쓴 파일이 정상적으로 보여진다.
이런 식으로 해서 직접 이미지를 쓰는 것도 가능하다. 아래는 두번째 파티션을 초기화 하고 쓰는 예이다.
$ sudo mkfs.ext4 /dev/loop0p2
$ mkdir test2
$ sudo mount -t ext4 /dev/loop0p2 test2
$ sudo sh -c 'echo "Test2" > test2/test2.txt'
$ ls -l test2/test2.txt
-rw-r--r-- 1 root root 6 10월 25 18:39 test2/test2.txt
- line 1: 두번째 파티션을 mkfs.ext4를 이용하여 포멧
- line 2: 시험용 test2 디렉토리 만들기
- line 3: test2에 두번째 파티션 마운트
- line 4: 파일 쓰기
최종적으로 마운트를 종료한다.
$ sudo umount test2
$ sudo umount test
$ sudo losetup -D
- line 3: 이전에 losetup으로 attach 한 것을 모두 detach 한다.
이 과정을 거치게 되면 최종적으로 test.img에는 두개의 파티션이 각각 ext4로 초기화 되고, 첫번째 파티션에는 “Hello, World!” 내용의 test.txt가 두번째 파티션에는 “Test2” 내용의 test2.txt 파일이 있다.
정리
디스크 이미지를 만드는 것이 복잡해 보이나, 실제 위의 예를 보면 일반 디스크를 포멧, 마운트 하는 과정과 큰 차이가 없다는 것을 알 수 있다.
이 정도를 알면 디스크 이미지를 생성하거나 수정하는 것을 마음대로 할 수 있을 것이다.