LINUX.ORG.RU
ФорумAdmin

embeded + fstab

 


1

2

Всех приветствую.

Возникла весьма предсказуемая и щекотливая ситуация.

Есть некая железка с линуксом. У нее есть впаяная eMMC и разъём для SD. Если запускаемся без SD, то emmc видится как /dev/mmcblk0 Если в момент запуска ставим SD, то уже SD становится /dev/mmcblk0, а emmc съезжает на /dev/mmcblk1

Чтобы развернуть систему на чистой железке ставим sd-карту с этой системой, грузимся и она после загрузки разбивает emmc на разделы форматирует все что надо и распихивает себя по этим разделам. Дальше мы выдергиваем SD, перегружаемся и спокойно работаем только на emmc.

Ну и как все поняли (поняли же? падме.жпг), что при загрузке с SD и с emmc, это самая emmc будет на разных именах.

Существующие ограничения:

  1. rootfs - строго RO (никакого изменения fs в процессе развертывания)
  2. хочется чтобы mount и т.д. работал корректно - то есть fstab был с нужными именами дисков и разделов
  3. UUID не подходят, так как rootfs один на все устройства (скажем так сильно больше одного), а uuid будет у всех дисков разные.

Потенциальные решения которые я вижу, это как-то подсунуть в параметры ядра какой fstab использовать, а в /etc подложить все варианты fstab, и перед загрузкой ядра определять какой fstab ему использовать. Но судя по известной мне инфе такой возможности у ядра нет.

Как резервный вариант, все что мне надо я буду грузить «руками» из загрузочных скриптов, а из fstab все упоминания mmcblk* уберу. Но тогда mount -a перестанет покрывать эти диски, чего бы не хотелось.

Возможно есть более элегантный способ решения данной проблемы?

★★★★★
Ответ на: комментарий от err

Хмм, об этом как-то не подумал. Надо попробовать. Спасибо за идею

yax123 ★★★★★
() автор топика

Предлагаю монтировать по LABEL.

$ cat /boot/grub/grub.cfg
...
    linux /boot/vmlinuz-6.1.0-21-amd64 \
        root=/dev/disk/by-label/system20221008 \
...

$ cat /etc/fstab
LABEL=system20221008	/	auto	defaults	0 0

LABEL назначается на файловую систему. Для ext4 утилитой e2label.

imatveev13 ★★
()

Не понял фразу про разные uuid. Если rootfs один то и uuid у него везде одинаковый. Он не в таблице разделов записан, это свойство файловой системы. То что в таблице разделов называется partuuid (и он только если таблица gpt).

firkax ★★★★★
()
Ответ на: комментарий от firkax

На разных устройствах (физически) один и тот же логический диск (например /dev/mmcblk1p2) имеют разные UUID. Соответственно, если я с этой же rootfs, в которой в fstab прописаны UUID дисков начну грузится на другой железке, то в силу отличающихся UUID получу ровно ничего.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

Какие-то странные формулировки. Да, у одного и того же логического диска могут быть разные UUID - потому что под этим логическим названием могут оказаться разные устройства. Но если ты будешь втыкать один и тот же физический диск в разные компы, то, под каким бы номером в /dev/ он ни оказался - UUID-ы будут одни и те же. И если ты раздел с файловой системой с него склонируешь с помощью dd - то UUID у клона тоже будет такой же.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

А, я кажется понял, речь не про монтирование rootfs, а про остальные разделы, которые уже отличаются. Ну тогда label остаётся, да. UUID-ы технически одинаковыми конечно можно сделать но это наверно неправильно будет для реально разных файловых систем.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Для ext2 взлетело, а вот фат оказался покрепче. Встроенный в бизибокс mkfs.vfat имеет ключ для метки, но blkid эту метку не видит. Причем метку vfat с раздела на sd нормально видит. Похоже надо еще бизибокс хачить и патчить.

yax123 ★★★★★
() автор топика
Последнее исправление: yax123 (всего исправлений: 1)
Ответ на: комментарий от yax123

Мдя, как хорошо, что погрепал git busybox-а. в 1.35.1 исправили баг с label для vfat. Обновился и сразу все заколосилось как надо.

Всем спасибо, все свободны.

yax123 ★★★★★
() автор топика

Я остановился на том что меняю порядок контроллеров mmc в u-boot (патчу dtb) в зависимости от того откуда загружаюсь.

Мне кажется метки у разделов – это от лукавого. Оно не сломается если после раскатки на eMMC воткнуть SD с теми же лейблами (UUID, или что там ещё может уникально идентифицировать раздел, но на самом деле не уникально)?

com
()
Последнее исправление: com (всего исправлений: 1)

Можно ещё посмотреть в сторону /dev/disk/by-*

Например, использовать by-path или by-id, тогда не важно, будет это mmcblk0 или mmcblk1, устройство будет определяться по физическому подключению.

LABEL — норм вариант, но by-path иногда стабильнее именно для таких случаев с eMMC + SD.

Fonhuaicho
()
Ответ на: комментарий от Fonhuaicho

Можно ещё посмотреть в сторону /dev/disk/by-*

У меня нет /dev/disk/by-* Используется полностью самосборная минималистичная система. Образ rootfs целиком ~40-47MB (но хотелось бы подсушить до 30-35), поэтому важно не тянуть лишних зависимостей.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от com

порядок контроллеров mmc в u-boot (патчу dtb)

Зайтеливо. А можно глянуть как меняете порядок контроллеров в dtb?

воткнуть SD с теми же лейблами

Сломается наверно. Но меня спасает, то что источник загрузочных SD я сам и никто кроме меня не будет там метки расставлять. Метки я тоже сам придумываю. Так что вероятность того, что всё сломают исчезающе мала. С другой стороны даже если воткнут такую флешку, в целом никакого ущерба не будет. Исчезнут персистентные настройки, останутся дефолтные, флешку выдернут и все вернется взад.

yax123 ★★★★★
() автор топика
Последнее исправление: yax123 (всего исправлений: 1)
Ответ на: комментарий от yax123

Оверлей:

/dts-v1/;
/plugin/;

/ {
	fragment@0 {
		target-path = "/aliases";
		__overlay__ {
			mmc0 = "/mmc@fe2b0000";
			mmc1 = "/mmc@fe310000";
		};
	};
};

Кусок в *-u-boot.dtsi:

&fit {
	images {
		fdt-dto-<как-там-тебя-зовут>-overlay-sd-boot {
			description = "какой-нибудь дескрипшн";
			type = "flat_dt";
			compression = "none";

			blob-ext {
				filename = "<имя-файла-с-оверлеем.dtbo>";
			};

#ifdef CONFIG_SPL_FIT_SIGNATURE
			hash {
				algo = "sha256";
			};
#endif
		};
	};

	configurations {
		default = "@config-DEFAULT-SEQ";

		@config-SEQ {
			fdt = "fdt-1",
			      "fdt-dto-<как-там-тебя-зовут>-overlay-sd-boot";
		};
	};
};

Применялка в файле с бордой:

#if CONFIG_IS_ENABLED(LOAD_FIT_APPLY_OVERLAY)
int board_spl_fit_append_fdt_skip(const char *name)
{
	u32 bootdevice_brom_id;

	/* Make SD primary device if we've booted from SD */
	bootdevice_brom_id = readl(BROM_BOOTSOURCE_ID_ADDR);

	if (bootdevice_brom_id == BROM_BOOTSOURCE_SD) {
		if (!strcmp(name, "fdt-dto-<как-там-тебя-зовут>-overlay-sd-boot"))
			return 0;
	}

	return 1;	/* Skip this DTO */
}
#endif

Рокчип, так что BROM_BOOTSOURCE_ID_ADDR – это специфичное для рокчипа.

com
()
Ответ на: комментарий от com

Никогда бы не подумал, что энумирация устройств идет по порядку имен в алиасах. Спасибо за идеи, мы ими конечно не воспользуемся )))

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yars068

Можно с

Как было уже понято чуть выше, проблема совсем не rootfs, а остальных дисковых устройствах.

yax123 ★★★★★
() автор топика
  1. PARTUUID, LABEL на разделах
  2. Задать определённые фиксированные названия устройствам в DTB, как написал @com (не /dev/sdX, а /dev/microsdX, /dev/emmcX)
  3. Задать определённые фиксированные названия устройствам в правилах udev (не /dev/sdX, а /dev/microsdX, /dev/emmcX)
  4. Использовать systemd-gpt-auto-generator и различные аналоги, предоставляемые системами обновлений embedded’а (swupdate, rauc)
  5. Использовать World Wide Name
ValdikSS ★★★★★
()
Последнее исправление: ValdikSS (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.