vak: (Default)
[personal profile] vak
Я уже писал, как за два простых шага установить и запустить Debian на плате pic32mz-da. Компиляцию U-Boot для микроконтроллера pic32 я тоже описывал. Здесь я покажу, как собрать из исходников ядро Linux, и как с нуля построить образ файловой системы Debian на карточке micro-SD.

1. Строим ядро Linux для pic32

Исходные тексты ядра Linux для микроконтроллеров семейства pic32mz-da были опубликованы фирмой Microchip а 2015 году. Я внес два небольших исправления: доработал драйвер SDHC, чтобы обойти багу с короткими обменами (описанную в Errata sheet), и добавил флаги в ядре, нужные для корректного функционирования systemd.

Вот как выглядит компиляция под Ubuntu версии 18.04. Огромное спасибо Мите Коротину, который первым прошёл этот трудный путь и показал мне все хитрости. Устанавливаем кросс-компилятор:
sudo apt-get install gcc-mips-linux-gnu
Скачиваем тексты ядра Linux, с правками для PIC32:
git clone https://github.com/sergev/linux-pic32.git
Конфигурируем и собираем. Здесь я предполагаю, что в каталоге u-boot-pic32 находится U-Boot, готовый и собранный для pic32. Нам от него понадобится утилита mkimage:
cd linux-pic32
make ARCH=mips CROSS_COMPILE=mips-linux-gnu- pic32mzda_defconfig
make ARCH=mips CROSS_COMPILE=mips-linux-gnu-
gzip -9 < arch/mips/boot/vmlinux.bin > arch/mips/boot/vmlinux.bin.gz
../u-boot-pic32/tools/mkimage -A MIPS -a 0x88000000 -e 0x88000400 -d arch/mips/boot/vmlinux.bin.gz arch/mips/boot/vmlinux-pic32
mkdir -p ../boot
cp -a arch/mips/boot/uImage ../boot/vmlinux-pic32
cp -a arch/mips/boot/dts/pic32/pic32mzda_sk.dtb ../boot/pic32mzda.dtb
В результате мы имеем в папке boot бинарное ядро и дерево устройств, которое надо будет поместить в папку /boot файловой системы на SD-карточке.

Собираем загружаемые модули:
make ARCH=mips CROSS_COMPILE=mips-linux-gnu- INSTALL_MOD_PATH=$PWD/.. modules_install
Содержимое папки lib/modules/ надо будет скопировать в /lib/modules на SD-карточке.

2. Собираем файловую систему Debian для mips32

Файловую систему нетрудно получить, воспользовавшись симулятором QEMU и установив свежий Debian 9.0 "Stretch" на виртуальную платформу MIPS32 Malta.

Устанавливаем симулятор QEMU:
sudo apt install qemu-system-mips
Скачиваем ядро Линукса и установочный образ для платформы Malta:
wget http://ftp.debian.org/debian/dists/stretch/main/installer-mipsel/current/images/malta/netboot/vmlinux-4.9.0-11-4kc-malta
wget http://ftp.debian.org/debian/dists/stretch/main/installer-mipsel/current/images/malta/netboot/initrd.gz
Создаём образ жёсткого диска:
qemu-img create -f qcow2 hda.qcow 8G
Устанавливаем Debian:
qemu-system-mipsel \
-cpu 4KEc \
-M malta \
-m 512 \
-hda hda.qcow \
-kernel vmlinux-4.9.0-11-4kc-malta \
-initrd initrd.gz \
-append "root=/dev/sda1 nokaslr" \
-nographic


Продолжаем установку до самого конца, в соответствии с запросами на экране. Процесс занимает несколько часов. Подробности смотрите в инструкции по установке Debian.

По ходу установки создаётся образ initrd.img, который содержит компоненты, необходимые для старта системы. Нужно извлечь этот файл с виртуального диска. Утилита qemu-nbd даёт возможность смонтировать образ диска QEMU.
sudo apt-get install qemu-utils
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 hda.qcow
sudo mount /dev/nbd0p1 /mnt
cp /mnt/boot/initrd.img-4.9.0-1-4kc-malta .
sudo umount /mnt
Загружаем систему с получившегося диска:
qemu-system-mipsel \
-cpu 4KEc \
-M malta \
-m 512 \
-hda hda.qcow \
-kernel vmlinux-4.9.0-11-4kc-malta \
-initrd initrd.img-4.9.0-11-4kc-malta \
-append root=/dev/sda1 \
-nographic
Входим как root, архивируем всё в один файл и пересылаем на основной компьютер. Здесь username - ваше имя на основном компьютере:
cd /
tar cf rootfs-4.9.0-11-4kc-malta.tar bin boot etc home lib media mnt opt root sbin srv usr var
scp rootfs-4.9.0-11-4kc-malta.tar username@10.0.2.2:
Все упомянутые файлы можно скачать в готовом виде здесь: http://vak.ru/pub/unix/debian-on-mips32/

3. Формируем карточку micro-SD

Создаём пустой файл размером 7 Гбайт - будущий образ карточки micro-SD.
dd if=/dev/zero of=pic32fs.img seek=7516192767 bs=1 count=1
Чтобы смонтировать файл как диск, воспользуемся драйвером /dev/loop. Сначала выясним, какое из устройств /dev/loop# свободно на вашем компьютере:
losetup -f
В моём случае это /dev/loop31, у вас может быть что-то другое. В последующих командах будем использовать это значение. Подключим наш файл как диск /dev/loop31:
losetup /dev/loop31 pic32fs.img
Вызовем редактор разделов:
gparted /dev/loop31
Создайте таблицу разделов в формате msdos. Создайте два раздела:
  • Раздел №1 - формат ext4, с 256 Мбайт свободного пространства после него;
  • Раздел №2 - формат linux-swap, размером 256 Мбайт.
Выйдите из редактора gparted. Смонтируйте полученный раздел №1:
sudo mount /dev/loop31p1 /mnt
Распакуйте файловую систему Debian из предыдущего пункта:
sudo tar xf rootfs-4.9.0-11-4kc-malta.tar.gz -C /mnt
Скопируйте ядро, дерево устройств и загружаемые модули из первого пункта:
cd /mnt
rm -rf boot/* lib/modules/*
cp -a ~/boot .
cp -a ~/lib/modules/* lib/modules/
Создайте недостающие папки:
cd /mnt
sudo mkdir dev proc sys tmp run
sudo chmod 777 tmp
sudo chmod +t tmp
Вызовите текстовый редактор и замените содержимое файла /mnt/etc/fstab следующим:
/dev/mmcblk0p1 /    ext4 errors=remount-ro 0 1
/dev/mmcblk0p2 none swap sw 0 0
В текстовом редакторе замените последние две строки файла /mnt/etc/network/interfaces на следующие:
allow-hotplug eth0
iface eth0 inet dhcp
Запретите автоматическое обновление пакетов, иначе оно будет тормозить систему в самый неподходящий момент:
sudo echo "APT::Periodic::Enable "0";" > /mnt/etc/apt/apt.conf.d/20auto-upgrades
Размонтируйте файловую систему и отключите /dev/loop:
sudo umount /mnt
losetup -d /dev/loop31
Файловая система Debian для pic32 готова. Запишите её на карточку micro-SD и можете грузить систему. Как это сделать - читайте здесь. Готовый файл можно скачать по ссылке: pic32fs-minimal.zip