[Linux] 임베디드 리눅스 부팅 타임 최적화

2025. 11. 19. 16:53·Embedded Systems/리눅스

임베디드 리눅스 프로젝트를 수행하며 좋은 아티클이 있어 번역해보았다.

https://medium.com/@therealcomtom/reducing-linux-booting-time-b5d0a061e05a


임베디드 장치들은 어떻게 그렇게 빠르게 부팅되는지 궁금해본 적 있는가?
그런 기기들은 자원이 매우 제한적임에도 불구하고, 데스크탑이나 노트북 컴퓨터와 비교했을 때 부팅 시간을 상당히 줄여낸다.

 

물론, 기본적으로 임베디드 장치들은 단 하나의 작업만 수행하도록 설계되어 있기 때문에, 운영체제가 불필요한 기능이 제거된 축소 버전이며, 거의 항상 리눅스 기반이다. 그리고 그 운영체제는 특정 하드웨어를 대상으로 빌드되기 때문에, 일반적인 리눅스 배포판처럼 다양한 기종을 지원할 필요도 없다.

 

그렇다면 이런 장치들에서 사용되는 기법을 적용해, 기능을 잃지 않으면서도 우리의 컴퓨터에서도 비슷한 수준의 부팅 시간을 얻을 수 있을까?

이 질문에 답하기 위해, 먼저 리눅스 머신의 부팅 과정이 어떻게 구성되어 있는지 간단히 살펴보자.

 

Firmware

임베디드 장치들은 보통 매우 기본적인 펌웨어를 탑재하고 있으며, 이 펌웨어는 특정 엔트리 포인트에서 부트로더를 가져온다. 반면, 일반 컴퓨터는 훨씬 복잡한 구조를 가지고 있고, 요즘은 UEFI라고 불리는 펌웨어를 사용한다. UEFI는 이전 세대의 펌웨어인 BIOS의 동작을 에뮬레이션하는 레거시 모드로도 부팅할 수 있다.

 

UEFI든 BIOS든, 우리가 활성화하는 옵션들은 모두 부팅 시간을 더 소모할 수 있다. 특히 부팅 중 장치 탐색, 네트워크 스택이 활성화되어 있을 경우 더욱 그렇다.

 

조언: 필요 없는 하드웨어를 비활성화하라.
예를 들어, 사용하지 않는 IDE나 SATA 채널을 비활성화할 수 있다. 자동 탐색 기능은 시간이 소요되기 때문이다.

 

Bootloader

현재의 GNU/Linux 배포판들은 일반적으로 GRUB을 사용한다. GRUB은 꽤 느린데, 특히 배경 이미지를 추가하거나 화면 해상도를 변경할 때 더욱 그렇다.

 

물론 더 빠른 systemd-boot(이전 이름은 gummiboot) 같은 부트로더로 교체할 수도 있다. 하지만 내 입장에서는 그렇게까지 하는 것이 번거롭다. 나는 안정성이 검증되었고 경험도 많은 “구식” GRUB을 계속 사용하는 편을 선호한다.

 

GRUB 기본 설정을 조금 변경하면, 타임아웃을 0으로 줄이고 그래픽 출력을 비활성화할 수 있다. 이런 설정을 적용하면 GRUB은 매우 빠르게 로드되며, 심지어 존재하지 않는 것처럼 느껴질 수도 있다.

$ vi /etc/default/grub

GRUB_TIMEOUT=0
GRUB_TERMINAL=console

Initramfs

부팅 체인에서 다음 단계는 initramfs를 로드하는 것이다. initramfs는 작은(혹은 결코 작지 않은) 이미지로, 커널이 부팅 과정에서 필요로 할 수 있는 커널 모듈들을 제공하는 파일시스템을 포함한다. 예를 들어 파일시스템 드라이버나 SATA 컨트롤러 드라이버 등이 여기에 포함된다.

 

최근 Debian 버전에서 initramfs는 약 22MB 정도이다. 이 이미지는 다양한 장치를 부팅할 수 있도록 유지관리자가 일반적인 구성으로 빌드한 것이다. 하지만 그 많은 드라이버들 중 실제로 우리가 특정 장치를 부팅하는 데 필요한 것은 극히 일부에 불과하다. 극단적으로는 initramfs 자체를 없애고, 관련 부팅 드라이버들을 모두 모듈이 아닌 커널 내부에 포함시켜 커널을 다시 컴파일하는 방식도 가능하다. 이렇게 하면 부팅 시간에서 상당한 시간을 절약할 수 있다.

 

하지만 커널을 다시 컴파일하지 않고도 부팅 시간을 최적화할 수 있다. initramfs 설정을 변경하고 새로운 이미지를 생성하는 것만으로 충분하다. dep 옵션을 사용하면 현재 시스템에서 실제로 로드된 모듈만 이미지를 구성하는 방식이다. 이 방법으로 내가 테스트한 경우 initramfs 이미지가 6MB로 줄었다.

 

또한 압축 알고리즘을 변경하면 시간 절약이 가능하다. 일부 알고리즘은 데이터를 더 빠르게 압축 해제하기 때문이다. 내 경우에는 lz4가 가장 빨랐다. CPU에 따라 결과는 달라질 수 있다. 이미지 크기는 약 6.6MB가 되었지만, 압축 해제 속도가 훨씬 빨라졌다.

$ sudo vi /etc/initramfs-tools/initramfs.conf

MODULES=dep
COMPRESS=lz4

$ sudo update-initramfs -u

 

Kernel

여기(커널)서 무언가를 바꾸고 싶다면 커널을 다시 컴파일해야 한다. 하지만 나는 내 배포판에서 제공하는 사전 컴파일된 커널을 사용하는 것을 선호한다.

 

그런데 잠깐! 콘솔에 메시지를 출력할 때 커널은 printk 호출을 사용한다. 일반적으로 콘솔 출력은 시스템 콜을 통해 처리되며, 이는 프로그램을 중단(interrupt)시키므로 성능에 악영향을 줄 수 있다. 이 경우 완전히 동일한 방식은 아니지만, 콘솔에 출력하는 것 자체가 자원을 낭비하는 것은 사실이다.

 

다행히, 우리는 (거의 모든) 출력 메시지를 비활성화할 수 있다.

GRUB 기본 설정을 다시 수정하면 systemd의 “Loading service” 메시지를 모두 제거할 수 있다. 이렇게 하면 커널은 부팅 시 버전 정보 한 줄과 파일시스템 체크 출력 정도만 보여주며, 하드웨어 오류가 없다면 그 외 메시지는 나타나지 않는다.

$ vi /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=3"

또한 사용하지 않는 하드웨어를 검출하지 않도록 블랙리스트에 추가할 수도 있다. 예를 들어 다음과 같이 커널 모듈 블랙리스트 파일을 생성할 수 있다:

$ cat /etc/modprobe.d/dvb.conf
blacklist dvb_usb_rtl28xxu

 

Init scripts and service units

부팅 과정의 다음이자 마지막 단계는, SystemV(init) 또는 최신 배포판의 경우 Systemd를 로드하고 그 위에서 모든 시스템 서비스를 실행하는 것이다.

 

최근 GNU/Linux 배포판에서는 Systemd가 훨씬 일반적이기 때문에, 여기서는 Systemd에 집중하겠다.

 

Systemd는 부팅 속도를 측정하기 쉽게 해주는 훌륭한 도구를 제공한다.

$ systemd-analyze

 

Systemd 설정 자체를 조정하는 것만으로는 부팅 속도가 크게 개선되지 않는다는 점을 알게 되었다. 대신, 불필요한 시스템 서비스를 비활성화하는 것이 부팅 시간 절감에 훨씬 효과적이다.

Systemd를 사용해 어떤 서비스가 부팅을 가장 지연시키는지 확인할 수 있다.

$ systemd-analyze blame

이 명령은 시작하는 데 오래 걸린 서비스 목록을 보여준다. 목록의 상위 항목부터 확인하여, 실제로 필요하지 않은 서비스들을 비활성화하면 된다. 예를 들어:

$ sudo systemctl disable NetworkManager-wait-online.service

 

매번 부팅할 때 필요한 서비스만 활성화해야 한다는 점을 기억하라.
예를 들어 개발자인 경우 MySQL이나 PostgreSQL이 필요할 때도 있지만, 매번 켜둘 필요는 없다. 부팅 시간 단축을 위해 비활성화해두고, 필요할 때만 수동으로 실행할 수 있다.

$ sudo systemctl disable mysql.service

 

개인적인 경험으로는, 개발 환경에서 필요한 서비스를 시스템에 직접 설치해두는 것보다 Docker를 사용하는 것이 훨씬 실용적이었다.
Docker를 사용하면 필요한 서비스들을 개발 머신과 분리할 수 있고, 환경 문제, 버전 문제 같은 여러 골칫거리를 피할 수 있다. 또한 일관되고 신뢰할 수 있는 환경을 제공하기 때문에 CI(Continuous Integration)에도 적합하며, 소프트웨어 배포에도 그대로 사용할 수 있다.

Conclusion

몇 가지 작은 변경만으로도 리눅스 시스템의 부팅 시간을 약 700% 단축할 수 있다. 즉, 시스템에 따라 최대 7배 더 빠르게 부팅할 수 있다는 의미다.
이 수치는 주로 하드디스크의 지연 시간(latency)과 전송 속도에 크게 영향을 받는다. 예를 들어 M.2 SSD는 SATA 드라이브보다 훨씬 빠르다.

내 경우, 노트북에서 전체 부팅 완료까지 약 4초가 걸렸고, GDM 로그인 화면은 약 2초 만에 나타났다.

'Embedded Systems > 리눅스' 카테고리의 다른 글

[Linux] BBB Linux boot time 최적화 #0  (0) 2025.11.04
[Linux] U-boot 가 리눅스 커널을 로드하는 구체적인 과정 정리(1)  (0) 2025.10.30
[Linux] 임베디드 리눅스 부팅 순서 + 비글본 블랙(BBB) 부팅 순서  (0) 2025.10.28
[Linux] 디바이스 드라이버란 무엇일까?  (0) 2025.10.27
[Linux] 리눅스의 프로그래밍 도구 (GCC, make, gdb 유틸리티)  (0) 2025.10.27
'Embedded Systems/리눅스' 카테고리의 다른 글
  • [Linux] BBB Linux boot time 최적화 #0
  • [Linux] U-boot 가 리눅스 커널을 로드하는 구체적인 과정 정리(1)
  • [Linux] 임베디드 리눅스 부팅 순서 + 비글본 블랙(BBB) 부팅 순서
  • [Linux] 디바이스 드라이버란 무엇일까?
jh-rrr
jh-rrr
기술의 깊이에 집중하며 성장하길 지향합니다.
  • jh-rrr
    Embedded World
    jh-rrr
  • 전체
    오늘
    어제
    • 분류 전체보기 (64)
      • 소프트웨어 (17)
        • 프로그래밍 (2)
        • C (10)
        • Python (1)
        • 운영체제 (3)
        • 네트워크 (0)
      • Embedded Systems (16)
        • 리눅스 (10)
        • MCU 기본 (2)
        • 임베디드 레시피 (0)
      • Projects (1)
        • Cortex-M3 (1)
        • 재난 구조 로봇 (0)
      • AI (11)
        • Computer Vision (2)
        • Deep Learning (3)
        • cs224n (2)
        • cs231n (2)
      • 취업 준비 (0)
        • 프로젝트 & 자격증 (1)
      • 엔지니어링 뉴스 (3)
      • Paper Reviews (4)
      • Insights (8)
        • Seminar ! (2)
        • 서평 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    conda: command not found
    리눅스 오류
    커널 이미지란
    리눅스
    essential deep learning paper reading
    OS 이미지
    kernel image 란
    일귀
    커널 이미지
    stm32f 시리즈를 이용한 arm cortex-m3/m4 구조와 응용
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
jh-rrr
[Linux] 임베디드 리눅스 부팅 타임 최적화
상단으로

티스토리툴바