5.1. 64-bit ARM 에서 설치 프로그램 부팅하기

5.1.1. 콘솔 설정

그래픽 설치 프로그램은 stretch의 arm64 debian-installer 이미지에서는 기능이 빠져 있기 때문에 시리얼 콘솔을 사용합니다. 콘솔 장치를 펌웨어에서 자동으로 찾아내지만, 찾아내지 못하는 경우 나중에 GRUB 메뉴에서 리눅스를 부팅할 때 Booting Linux 메시지가 나오고, 아무 것도 나오지 않습니다.

이런 문제를 겪는다면 커널 명령행에 특정 콘솔을 지정하는 설정을 넣어야 합니다. GRUB 메뉴에서 e를 눌러 Edit Kernel command-line으로 들어가고,

--- quiet

처럼 되어 있는 부분을

console=<장치>,<속도>

형식으로 바꿉니다. 예를 들어

console=ttyAMA0,115200n8

처럼 씁니다. 다 마치면 Control+x를 눌러 새로운 설정으로 부팅합니다.

5.1.2. Juno 설치

Juno에는 EFI가 들어 있으므로 설치는 직관적입니다. 보통 USB 메모리에서 설치합니다. USB 부팅이 동작하려면 최신 펌웨어가 필요합니다. 2015년 3월 이후 빌드를 http://releases.linaro.org/latest/members/arm/ 위치에서 가져오면 동작합니다. 펌웨어 업데이트에 대해서는 Juno 문서를 참고하십시오.

표준 arm64 CD 이미지를 USB 메모리에 준비합니다. USB 메모리를 뒤의 USB 포트 중 하나에 꽂습니다. 시리얼 케이블을 뒤쪽 위의 9핀 시리얼 포트에 연결합니다. 네트워크가 필요하면 (네트워크 부팅 이미지의 경우) 이더넷 케이블을 앞에 있는 소켓에 연결합니다.

시리얼 콘솔을 115200, 8비트, 패리티 없음 설정으로 연결하고 Juno를 부팅합니다. USB 메모리에서 부팅해서 GRUB 메뉴까지 진행하게 됩니다. 콘솔 설정은 Juno에서 제대로 검색하지 못해서 Enter 키를 눌러도 커널 출력이 나오지 않습니다. 콘솔을

console=ttyAMA0,115200n8

설정으로 바꿉니다. (5.1.1절. “콘솔 설정” 위치에 설명.) Control+x를 누르면 debian-installer 화면이 나타납니다. 여기에서 마찬가지로 설치를 계속 진행하면 됩니다.

5.1.3. Applied Micro Mustang 설치

UEFI는 이 시스템에서 사용할 수 있지만 U-Boot가 들어 있으므로, UEFI 펌웨어를 먼저 설치하고 표준 부팅/설치를 할 수도 있고, 아니면 U-Boot 부팅을 사용할 수도 있습니다. 그래픽 설치는 arm64 아키텍쳐에서 빠져 있으므로 시리얼 콘솔을 사용해 설치를 진행해야 합니다.

추천하는 설치 방법은 debian-installer 커널과 initrd를 하드디스크에 복사하고 시스템에 들어 있는 openembedded 시스템을 이용해 부팅하고 설치 프로그램을 실행하는 방법입니다. 아니면 TFTP를 사용해 커널/DTB/initrd를 복사한 다음 부팅합니다(5.1.4.1절. “U-Boot에서 TFTP 부팅”). 설치 후에 설치한 이미지에서 부팅하도록 수동으로 수정해야 합니다.

115200, 8비트, 패리티 없음으로 시리얼 콘솔을 실행하고 시스템을 부팅합니다. 시스템을 부팅하고 Hit any key to stop autoboot: 메시지가 나올 때 키를 누르면 Mustang# 프롬프트가 나옵니다. 이 때 U-Boot 명령으로 커널, DTB, initrd를 읽어들입니다.

5.1.4. TFTP로 부팅하기

네트워크에서 부팅하려면, 네트워크에 연결되어 있어야 하고 TFTP 네트워크 부팅 서버가(그리고 네트워크 자동 설정에 필요한 DHCP, RARP 혹은 BOOTP 서버가) 필요합니다.

서버 쪽에서 네트워크 부팅을 설정하는 방법은 4.3절. “TFTP 네트워크 부팅에 필요한 파일 준비하기”에 설명되어 있습니다.

5.1.4.1. U-Boot에서 TFTP 부팅

U-Boot 펌웨어를 사용하는 시스템에서 네트워크 부팅은 3가지 단계로 이루어져 있습니다: (1) 네트워크 설정, (2) 이미지(커널/최초 램디스크/DTB) 메모리에 읽어들이기, (3) 읽어들인 코드 실행.

먼저 네트워크를 설정해야 합니다. 다음을 실행해 DHCP로 자동 설정할 수 있습니다:

setenv autoload no
dhcp

아니면 수동으로 환경 변수를 설정할 수 있습니다:

setenv ipaddr <클라이언트의 IP 주소>
setenv netmask <네트마스크>
setenv serverip <TFTP 서버의 IP 주소>
setenv dnsip <네임서버의 IP 주소>
setenv gatewayip <기본 게이트웨이의 IP 주소>

위 설정을 저장하고 싶으면 다음과 같이 합니다:

saveenv

그 다음에 이미지(커널/최초 램디스크/DTB)를 메모리에 읽어들여야 합니다. TFTP 명령에 메모리를 읽어들일 위치의 주소를 써야 합니다. 하지만 메모리 배치가 시스템마다 다르기 때문에 어떤 주소를 사용해야 하는지는 일반적인 규칙은 없습니다.

일부 시스템에서는, U-Boot에 적합한 로딩 주소가 환경 변수로 미리 정의되어 있습니다: kernel_addr_r, ramdisk_addr_r 및 fdt_addr_r. 이 환경 변수가 정의되어 있는지 여부를 다음 명령으로 확인해 볼 수 있습니다

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

이 값이 정의되어 있지 않으면, 시스템의 문서에서 적절한 값을 확인해 보고 직접 값으 지정해야 합니다. 예를 들어 Allwinner SunXi SOC 기반 시스템(예: Allwinner A10, 아키텍쳐 이름 sun4i 또는 Allwinner A20, 아키텍쳐 이름 sun7i)의 경우, 다음 값을 사용합니다.

setenv kernel_addr_r 0x46000000
setenv fdt_addr_r 0x47000000
setenv ramdisk_addr_r 0x48000000

로딩 주소를 지정하면, 다음과 같이 앞에서 지정한 TFTP 서버에서 이미지를 메모리에 읽어들일 수 있습니다:

tftpboot ${kernel_addr_r} <커널 이미지 파일 이름>
tftpboot ${fdt_addr_r} <DTB 파일 이름>
tftpboot ${ramdisk_addr_r} <최초 램디스크 이미지 파일 이름>

3번째는 커널 커맨드라인을 설정하고 읽어들인 코드를 실행하는 부분입니다. u-boot는 bootargs 환경 변수의 내용을 커널의 커맨드라인으로 넘깁니다. 그러므로 커널 및 설치 프로그램의 파라미터는(콘솔 장치(5.3.1절. “부팅 콘솔” 참고) 또는 미리 설정 옵션(5.3.2절. “데비안 설치프로그램 파라미터”부록 B. 미리 설정을 이용한 설치 자동화 참고)) 다음과 같은 명령으로 설정할 수 있습니다:

setenv bootargs console=ttyS0,115200 rootwait panic=10

읽어들인 코드를 실행하는 정확한 명령은 이미지 형식에 따라 다릅니다. uImage/uInitrd의 경우 명령어는 다음과 같고,

bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}

네이티브 리눅스 이미지의 경우 다음과 같습니다:

bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}

표준 리눅스 이미지로 부팅할 때, 커널과 DTB를 읽어들이고 다음에 최초 램디스크 이미지를 읽어들이는 게 중요합니다. U-Boot에서는 파일 크기 변수를 마지막에 읽어들인 파일의 크기로 설정하고, bootz 명령이 제대로 동작하려면 램디스크 이미지의 크기가 필요하기 떄문입니다. 플랫폼 전용 커널로 부팅하는 경우(예를 들어 디바이스 트리 없는 커널)에는 ${fdt_addr_r} 파라미터를 생략하면 됩니다.