====== Подготовка SD карты для загрузки Linux ====== ===== Запись U-Boot на microSD-card ===== Узнать имя устройства, связанное c SD картой, можно командой «lsblk» user@localhost:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 111,8G 0 disk fd0 2:0 1 4K 0 disk sdc 8:32 1 7,4G 0 disk └─sdc1 8:33 1 7,4G 0 part /media/rootfs sda 8:0 0 232,9G 0 disk ├─sda2 8:2 0 1K 0 part ├─sda5 8:5 0 7,6G 0 part [SWAP] ├─sda1 8:1 0 130,4G 0 part / └─sda6 8:6 0 94,9G 0 part /windows Предположим, что SD карта видна в системе как /dev/sdc export DISK=/dev/sdc **Очистка microSD** sudo dd if=/dev/zero of=${DISK} bs=1M count=10 **Установка загрузчика** sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k ===== Создание таблицы разделов на microSD ===== Отмонтируйте SD-карту, выполнив команду: sudo umount /dev/sdc1 Проверка версии sfdisk: sudo sfdisk --version Для версии sfdisk >= 2.26.x: sudo sfdisk ${DISK} <<-__EOF__ 4M,,L,* __EOF__ Для версии sfdisk <= 2.25.x: sudo sfdisk --unit M ${DISK} <<-__EOF__ 4,,L,* __EOF__ ===== Форматирование разделов ===== Проверка версии mkfs.ext4: sudo mkfs.ext4 -V Для версии mkfs.ext4 >= 1.43: sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}1 Для версии mkfs.ext4 <= 1.42: sudo mkfs.ext4 -L rootfs ${DISK}1 **Монтирование карты** На большинстве операционных систем монтирование происходит автоматически, но если этого не произошло, монтируем с использованием команд: sudo mkdir -p /media/rootfs/ sudo mount ${DISK}1 /media/rootfs/ ====== Запись ядра и файловой системы ====== Файл ядра и модулей получают выполнением инструкций на странице [[u3b-kernel|компиляции ядра]]. После исполнения скрипта build_kernel.sh появится следующее сообщение: ----------------------------- Script Complete eewiki.net: [user@localhost:~$ export kernel_version=4.X.Y-Z] ----------------------------- Скопируйте в командную строку сообщение "export kernel_version=4.X.Y-Z" в точности, как написано в окне терминала и выполните: export kernel_version=4.X.Y-Z **Запись файловой системы** sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/ sync sudo chown root:root /media/rootfs/ sudo chmod 755 /media/rootfs/ **Запись файла ядра zImage** : sudo cp -v ./ti-linux-kernel-dev/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version} **Запись модулей ядра** sudo tar xfv ./ti-linux-kernel-dev/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/ **Опеределение версии ядра в переменной окружения uname_r** sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt" **Запись бинарных файлов для дерева устройств** sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/ sudo tar xfv ./ti-linux-kernel-dev/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/ **Исправьте fstab** sudo sh -c "echo '/dev/mmcblk0p1 / auto errors=remount-ro 0 1' >> /media/rootfs/etc/fstab" **Включение сети** Исправьте: /etc/network/interfaces sudo nano /media/rootfs/etc/network/interfaces Добавьте строки: auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp Исправьте: /etc/udev/rules.d/70-persistent-net.rules sudo nano /media/rootfs/etc/udev/rules.d/70-persistent-net.rules Добавьте строки: # BeagleBone: net device () SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" **Запись файла uEnv.txt** Создайте файл: vi uEnv.txt Добавьте в него строки: loadaddr=0x82000000 fdtaddr=0x88000000 rdaddr=0x88080000 initrd_high=0xffffffff fdt_high=0xffffffff #for single partitions: mmcroot=/dev/mmcblk0p1 loadximage=load mmc 0:1 ${loadaddr} /boot/vmlinuz-${uname_r} loadxfdt=load mmc 0:1 ${fdtaddr} /boot/dtbs/${uname_r}/${fdtfile} loadxrd=load mmc 0:1 ${rdaddr} /boot/initrd.img-${uname_r}; setenv rdsize ${filesize} loaduEnvtxt=load mmc 0:1 ${loadaddr} /boot/uEnv.txt ; env import -t ${loadaddr} ${filesize}; loadall=run loaduEnvtxt; run loadximage; run loadxfdt; mmcargs=setenv bootargs console=tty0 console=${console} ${optargs} ${cape_disable} ${cape_enable} root=${mmcroot} rootfstype=${mmcrootfstype} ${cmdline} uenvcmd=run loadall; run mmcargs; bootz ${loadaddr} - ${fdtaddr}; Запишите файл на SD-карту: sudo cp -v ./uEnv.txt /media/rootfs **Извлеките SD/microSD карту** sync sudo umount /media/rootfs ====== Подготовка eMMC для загрузки Linux ====== ===== Запись загрузчика ===== Для последующей записи загрузчика U-Boot на eMMC скопируйте файлы MLO/u-boot.img на SD карту sudo mkdir -p /media/rootfs/opt/backup/uboot/ sudo cp -v ./u-boot/MLO /media/rootfs/opt/backup/uboot/ sudo cp -v ./u-boot/u-boot.img /media/rootfs/opt/backup/uboot/ Для последующей работы необходимо загрузиться с SD/microSD и выполнять следующие действия, будучи в системе ARM Linux. ===== Запись U-Boot на eMMC ===== Узнать имя устройства, связанное с eMMC, можно командой «lsblk» root@arm:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk1boot0 179:16 0 16M 1 disk mmcblk1boot1 179:24 0 16M 1 disk mmcblk0 179:0 0 7.4G 0 disk └─mmcblk0p1 179:1 0 7.4G 0 part / mmcblk1 179:8 0 3.6G 0 disk В данном случае, eMMC видна в системе как /dev/mmcblk1 export DISK=/dev/mmcblk1 **Очистка eMMC** dd if=/dev/zero of=${DISK} bs=1M count=10 **Установка загрузчика** dd if=/opt/backup/uboot/MLO of=${DISK} count=1 seek=1 bs=128k dd if=/opt/backup/uboot/u-boot.img of=${DISK} count=2 seek=1 bs=384k ===== Создание таблицы разделов на eMMC ===== Проверка версии sfdisk: sfdisk --version Для версии sfdisk >= 2.26.x: sfdisk ${DISK} <<-__EOF__ 4M,,L,* __EOF__ Для версии sfdisk <= 2.25.x: sfdisk --unit M ${DISK} <<-__EOF__ 4,,L,* __EOF__ ===== Форматирование разделов ===== Проверка версии mkfs.ext4: mkfs.ext4 -V Для версии mkfs.ext4 >= 1.43: mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}p1 Для версии mkfs.ext4 <= 1.42: mkfs.ext4 -L rootfs ${DISK}p1 **Монтирование карты** На большинстве операционных систем монтирование происходит автоматически, но если этого не произошло, монтируем с использованием команд: mkdir -p /media/rootfs/ mount ${DISK}p1 /media/rootfs/ **Узнайте версию установленного ядра** root@arm:~# uname -a Linux arm 4.X.Y-Z #1 SMP Tue May 2 16:26:46 MSK 2017 armv7l GNU/Linux Скопируйте в командную строку сообщение "export kernel_version=4.X.Y-Z" и выполните: export kernel_version=4.X.Y-Z **Скачайте и распакуйте архив с исходным кодом файловой системы** wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-8.7-minimal-armhf-2017-03-02.tar.xz apt-get install xz-utils tar xf debian-8.7-minimal-armhf-2017-03-02.tar.xz ^ User ^ Password ^ | root | root | **Запись файловой системы** tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/ sync chown root:root /media/rootfs/ chmod 755 /media/rootfs/ **Запись файла ядра zImage** : cp -v /boot/vmlinuz-${kernel_version} /media/rootfs/boot/zImage **Запись модулей ядра** mkdir -p /media/rootfs/lib/modules cp -r /lib/modules/${kernel_version} /media/rootfs/lib/modules **Запись файла uEnv.txt** Создайте файл: vi /media/rootfs/uEnv.txt Добавьте в него строки: loadaddr=0x82000000 fdtaddr=0x88000000 rdaddr=0x88080000 initrd_high=0xffffffff fdt_high=0xffffffff #for single partitions: mmcroot=/dev/mmcblk1p1 loadximage=load mmc 1:1 ${loadaddr} /boot/zImage loadxfdt=load mmc 1:1 ${fdtaddr} /boot/dtbs/${uname_r}/${fdtfile} loadxrd=load mmc 1:1 ${rdaddr} /boot/initrd.img-${uname_r}; setenv rdsize ${filesize} loaduEnvtxt=load mmc 1:1 ${loadaddr} /boot/uEnv.txt ; env import -t ${loadaddr} ${filesize}; loadall=run loaduEnvtxt; run loadximage; run loadxfdt; mmcargs=setenv bootargs console=tty0 console=${console} ${optargs} ${cape_disable} ${cape_enable} root=${mmcroot} rootfstype=${mmcrootfstype} ${cmdline} uenvcmd=run loadall; run mmcargs; bootz ${loadaddr} - ${fdtaddr}; **Опеределение версии ядра в переменной окружения uname_r** sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt" **Запись бинарных файлов для дерева устройств** mkdir -p /media/rootfs/boot/dtbs/ cp -r /boot/dtbs/${kernel_version} /media/rootfs/boot/dtbs **Исправьте fstab** sh -c "echo '/dev/mmcblk1p1 / auto errors=remount-ro 0 1' >> /media/rootfs/etc/fstab" **Включение сети** Исправьте: /etc/network/interfaces nano /media/rootfs/etc/network/interfaces Добавьте строки: auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp Исправьте: /etc/udev/rules.d/70-persistent-net.rules nano /media/rootfs/etc/udev/rules.d/70-persistent-net.rules Добавьте строки: # BeagleBone: net device () SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" **Отмонтируйте eMMC** sync umount /media/rootfs