루트 파일 시스템

kenGwon·2024년 2월 18일
0

[Embedded Linux] BSP

목록 보기
15/36

들어가며

  • 리눅스에는 반드시 루트파일 시스템이 필요하다.
  • 우리가 리눅스에서 / 라는 경로로 접근하면 보이는 다양한 파일들로 구성된 파일시스템을 말하는 것이다.
  • 리눅스가 부팅이 되어서 로그인이 되고 bash가 하나 할당되고 사용할 수 있게 되는 것까지 가려면, 루트파일 시스템이 무조건 필요한 것이다.
  • 부팅하면서 바로 루트파일 시스템이 마운트 되는 것이다.
// 루트 파일시스템이 마운트 되어있는 정보를 부트커맨드에서 확인
pi@pi14:~ $ cat /boot/cmdline.txt
console=serial0,115200 console=ttyS0 root=PARTUUID=f729bde1-02 rootfstype=ext4 fsck.repair=yes rootwait
  
// 실제로 루트 파일시스템을 마운트 시키는 경위에 대한 정보(file system table)
pi@pi14:~ $ cat /etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=f729bde1-01  /boot/firmware  vfat    defaults          0       2
PARTUUID=f729bde1-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

noobs 파일시스템

우리는 간단한 실습용으로 이미 noobs라는 초보자용 파일시스템을 먼저 가져다가 우리 SD카드에 설치해보겠다.
(noobs라는 파일시스템은 이러한 실습을 위해 미리 다 만들어져 있는 작은 파일시스템이다.)

설치

// noobs 다운로드 후 압축풀기
ubuntu@ubuntu14:~/pi_bsp/rootfs$ wget https://downloads.raspberrypi.org/NOOBS_latest
ubuntu@ubuntu14:~/pi_bsp/rootfs$ unzip -d noobs NOOBS_latest
ubuntu@ubuntu14:~/pi_bsp/rootfs$ cd noobs/os/RaspiOS_Full_armhf/

// 루트파일 시스템 압축 풀기
ubuntu@ubuntu14:~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf$ mkdir rootfs
ubuntu@ubuntu14:~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf$ tar xvfp root.tar.xz -C ./rootfs/

원래라면 noobs로 부팅해서 거기서 나오는 메뉴대로 아이디와 패스워드를 쳐주면서 계정을 만들어주는 과정이 필요하다.

(root.tar.xz가 루트 파일 시스템이다.)
우리는 저걸 압축을 풀어서 그대로 SD에 쓰는 것이 목표이다. 그렇기 때문에 압축을 풀고 나서 여기 안에서 아이디와 패스워드를 설정해주는 작업이 필요하다.

계정만들기

아래 경로의 파일로 들어간다. 우리는 2개의 파일을 수정해야 한다.
1. passwd (계정관리)
2. shadow (실제 비밀번호)

ubuntu@ubuntu14:~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf/rootfs/etc$ sudo vi passwd
ubuntu@ubuntu14:~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf/rootfs/etc$ sudo vi shadow

해당 2개의 파일의 맨 아래다가 pi 계정 정보를 만들어야 한다..

하지만 우리가 리눅스 계정 config 구조를 잘 모르기 때문에, 우분투에서 명령행으로 계정을 하나 만들어서 그 내용을 저길로 복붙하는 식으로 진행하겠다.
(그리고 복붙 후 필요없어진 우분투의 pi 계정은 나중에 지우겠다.)

// 우분투 명령행으로 새로운 리눅스 계정 만들기
ubuntu@ubuntu14:~$ sudo adduser pi
'pi' 사용자를 추가 중...
새 그룹 'pi' (1001) 추가 ...
새 사용자 'pi' (1001) 을(를) 그룹 'pi' (으)로 추가 ...
'/home/pi' 홈 디렉터리를 생성하는 중...
'/etc/skel'에서 파일들을 복사하는 중...
새  암호:
새  암호 재입력:
passwd: 암호를 성공적으로 업데이트했습니다
pi의 사용자의 정보를 바꿉니다
새로운 값을 넣거나, 기본값을 원하시면 엔터를 치세요
        이름 []: kenGwon
        방 번호 []: 202-1301
        직장 전화번호 []: 02-1004
        집 전화번호 []: 010-1004
        기타 []: Gaebong
정보가 올바릅니까? [Y/n] y


// 제대로 만들어졌나 확인하기 (2개의 파일을 복붙해야 한다)
ubuntu@ubuntu14:~$ cat /etc/passwd
...
pi:x:1001:1001:kenGwon,202-1301,02-1004,010-1004,Gaebong:/home/pi:/bin/bash

ubuntu@ubuntu14:~$ sudo cat /etc/shadow
...
pi:$6$yyALgouDQvdKztGo$8J0SEdwaVuhO.g6ksteL0bGqF5ViGGDlRAtLe0IlCCIiAdB30kaQsn50FqGrCOBufd3iDilagdLOKDnI/tnby0:19772:0:99999:7:::


~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf/rootfs/etc/shadow파일 중간에 있던 기존의 pi: 관련 shadow 줄을 삭제하고, 맨 아래다가 '우분투에서 생성하여 가져온 비밀번호 값'을 추가해준다.

'우분투에서 생성하여 가져온 비밀번호 값'
pi:66yyALgouDQvdKztGo$8J0SEdwaVuhO.g6ksteL0bGqF5ViGGDlRAtLe0IlCCIiAdB30kaQsn50FqGrCOBufd3iDilagdLOKDnI/tnby0:19772:0:99999:7:::

원래는 ~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf/rootfs/etc/passwd도 수정해줘야 하지만, 기존에 이미 만들어져있는 pi계정이 존재하여 생략했다.

결과적으로 우리는 우분투를 통해서 [ID] pi / [passwd] raspberry 라는 계정을 만들고 그로 인해 만들어진 비밀번호 해쉬값만 noobs의 루트 파일시스템 계정 정보에 추가해 준 것이다.


기존의 rootfs 지우고, noobs 파일시스템으로 갈기

// 기존의 rootfs 확인
ubuntu@ubuntu14:~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf$ df
Filesystem                1K-blocks      Used Available Use% Mounted on
udev                        4023340         0   4023340   0% /dev
tmpfs                        812816      2992    809824   1% /run
/dev/sda5                 153188848  92134964  53199548  64% /
tmpfs                       4064064         0   4064064   0% /dev/shm
tmpfs                          5120         4      5116   1% /run/lock
tmpfs                       4064064         0   4064064   0% /sys/fs/cgroup
/dev/loop0                      128       128         0 100% /snap/bare/5
/dev/loop1                    65536     65536         0 100% /snap/core20/2105
/dev/loop3                    76032     76032         0 100% /snap/core22/1122
/dev/loop2                   354688    354688         0 100% /snap/gnome-3-38-2004/119
/dev/loop4                    12672     12672         0 100% /snap/snap-store/959
/dev/loop5                   508928    508928         0 100% /snap/gnome-42-2204/141
/dev/loop6                   358144    358144         0 100% /snap/gnome-3-38-2004/143
/dev/loop7                    41472     41472         0 100% /snap/snapd/20671
/dev/loop10                   47104     47104         0 100% /snap/snap-store/638
/dev/loop11                   51072     51072         0 100% /snap/snapd/18357
/dev/loop9                    93952     93952         0 100% /snap/gtk-common-themes/1535
/dev/loop8                    65536     65536         0 100% /snap/core20/2182
/dev/loop12                   75904     75904         0 100% /snap/core22/1033
/dev/sda1                    523248         4    523244   1% /boot/efi
tmpfs                        812812        20    812792   1% /run/user/1000
10.10.15.71:/srv/lect_nfs 153189376 100186112  45148160  69% /mnt/lect_nfs
/dev/sdb1                    522232    131456    390776  26% /media/ubuntu/bootfs
/dev/sdb2                  30082132   5435704  23098136  20% /media/ubuntu/rootfs


// 기존의 rootfs 삭제
ubuntu@ubuntu14:~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf$ sudo rm -rf /media/ubuntu/rootfs/*


// noobs 파일시스템을 SD 카드로 복사 (-a: 원래의 permission 속성을 유지하면서 복사)
ubuntu@ubuntu14:~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf$ sudo cp -ra rootfs/* /media/ubuntu/rootfs/.

noobs 파일시스템을 sudo cp로 그냥 복사하면 모든 파일의 권한이 root:root로 설정되기 때문에, pi라는 계정에 대한 파일들의 권한까지 전부다 root:root로 설정되어 버린다. 우리는 그것을 원하는 것이 아니다. 그렇기 때문에 반드시 copy를 할 때 -a 옵션을 추가해줘야 한다.


SD 카드의 UUID값을 바꿔줘야 한다.

ubuntu@ubuntu14:~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf$ sudo blkid
/dev/sda5: UUID="4f1e4240-474c-4e91-bf99-e62ec0463ba6" TYPE="ext4" PARTUUID="2395cde8-05"
/dev/loop0: TYPE="squashfs"
/dev/loop1: TYPE="squashfs"
/dev/loop2: TYPE="squashfs"
/dev/loop3: TYPE="squashfs"
/dev/loop4: TYPE="squashfs"
/dev/loop5: TYPE="squashfs"
/dev/loop6: TYPE="squashfs"
/dev/loop7: TYPE="squashfs"
/dev/sda1: UUID="BAA4-19F3" TYPE="vfat" PARTUUID="2395cde8-01"
/dev/loop10: TYPE="squashfs"
/dev/loop9: TYPE="squashfs"
/dev/loop11: TYPE="squashfs"
/dev/loop8: TYPE="squashfs"
/dev/loop12: TYPE="squashfs"
/dev/sdb1: LABEL_FATBOOT="bootfs" LABEL="bootfs" UUID="D735-E67D" TYPE="vfat" PARTUUID="f729bde1-01"
/dev/sdb2: LABEL="rootfs" UUID="b69628b0-b5d6-474c-9bed-477305ae01ad" TYPE="ext4" PARTUUID="f729bde1-02"

우리는 여기서 PARTUUID 값을 사용해야 한다.
(나의 경우 f729bde1이다.)

ubuntu@ubuntu14:/media/ubuntu$ sudo vi rootfs/etc/fstab

위 파일을 열면 원래 아래와 같이 나온다.

그 파일을 나의 값으로 바꿔주고 저장한다.

ubuntu@ubuntu14:/media/ubuntu$ sudo vi bootfs/cmdline.txt

그리고 나서 원래의 UUID값과 동일한지 위 명령으로 파일을 열어 비교 확인해본다.

확인 결과 같다는 것을 알 수 있다.


ssh 활성화 하기

우리는 지금 그냥 noobs 파일시스템을 그대로 덮어쓰기 한 상태이기 때문에 그냥 부팅하면 putty로 접근이 안된다. 그래서 아래 명령어를 쳐줘야 한다.

ubuntu@ubuntu14:~/pi_bsp/rootfs/noobs/os/RaspiOS_Full_armhf$ sudo touch /media/ubuntu/bootfs/ssh




noobs를 통한 루트파일시스템 올려보기 실습은 이걸로 끝이다.
라즈베리파이 켜지는지만 확인해보면 된다.
이상이다.

profile
스펀지맨

0개의 댓글