Вариант имени Алиеча

Мы пойдём своим путём!

Автоматизация вызова mkimage (U-Boot) после установки/удаления ядер в Debian GNU/Linux

Итак, grub не нужен, нам нужны лишь скрипты для автоматизации. Справедливости ради стоит отметить, что распространённости grub’а способствовала именно поддержка мейтейнеров и то, что вспомогательных скриптов для него ими написано море. Вот и нам надо для U-Boot’а тоже.

Итак, для начала скрипт, который вызывается после установки пакета с ядром, /etc/kernel/postinst.d/zz-add-u-boot-file:

#!/bin/sh -e

version="$1"

uboot_dir="/mnt/u-boot"
part_num="2"

kernel_string="ext4load mmc 0:${part_num} \${kernel_addr_r} /boot/vmlinuz-${version}"
dtb_string="ext4load mmc 0:${part_num} \${fdt_addr_r} /usr/lib/linux-image-${version}/\${fdtfile}"
initrd_string="ext4load mmc 0:${part_num} \${ramdisk_addr_r} /boot/initrd.img-${version}"
info_string="echo \"Booting Debian GNU/Linux with kernel ${version}...\""
boot_string="bootz \${kernel_addr_r} \${ramdisk_addr_r}:\${filesize} \${fdt_addr_r}"

dest_file="${uboot_dir}/${1}.scr"
tmp_file="/tmp/${1}.src.tmp"

if [ -e "${dest_file}" ]; then
	exit 0
fi

/bin/echo "${kernel_string} && ${dtb_string} && ${initrd_string} && ${info_string} && ${boot_string}" > ${tmp_file}

/usr/bin/mkimage -Cnone -Aarm -Tscript -d${tmp_file} ${dest_file}
rm ${tmp_file}

exit 0

Обратите внимание, что мы предполагаем загрузку с ext4. А значит нужен свежий U-Boot. Переменная $uboot_dir определяет путь, по которому у нас подмонтирован vfat раздел первый (тот, где будет искать скрипты загрузки U-Boot при запуске). Переменная $part_num определяет номер раздела, с которого мы грузим ядро и прочее. Переменные $kernel_string, $dtb_string, $initrd_string, $info_string и $boot_string определяют содержимое нашего scr-файла. Это платформозависимо. Представленные значения, кстати, подойдут для большинства плат на Allwinner’ах. Ну а $dest_file и $tmp_file… Тут итак всё понятно, я думаю)

Теперь скрипт, который будет удалять загрузочный скрипт U-Boot’а при удалении ядра, /etc/kernel/postrm.d/zz-rem-u-boot-file:

#!/bin/sh -e

version="${1}"

uboot_dir="/mnt/u-boot"
dest_file="${uboot_dir}/${version}.scr"

if [ ! -e "${dest_file}" ]; then
	exit 0
fi

rm ${dest_file}

exit 0

Ну и немного perl’а… То, что будет выполнятся после изменения состава файлов-скриптов U-Boot’а, /etc/kernel/postinst.d/zzz-select-u-boot-file и /etc/kernel/postrm.d/zzz-select-u-boot-file:

#!/usr/bin/perl

use strict;
use warnings;
use File::Copy;

my $uboot_dir = "/mnt/u-boot";


my $boot_script = $uboot_dir . "/boot.scr";

if(-e $boot_script) {
	unlink($boot_script) or die("Can't remove current boot script: " . $! . "\n");
}

my %files = ();

opendir(my $dh, $uboot_dir) or die("Can't open u-boot directiry (\"" . $uboot_dir . "\"): " . $! . "\n");
my @flist = grep(!/^boot.scr$/, grep(/\.scr$/, readdir($dh)));

foreach my $file (@flist) {
	my $fpath = $uboot_dir . "/" . $file;

	open(my $fh, "<", $fpath) or die("Can't open u-boot script file " . $fpath . ": " . $! . "\n");
	my @stat = stat($fpath);
	close($fh);

	$files{$stat[9]} = $fpath;
}

closedir($dh);

my @sorted = sort({$b <=> $a} keys(%files));

if($#sorted < 0) {
	print("No more files to boot. Nothing selected!\n");
	exit(0);
}

copy($files{$sorted[0]}, $boot_script) or die("Can't copy file " . $files{$sorted[0]} . " to " . $boot_script . ": " . $! . "\n");
print("Selected file " . $files{$sorted[0]} . " ...\n");

exit(0);

Данная программа на perl (таки да, вполне себе программа, ибо обходится собственными средствами языка) каждый раз удаляет boot.scr, ищет самый свежий файл *.scr и копирует его как новый boot.scr. То есть после перезагрузки у нас будет автоматом грузится последнее установленное ядро.

Всё, процесс установки/удаления ядер автоматизирован. Всем спасибо)

Один комментарий к Автоматизация вызова mkimage (U-Boot) после установки/удаления ядер в Debian GNU/Linux

  1. […] скрипт zz-update-boot-list. Для U-Boot’а больше подошло бы моё предыдущее решение, его надо лишь чуть-чуть адаптировать. Хотя не думаю, […]

    Постоянная ссылка

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

− 2 = 3