자바스크립트를 활성화 해주세요

라즈베리파이 OS 설치하기

 ·  ☕ 7 min read

최근 라즈베리파이 사이트에서는 손쉽게 라즈베리파이 OS설치를 위한 프로그램 Raspberry Pi Imager를 제공하지만, 본 문서에서는 해당 프로그램을 사용하지 않고 직접 설치하는 과정을 설명하려 한다. 당연히 최근의 라즈베리파이는 microSD카드를 사용하지만, 본 글에서는 편의상 SD카드라고 표현하도록 하겠다.

OS 이미지를 다운받아서 준비해놓자.

  • Raspberry Pi OS with desktop and recommended software: 기본적인 GUI 뿐만 아니라 모든 추천 SW가 설치되어 있는 상태
  • Raspberry Pi OS with desktop: 기본적인 GUI와 최소한의 SW만 설치되어 있는 상태
  • Raspberry Pi OS Lite: 최소한의 OS 구성요소만 설치됨 (GUI도 설치되어 있지 않음)

윈도우즈에서 SD카드에 OS 설치하기

먼저 SD카드를 포맷해야 한다.

SD카드 내에 1개의 파티션으로, FAT32로 포맷하면 된다.

SD카드의 용량이 64GB이상일 때 (SDXC)

SD카드가 SDHC인지 SDXC인지 확인하자.

SD카드의 용량이 32GB보다 큰 용량이라면 SD카드 포맷 시 추가적으로 수행해야 할 작업이 있다. (보통 용량이 32GB 다음에 64GB이므로 64GB라고 표현하였다.) 문제가 되는 SD카드는 표면에 SDXC 혹은 SDUC라고 써있는 카드들이다. SDUC는 표준상 2TB 이상일텐데, 라즈베리파이에 그만큼 비싼 카드를 사용할 사람은 없으리라 생각하여 SDXC만 고려하도록 하겠다.

특히 2020년 기준으로는 SD카드의 단가가 많이 내려간 편이라 64GB의 가성비가 32GB의 가성비보다 좋은 경우가 있고, 일부 브랜드의 경우 용량이 더 큰데도 가격이 더 싼 경우가 존재하므로 다루는 것이 좋을 것이라 생각했다.

문제의 원인은 SDXC에서 기본 파일시스템 형식을 exFAT로 선정했기 때문인데, 일반적인 방법으로는 윈도우즈에서 SDXC 카드를 FAT32로 포맷할 수 없기 때문이다. 라즈베리파이의 부팅 파티션은 FAT32만 가능하기 때문에 이를 수정해줘야 한다.

SDXC 장치 포맷시 FAT32는 목록에 나타나질 않는다.

라즈베리파이 OS 이미지 올리기

위 도구 중 하나를 사용하여 다운받았던 OS 이미지를 올리면 된다.

리눅스에서 터미널로 SD카드에 OS 설치하기

SD카드 블록 장치 이름 확인

$ lsblk -p

lsblk 명령을 통해 연결된 블록 장치(저장장치)를 확인한다. 사이즈, 마운트 경로 등을 통해 SD카드의 장비 이름을 알아내도록 하자. (만약 블록 장치가 많거나 유사해서 확인하기 힘들다면, SD카드를 연결하기 전의 명령어 결과와 연결한 후의 명령어 결과를 비교하여 유추하도록 하자)

$ lsblk -p
NAME             MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
/dev/sda           8:0    1  60.1G  0 disk
├─/dev/sda1        8:1    1   256M  0 part /mnt/boot
└─/dev/sda2        8:2    1  59.8G  0 part /mnt/rootfs
/dev/nvme0n1     259:0    0 476.9G  0 disk
├─/dev/nvme0n1p1 259:1    0   512M  0 part /efi
├─/dev/nvme0n1p2 259:2    0 444.4G  0 part /
└─/dev/nvme0n1p3 259:3    0    32G  0 part [SWAP]

나의 경우는 노트북의 OS가 nvme0에 설치되어있으므로 SD카드는 sda임을 알 수 있다.

라즈베리파이 OS 이미지 쓰기

# dd bs=4M status=progress if=$RPI_OS_IMG of=$SD_DEVICE

dd 명령으로 라즈베리파이 OS 이미지를 SD카드에 기록한다. 위 명령어의 $RPI_OS_IMG는 라즈베리파이 OS 이미지 파일을 압축해제한 경로를 넣으면 되고, $SD_DEVICE는 위에서 찾은 SD카드 블록 장치의 경로를 입력한다.

$ sudo dd bs=4M status=progress if=./2020-08-20-raspios-buster-armhf.img of=/dev/sda
3812622336 bytes (3.8 GB, 3.6 GiB) copied, 209 s, 18.2 MB/s
911+0 records in
911+0 records out
3821010944 bytes (3.8 GB, 3.6 GiB) copied, 537.638 s, 7.1 MB/s

파티션 상태 확인, 확장하기

$ lsblk -p $SD_DEVICE

라즈베리파이 OS 이미지가 기록된 SD카드의 파티션 정보를 확인해보자. 이미 우리는 SD카드의 블록 장치 이름을 알고 있으니, 해당 장치 이름만 사용해서 해당 디스크의 상태를 확인하자.

$ lsblk -p /dev/sda
NAME             MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
/dev/sda           8:0    1  60.1G  0 disk
├─/dev/sda1        8:1    1   256M  0 part
└─/dev/sda2        8:2    1   3.3G  0 part

결과를 자세히 보면 2개의 파티션으로 나눠져 있는데, sda1은 라즈베리파이 부팅 설정을 위한 파티션으로 FAT32로 포맷되어있다. sda2는 라즈베리파이의 rootfs이다. (부팅 후 ‘/‘에 마운트되는 파일시스템)

문제는 두 파티션 용량의 합이 전체 SD카드의 용량에 비해 터무니없이 작다는 것이다. 약 56GB가 낭비되고 있는데, 이 공간을 rootfs가 사용할 수 있게 파티션을 변경해보자. 여기서는 fdisk를 사용하도록 하겠다.

(참고로 라즈베리파이를 부팅한 이후에도 자체적으로 파티션 확장하는 기능이 제공되긴 한다.)

# fdisk $SD_DEVICE

$ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.36).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk /dev/sda: 60.06 GiB, 64490569728 bytes, 125958144 sectors
Disk model: Storage Device
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: 0x58ce116e

Device     Boot  Start     End Sectors  Size Id Type
/dev/sda1         8192  532479  524288  256M  c W95 FAT32 (LBA)
/dev/sda2       532480 7462911 6930432  3.3G 83 Linux

SD카드의 장치 이름을 인자로 fdisk를 실행한다. 먼저 p 명령을 입력하여 현재 SD카드의 상세 정보를 출력한다. 여기에서 중요한 값은 Disk의 전체 sector 갯수(예시의 125958144), rootfs(2번째 파티션)의 시작 sector 값(예시의 532480)이다.

Command (m for help): d
Partition number (1,2, default 2): 2

Partition 2 has been deleted.

fdisk에서는 파티션을 바로 확장하는 명령어가 제공되지 않는다. 파티션을 삭제하고 용량을 키워서 다시 할당해야 한다. (해당 파티션의 내용이 삭제되는 것이 아니라, 파티션의 범위 정보만 변경되는 것이다.) d 명령을 입력하여 rootfs 파티션의 정보만 삭제한다.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-125958143, default 2048): 532480
Last sector, +/-sectors or +/-size{K,M,G,T,P} (532480-125958143, default 125958143):

Created a new partition 2 of type 'Linux' and of size 59.8 GiB.
Partition #2 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: n

이제 기존 파티션의 위치에 맞춰서 용량을 늘려서 다시 생성하자. n 명령을 입력하여 새로 생성한다. primary type으로 선택, 파티션 번호는 기존의 2번으로 선택하자. (위의 extended 파티션 타입은 해당 파티션이 Logical partition일 때 이를 확장하기 위해 사용되는 파티션이므로 지금 파티션 크기를 확장시키는 것과 다른 것이다.)

이제 파티션의 시작 sector, 마지막 sector를 설정해줘야 한다. 삭제하기 전의 sda2 파티션의 시작 sector 값을 입력하자. (위에서 확인했던 532480) 자세히 보면 비어있는 공간이 2048번 sector에도 존재하기 때문에 기본값으로 입력하면 의도하지 않은 파티션을 생성할 수도 있다. 마지막 sector의 기본값은 전체 sector의 끝이므로 그냥 사용해도 된다.

Command (m for help): p

Disk /dev/sda: 60.06 GiB, 64490569728 bytes, 125958144 sectors
Disk model: Storage Device
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: 0x58ce116e

Device     Boot  Start       End   Sectors  Size Id Type
/dev/sda1         8192    532479    524288  256M  c W95 FAT32 (LBA)
/dev/sda2       532480 125958143 125425664 59.8G 83 Linux

이후 다시 p 명령을 입력하여 수정된 파티션 테이블을 확인하자. 이번엔 rootfs의 크기가 59.8GB로 늘어난 것을 확인할수 있다. 현재 상태는 이렇게 파티션 테이블을 재구성한다고 한 것이지 아직 반영된 것이 아니다.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

w 명령을 입력하여 현재 설정된 파티션 테이블을 실제로 반영하도록 하자. 해당 파티션이 변경되면 fdisk는 자동으로 종료된다.

파티션 마운트하기

이제 아래에서 라즈베리파이 부팅 설정을 수정하려면 boot 파티션을 마운트해야한다. mount 명령으로 각 파티션을 특정 디렉토리에 마운트하자.

# mount $SD_DEVICE_PARTITION $MOUNT_PATH

$ lsblk -p /dev/sda
NAME             MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
/dev/sda           8:0    1  60.1G  0 disk
├─/dev/sda1        8:1    1   256M  0 part
└─/dev/sda2        8:2    1  59.8G  0 part
$ ls -d $PWD/*
/mnt/boot   /mnt/rootfs
$ sudo mount -t vfat /dev/sda1 /mnt/boot
$ sudo mount -t ext4 /dev/sda2 /mnt/rootfs

일반적으로는 mount 명령시 파일시스템 타입을 입력하지 않아도 알아서 해당 파일시스템 타입에 맞게 알아서 마운트해주지만, 만약 특별히 명시해야 할 필요가 있을 경우에는 FAT32는 vfat로, ext4는 ext4로 입력해주면 된다.

# mount -t $FS_TYPE $SD_DEVICE_PARTITION $MOUNT_PATH

이후 마운트 된 path에 진입하면 파일들이 존재하는 것을 확인할 수 있을 것이다.

참고 링크

[1] 라즈베리파이 OS 설치 방법(https://www.raspberrypi.org/documentation/installation/installing-images/)
[2] SD카드 요구사항(https://www.raspberrypi.org/documentation/installation/sd-cards.md)
[3] SDXC 카드 포맷하기(https://www.raspberrypi.org/documentation/installation/sdxc_formatting.md)
[4] 윈도우즈에서 설치 방법(https://www.raspberrypi.org/documentation/installation/installing-images/windows.md)
[5] 리눅스에서 설치 방법(https://www.raspberrypi.org/documentation/installation/installing-images/linux.md)


JaeSang Yoo
글쓴이
JaeSang Yoo
The Programmer

목차