8 Comments

  1. Choryu

    이런 임베디드 관련 글을 볼 때마다 좀 헷갈리는게 있는데요,
    uBoot, Ramdisk, SquashFS 라는게 Flash Rom에 어떻게 적재되어 정확히 어떤 일을 하는걸까요?
    검색하면서 찾아본 바로는,
    1. 일단 Flash Rom에서 가장 먼저 읽어서 실행되는 uBoot는 GRUB 같은 부트로더 역할을 하면서
    2. Ramdisk (initramfs) 라는 커널 + 부팅에 필요한 일부 프로그램 등이 들어있는 파티션을 램에 올려주고,
    3. 이에 따라 Kernel이 로드되어서 Boot 과정을 진행 하고,
    4. SquashFS 는 읽기전용으로 리눅스의 루트처럼 시스템 전체를 가지고 있기에 이를 마운트 해서 비로소 시스템 로딩이 완료
    이렇게 되는것으로 이해 하고 있는데, 이게 맞을까요?

    또, 보면 가끔 OpenWRT 펌웨어가 initramfs 랑 SquashFS 로 나뉘어 있던데, 이건 무슨 차이가 있는건가요?

    • perillamint

      우선 프로세서가 부팅되면 프로세서는 Boot ROM 에 있는 코드를 실행하게 됩니다. 이 Boot ROM 코드는 시스템의 기초적 초기화를 담당하며, 이후 지정된 매체 (이 경우는 SPI EEPROM) 에서 추가적인 초기화 바이너리(sram stage) 를 로드하게 됩니다.

      SPI EEPROM 에서 로드된 SRAM Stage 는 메모리 버스 트레이닝과 같은 추가적인 시스템 초기화를 진행합니다. 이러한 초기화 루틴을 거쳐 DRAM 이 준비되면 SRAM stage 는 다음 stage 를 DRAM 에 로드합니다. 이후 이 다음 스테이지가 실행되며, 해당 stage 에서의 초기화 루틴을 거친 뒤, U-Boot 부트로더를 메모리에 로드 후 부트로더가 실행되게 됩니다.

      부트 로더는 부트 로더 설정을 읽어들인 뒤, 리눅스 커널과 램디스크를 메모리에 로드 후 실행하게 되고, 이후 커널은 램디스크에 있는 init 을 실행한 뒤, init script 대로 부트 시퀸스를 진행하게 됩니다.

      플랫폼에 따라 단계가 더 쪼개질 수도, 덜 쪼개질 수도 있지만, 큰 틀은 해당 부트 시퀸스를 따라갈 것입니다.

      OpenWRT 의 경우, initramfs 버전은, 시스템의 모든 구성 요소가 initramfs 안에 들어있는 버전이고, SquashFS 버전은, 시스템의 구성 요소가 OverlayFS 지원을 위해 SquashFS 로 쪼개져 있는 구조입니다.

      보통 initramfs 버전은 ipTIME 과 같은, 이미지 체크섬 검증을 파일 전체 길이에 대해 하는 펌웨어를 가진 하드웨어에 OpenWRT 를 플래싱하기 위한 첫 번째 단계로 사용됩니다. ipTIME 과 같은 시스템의 순정 펌웨어 업그레이드 페이지에 SquashFS 이미지를 올리면 펌웨어 업그레이드 파일 포멧 오류가 뜨지만, initramfs 이미지를 올릴 경우, kernel+initrd 길이가 파일 길이와 같기 때문에 순정 펌웨어의 펌웨어 업그레이드 파일 포멧 검증을 통과하는 것을 볼 수 있습니다.

    • fehead

      WeVO 11AC NAS Router 기종인데
      openwrt-w2914nsv2-wevo.bin
      이게 바로 안올라가네요.
      공지에 내렸다고 올리셨는데 이 기종인가 보군요.

  2. iwevo

    w2914nsv2 제품 사용자입니다
    주인장님 덕분에 손쉽게 정펌에서 openwrt펌으로 손쉽게 변경할 수 있었습니다.
    정말 감사드립니다

  3. 기글 hd 에 올리신 a8004t 개조 글을 보고 여기까지 찾아왔습니다. 작업해주셔서 감사합니다.
    openwrt 를 커스텀 빌드해서 올려보고자 공부중입니다. 검색해서 찾은 정보로 따라하기 수준이라 매우 힘드네요.
    a8004t용은 스냅샷으로만 올라와 있는데, 메인빌드는 openwrt 에서 직접 진행하는것인가요?
    궁금한정보는 openwrt 를 올려서 usb포트에 dac를 연결한후 mpd music server 로 구성하고자 하는 것인데,
    squashfs 를 플래싱한후에 opkg 에서 alsa-utils , kmod-usb-audio , mpd 순으로 설치하고 나서 재부팅하면 제대로 진행이 안되네요.
    가능하다면 openwrt build를 직접해보고 싶은데요, defconfig 를 보내주실수 있을까요? 저는 buildroot 만 사용해봐서 build 후 squashfs와 initramfs 를 각각 어디에 생성되는지도 알려주시면 너무 감사하겠습니다.

    • perillamint

      네 현재 메인라이닝 된 상태이고 OpenWRT 스냅샷 빌드 나오고 있는 상태입니다.

      OpenWRT defconfig 은 빌드 메뉴에서 ramips Arch 의 ipTIME A8004T 를 선택하고 빌드하면 바로 미니멀한 환경은 만들어지게 됩니다. OpenWRT 의 패키지를 함께 빌드해 넣으시고 싶다면 https://openwrt.org/docs/guide-developer/feeds 를 참조하여, Feed 들을 설치하시면, menuconfig 에 추가한 패키지가 보이게 됩니다.

      (혹시 커스텀 피드, 패키지 제작을 하고 싶으시다면 위 링크의 custom_feeds 항목을 참조하시면 됩니다)

      설정이 끝난 뒤, make 를 마치게 되면, 빌드 아티펙트가 bin/targets/ramips/mt7621 폴더 안에 생기게 됩니다 (아키텍쳐 / 플랫폼 조합에 따라 다름 — ipTIME A8004T 의 SoC 는 MT7621 이며, 코어는 Ralink MIPS)

      이 폴더 안에 initrd 이미지와 squashfs 이미지가 생성되게 됩니다.

      • 빠른 답변 정말 감사드립니다.
        말씀하신대로 간단히 원하는 패키지를 추가해서 빌드해봤습니다.
        bin/targets/ramips/mt7621 폴더에 initrd 이미지와 squashfs 이미지도 생성되었습니다..만 (만들어 올리신 파일 사이즈와 비슷한)
        제가 선택한 패키지는 들어가 있지 않네요. 예를들어 alsa-utils 패키지 같은.
        제가 빌드한 squashfs 에서는 스냅샷과 다른 vermagic 때문인지 opkg 로 설치가 되질 않네요. (잘 모르고 하는말입니다)
        질문은 제가 선택한 패키지를 포함한 rootfs 를 만드는 옵션이 따로 있는것인지요?
        그러니까 패키지가 포함된다면 용량은 4메가를 훌쩍 넘을텐데요.
        미리 감사드립니다.

Leave a Reply. You MUST have a previously approved comment to bypass moderation queue, so using same ID between comments are strongly recommended.

This site uses Akismet to reduce spam. Learn how your comment data is processed.