LINUX.ORG.RU

История изменений

Исправление dimgel, (текущая версия) :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"
# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT
cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Показывать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =) Я и так дохрена рассказал.

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать.

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Все репы (в т.ч. и главная, и совсем левые) конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет свою репу (общую для всех оверлеев). Рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest. Также например у меня в локальной репе свежий qt-creator – гентушные мейнтейнеры крайне редко его обновляют, приходится брать пользовательские ebuild-ы из месяцами висящих тикетов.

P.S. А ник мой ты без собаки написал, соответственно я уведомления не получил, и зашёл сюда вообще случайно.

Исправление dimgel, :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"
# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT
cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Показывать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =) Я и так дохрена рассказал.

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать.

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Все репы (в т.ч. и главная, и совсем левые) конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет свою репу (общую для всех оверлеев). Рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest.

P.S. А ник мой ты без собаки написал, соответственно я уведомления не получил, и зашёл сюда вообще случайно.

Исправление dimgel, :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"
# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT
cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Показывать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =) Я и так дохрена рассказал.

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать.

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Совсем левые репы конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет репу (общую для всех оверлеев). Рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest.

P.S. А ник мой ты без собаки написал, соответственно я уведомления не получил, и зашёл сюда вообще случайно.

Исправление dimgel, :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"
# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT
cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Показывать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =) Я и так дохрена рассказал.

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать.

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Совсем левые репы конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет репу (общую для всех оверлеев). Рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest.

Исправление dimgel, :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev

mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"

# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT
cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Показывать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =) Я и так дохрена рассказал.

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать.

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Совсем левые репы конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет репу (общую для всех оверлеев). Рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest.

Исправление dimgel, :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev

mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"

# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT

cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Показывать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =)

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать.

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Совсем левые репы конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет репу (общую для всех оверлеев). Рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest.

Исправление dimgel, :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev

mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"

# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT

cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Копировать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =)

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать.

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Совсем левые репы конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет репу (общую для всех оверлеев). Рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest.

Исправление dimgel, :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev

mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"

# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT

cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Копировать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =)

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать).

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Совсем левые репы конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет репу (общую для всех оверлеев). Рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest.

Исправление dimgel, :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev

mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"

# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT

cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Копировать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =)

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать).

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Совсем левые репы конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет репу (общую для всех оверлеев), рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest.

Исходная версия dimgel, :

  1. В какой директории собираются пакеты?

/var/tmp/portage. Чтобы не сажать SSD, он у меня замонтирован в tmpfs 32G (могу себе позволить).

Не забудь поставить/настроить ccache: в долгой перспективе где-то 30% cache hits он даст (на моём конфиге; даже с учётом, что кеш надо сбрасывать при смене текущей версии gcc); а если придётся с каким-то пакетом трахаться, многократно туда-сюда его пересобирая, то в этом случае польза от ccache будет более чем ощутима.

max_size = 40G
cache_dir = /var/tmp/ccache
cache_dir_levels = 3
compiler_check = %compiler% -v

  1. Шифрование диска.

Все файловые системы зашифрованы (кроме UEFI FAT32, где стоит sys-boot/refind и скомпилятые с CONFIG_EFI_STUB ядра). У меня и самопальный скрипт, генерирующий initramfs, и самопальный init. Как это делается «стандартно-общепринято», я не знаю. Причина – хотелось странного + проблемы с адресацией диска по UUID. Не помню в чём там было дело, но сохранился камент:

# `findfs UUID=<uuid>` or `blkid -U <uuid>` can be used without eudev; they return "/dev/sd*".

Какие-то у меня были траблы с этими /dev/sd* (возможно, эта адресация дисков была разная в init-скрипте и в основной системе, и если в конфиге mdadm прописать не UUID-ы, у mdadm слетала крыша). Вдоволь натрахавшись, я в итоге стал тупо копировать весь udev в initramfs и вызывать его в init; он мне создаёт полное полноценное /dev/, включая требуемые симлинки в /dev/disk/by-uuid/. После чего mdadm собирает зеркало, а cryptsetup стартует уже поверх зеркала (хз кто из них должен быть ниже из общефилософских соображений, но из сугубо практических – шифрация выполняется один раз, и зашифрованные данные пишутся в оба диска рейда).

Мой init-скрипт (сильно покоцанный: на самом деле я там один раз пароль запрашиваю вызовом read -p "Password: " -s PASS и потом расшифровываю все рейды одним паролем: echo $PASS | cryptsetup luksOpen ...):

#!/bin/busybox sh
/bin/busybox --install -s

# Devtmpfs is required by eudev.
mount -t devtmpfs none /dev

mount -t proc none /proc
mount -t sysfs none /sys

# UEFI FAT32:
export CHECK_EUDEV="/dev/disk/by-uuid/1234-5678"

# Googled somewhere:
udevd --daemon --resolve-names=never
while [ ! -e $CHECK_EUDEV ]; do
        udevadm trigger --action=add --type=subsystems
        udevadm trigger --action=add --type=devices
        udevadm settle
        sleep 2
done
udevadm control --exit
udevadm info --cleanup-db

export CRYPTED_ROOT="/dev/md0"
export RAID_UUID_ROOT="12345678:12345678:12345678:12345678"
mdadm -q --assemble $CRYPTED_ROOT --uuid $RAID_UUID_ROOT

cryptsetup luksOpen --allow-discards $CRYPTED_ROOT root
mount -o ro -t ext4 /dev/mapper/root /mnt/newroot

# Without `mount --move`, load hangs after switch_root, maybe because /dev/mapper is lost after /dev is unmounted.
mount --move /dev /mnt/newroot/dev
mount --move /proc /mnt/newroot/proc
mount --move /sys /mnt/newroot/sys
exec switch_root /mnt/newroot /sbin/init

Помимо стандартных вещей, мой генератор (вызываемый моим же скриптом пересборки ядра) добавляет в initramfs-файл: модули ядра из /lib/modules/{VERSION}, busybox, mdadm (с конфигом), udevd + udevadm (и все udev-конфиги и правила), cryptsetup – а также shared-либы – зависимости всего вышеперечисленного, определяемые вызовами ldd.

Копировать свой скрипт генерации initramfs, как и результирующий файл не хочу: во-первых обосрут (и вполне возможно, что заслуженно, а переделывать не хочу), а во-вторых, путь гентушника – страдание! =)

Что мне вот действительно интересно, так это насколько гибким и удобным на практике окажется арчевый mkinitcpio, ежели мне вдруг приспичит. Хотя с моими приколами (read общего пароля – не единственный) наверное будет проще тупо свой скрипт адаптировать).

  1. Правильно ли я понял, что оверлеи – это как сторонние репозитории в той же Ubuntu?

Хз как организованы репы в убунте. В layman – единый централизованный реестр оверлеев. Совсем левые репы конфигурируются в /etc/portage/repos.d, куда emerge layman добавляет репу (общую для всех оверлеев), рекомендуется также найти в гентушной вике руководство по созданию локального оверлея – иногда пригождается, когда старая версия пакета исчезает из основного дерева, а как раз тебе она и нужна: тогда выковыриваешь из git log соответствующие ebuild-ы вместе с патчами, копируешь себе в локальную репу и подписываешь: ebuild old-package-version.ebuild digest.