Rootfs와 Kernel 빌드 (feat Makefile)

2025. 7. 21. 11:23·Linux

RootFileSystem

OS에서 필요한 기본 어플리케이션이나 라이브러리 같은 기본 파일들 : 사용자 공간 파일 시스템

  • /에 담기는 기본 파일 (init 프로세스, shell, 라이브러리)

init 프로세스

리눅스 커널이 가장 먼저 띄우는 1번 프로세스 (PID: 1)

  • 루트파일시스템이 준비되면 /sbin/init을 맨 처음 실행함
    • systemd: 가장 유명한 init
      • /etc/systemd/아래의 설정파일들을 읽어서 서비스 실행
      • Ubuntu, fedora등이 사용
    • android init: 안드로이드 init
    • systemV: 가장 오래된 init
    • shell: shell만 실행할 수 도..

커널와 Rootfs는 다름

  • 커널: 하드웨어 제어, 프로세스 및 메모리 관리
  • Rootfs: 커널 외부에 존재, 사용자 프로그램 과 설정파일들 포함

커널안에 Rootfs가 포함되어있는게 아님

  1. 커널 부팅
  2. Rootfs 마운트
  3. /sbin/init 실행
  4. 사용자 공간 진입

의 순서


준비 과정

rootfs를 사용자가 직접구성하는건 시간이 너무 많이 들기때문에

buildroot라는 오픈소스를 사용

  • buildroot는 설정파일 (make menuconfig)를 통해 해당 아키텍처, 라이브러리, 패키지 지정하고 자동으로 Rootfs 빌드
  • 모든 빌드는 aarch64 기준으로 진행, 크로스 컴파일러는 Arm developer에서 다운
  1. Buildroot 설정 및 빌드
    1. ARM64타겟으로 설정
    2. systemd init 시스템 사용
    3. rootfs.ext4 이미지 생성
  2. 리눅스 커널 빌드
    1. Arm developer에서 제공하는 툴체인 사용
    2. 크로스 컴파일 진행
    3. 빌드 완료
  3. QEMU로 실행
    1. 커널과 Rootfs를 QEMU로 구동

QEMU로 리눅스 실행

buildroot와 qemu를 사용하여 빌드 완료

현재 환경을 이중 가상화 구조인데

macOS -> UTM (가상 리눅스) -> QEMU (가상 리눅스)


Makefile

하기 전에,

잠깐 기초 내용 복습

Complie

소스코드를 어셈블리어(바이너리)로 변환 과정

ex) main.c를 gcc -c main.c하면 mian.o 생성. 여기서 main.o는 목적파일

foo.c와 bar.c를 main.c에서 include하고 있다면, foo.o bar.o main.o를 링킹

gcc main.o foo.o bar.o -o main 을 하면 목적파일들 링킹, 실행파일 main 생성

왜 사용?

if) main.c foo.c bar.c 에서 main.c만을 수정했다고 가정.

단순히 gcc명령어들로 shell script를 작성하면 main.c 수정시마다 모든 .c파일들을 컴파일해야함

-> 시간 비효율

But, Makefile을 작성하면 필요한 부분만 컴파일 가능

3요소

  • target: 생성할 것
  • command: 실행할 것
  • dependency: 필요한 것
foo.o: foo.h foo.c
    gcc -c foo.c
bar.o: bar.h bar.c
    gcc -c bar.c
main.o: main.c foo.h bar.h
    gcc -c main.c
main: foo.o bar.o main.o
    gcc foo.o bar.o main.o -o main

ex, foo.o를 만들기 위해서는 foo.h와 foo.c가 필요하고 .o를 만들 명령어는 gcc -c foo.c이다.

만약에, foo.c가 수정되었을 경우

  1. make main을 실행, 타겟이 main인거 찾음
  2. main.o foo.o bar.o필요함 -> 각각 어떻게 만드는 지 또 찾음
  3. foo.o를 찾음
  4. foo.o의 생성 시간보다 foo.c의 수정시간이 더 나중
  5. 이런 부분들만 명령어 재실행

'Linux' 카테고리의 다른 글

Makefile  (2) 2025.07.24
OS 기초 이론  (0) 2025.07.23
Linux개발 환경  (4) 2025.07.17
Arm 어셈블리 명령어 간단 소개  (0) 2023.08.10
Arm프로세서와 Arm아키텍쳐  (0) 2023.08.09
'Linux' 카테고리의 다른 글
  • Makefile
  • OS 기초 이론
  • Linux개발 환경
  • Arm 어셈블리 명령어 간단 소개
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    c언어
    소수
    commit
    커널 기여
    rubikpi3
    yolo
    토발즈
    시스템콜
    이진 트리
    arm
    자료구조
    커널
    INIT
    C++
    백준
    rubik pi
    순환
    피보나치
    Branch
    리눅스
    스택
    파일 입출력
    앤드류모튼
    파이썬
    Git
    포인터
    동적메모리
    Qualcomm
    버퍼
    드라이버 분석
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
Rootfs와 Kernel 빌드 (feat Makefile)
상단으로

티스토리툴바