Pull to refresh

Comments 51

Был создан файл autologin.c следующего содержания:

А смысл создавать отдельный бинарник, если всё то же самое делается простейшим шелл-скриптом?
Ага, где-то на 1/104 секунды один раз при входе в систему.
А в inittab'е нельзя прописать сразу команду, типа такого:
1:2345:respawn:/sbin/agetty -n -l "/bin/login -f root" tty1 9600
?
mingetty поддерживает автологин, если прописать соответствующую опцию.
Проблема в том, что GRUB работать с UUID умеет, а ядро — нет, то есть напрямую монтировать корневую систему по UUID (не зная имени устройства) невозможно. Это не баг, а следствие идейных соображений Линуса Торвальдса, поэтому на такую возможность и в будущем надеяться не стоит.
А что тогда вот это делает у меня в grub.cfg?

linux /boot/vmlinuz-2.6.38-8-generic root=UUID=fb44ba52-19a4-4a88-9ff2-a1c2b3c7083c ro
Этот UUID передается в ядро, но ядро по нему смонтировать root не сможет. Именно для этого создается initramfs, которая монтируется, запускается init, который, в свою очередь, ищет по UUID имя, понятное ядру (например /dev/sda1) и уже по нему монтируется настоящая файловая система.
А почему оно работает при init=/bin/sh?
Могу ошибаться, но, наверное потому, что /bin/sh существует в примонтированной временной initramfs?
Возможно. Вообще, если заглянуть в /init/do_mounts.c, то можно там разглядеть следующую вещь:

We accept the following variants:

1) device number in hexadecimal represents itself
2) /dev/nfs represents Root_NFS (0xff)
3) /dev/<disk_name> represents the device number of disk
4) /dev/<disk_name> represents the device number
of partition — device number of disk plus the partition number
5) /dev/<disk_name>p — same as the above, that form is
used when disk name of partitioned disk ends on a digit.
6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
unique id of a partition if the partition table provides it.

If name doesn't have fall into the categories above, we return (0,0).
block_class is used to check if something is a disk name. If the disk
name contains slashes, the device name has them replaced with
bangs.

А если заглянуть в LKML, то можно там разглядеть строки вида root=PARTUUID=99DE9194-FC15-4223-9192-FC243948F88B

Так что есть вменяемые решения, позволяющие обойтись убогого костыля, коим является initramfs.
Смотрим в том же файле дальше. А именно:

                root_device_name = saved_root_name;
                if (!strncmp(root_device_name, "mtd", 3) ||
                    !strncmp(root_device_name, "ubi", 3)) {
                        mount_block_root(root_device_name, root_mountflags);
                        goto out;
                }
                ROOT_DEV = name_to_dev_t(root_device_name);
                if (strncmp(root_device_name, "/dev/", 5) == 0)
                        root_device_name += 5;
        }

Видим там name_to_dev_t. Смотрим исходник:

        if (strncmp(name, "PARTUUID=", 9) == 0) {
                name += 9;
                if (strlen(name) != 36)
                        goto fail;
                res = devt_from_partuuid(name);
                if (!res)
                        goto fail;
                goto done;
        }

Это ванильное ядро 2.6.38. Всё давно уже есть. А Вы дальше читайте глупые книжки и используйте древние костыли.


магические константы, как же я их люблю!
Это стандартный приём для кода в ядрах. Вы исходники виндового посмотрите, ещё и не такое увидите.
Сам-то пробовал прежде чем кричать? PARTUUID работает только на GPT.
А флешку с единственным разделом в GPT форматнуть релилия не позволяет?
Ребят, я же сейчас сделаю образ, который будет грузиться в консоль без initrd.
Я тоже могу сделать. Но там во-первых будет использоваться PARTUUID, а не UUID как сказано в вашем первом посте, а во-вторых GPT разметка вместо MBR. Да, GPT круче во всех отношениях, но о ней мало кто знает и её не умеет обычный fdisk.
о ней мало кто знает
О ней знают ядро и GRUB. BIOS-у про неё знать совершенно не обязательно, специально для этих целей есть раздел «BIOS Boot partition». 2 мегабайта с GRUB-ом и получаем загрузку с GPT откуда угодно.
и её не умеет обычный fdisk.

А кому он нужен, собственно?
А ещё я совершенно не понимаю, зачем надо было использовать этот ваш LFS вместо создания минимального (нет, это не тот, что дают в debootstrap, тут поколдовать надо) образа той же убунты, наложив при этом пару патчей на ядро?
Может быть. Но сборка LFS помогла понять многие внутренние процессы в работе Linux.
Всем малость поднадоел Денис Попов со своей BolgenOS, а также все, кто до сих пор пытаются петросянить на эту тему.
Спасибо за интересную статью. Мне интересен LFS, я как раз собираюсь с ним разобраться и установить на встраиваемую систему телемеханники. Интересует, почему вы остановились именно на RTLinux, хотя существует множество вариантов сделать из Linux real-time систему, такие как Xenomai, KURT, RTAI и может еще какие. У вас был осознанный выбор и если да, то какие преимущества и недостатки у остальных систем?
В данном случае глубокого исследования не проводилось. Просто были рассмотрены варианты и RT-патч (не RTLinux!) приглянулся тем, что там не добавляется никакого специфического API.
В будущем надеюсь проанализировать и другие решения.
umount -v /mnt/USBOSTmp/dev/pts
umount -v /mnt/USBOSTmp/dev/shm
umount -v /mnt/USBOSTmp/dev
umount -v /mnt/USBOSTmp/proc
umount -v /mnt/USBOSTmp/sys

for d in dev/pts dev/shm dev proc sys; do
unmount -v /mnt/USBOSTmp/$d;
done
а насколько сложно будет скомпилировать под LFS иксы и какой-нибудь WM? например xfce?
и сколько дней займет
Меньше, чем за сутки мой компьютер пересобирает все установленные на нём пакеты. Вот несколько самых «тяжёлых» вместе со временем в секундах:
464 subversion:
475 php:
482 povray:
483 polkit:
489 sbcl:
494 glib:
539 grub:
547 numpy:
560 wxGTK:
627 boost:
639 samba:
691 pygtk:
745 tar:
754 pango:
810 udev:
858 glibc:
956 fftw:
1025 gimp:
1070 gcc:
1094 gtk+:
1233 nano:
2103 avidemux:
2413 wine:
2893 ghc:
4689 chromium:
да уж, больше похоже что числа — это PID-ы :)
Если собирать Gentoo с KDE-4.6.4 с обычным набором ПО (из бинарного разве что libreoffice-bin), то получаем 1 день 54 минуты на машине с AMD Phenom(tm) II X6 1035T (2.6 GHz) и 4-мя гигабайтами оперативной памяти.

% emerge -pe world | genlop --pretend

Estimated update time: 1 day, 54 minutes.
это все хорошо, но сколько времени еще потребуется на ручную докачку и сборку зависимостей :)
Указанная цифра — это время сборки со всеми зависимостями.
Но да, всё, что делает Gentoo, придётся делать вручную — качать, патчить, запускать сборку…
Есть проект Beyond Linux From Scratch (BLFS), который является продолжением LFS. Там тоже есть книга.
По поводу дней — все зависит от свободного времени, энтузиазма, скорости компьютера и желания разбираться.
LFS, например, я (параллельно с другими делами) первый раз собирал 3-4 дня. Потом, когда многое стало просто и понятно, следующая сборка (с более новыми библиотеками и софтом) заняла около 1 дня (тут все уперлось в производительность).
Если желания разбираться нет, то можно покопать в сторону Automated Linux From Scratch (ALFS) для автоматической сборки.
Ловите образ. Грузится с флешки до консоли без initrd по UUID раздела на любом биосе, умеющем бутиться с USB Mass Storage.

initrd не нужен. Пора бы уже избавиться от древних костылей.
Согласно моему опыту сборки читать нужно самый актуальный LFS на английском языке и никак иначе. Правила от версии к версии меняются, а русские варианты, тем более указанный Вами серьезно отстают от актуальной книги
Вы не рассматривали вариант загрузки по PXE/TFTP с последующей работой по NFS?
И я как-то не понял если честно зачем вам RT ядро? Пользовательский интерфейс у вас по каким протоколам работает?
Нет, до других вариантов руки пока не дошли.
Пользовательский интерфейс подцеплен по TCP/IP.
А RT-ядро там с целью обеспечения гарантированного времени отклика при работе с движками (в различных вариациях 2-10 мс).
Тиражировать можно с помощью dd if=flashka of=/dev/flashka что я и делал для порядка 15 компов.
а если флешки разных размеров?
если больше, то чаще всего пофиг, а вот если меньше, то структура фс нарушается.
Образ уживается по-минимуму, а потом на раздел натравливается resize2fs, который расширит файлуху.
Не верю в универсальность дистрибутива, у которого нет swap по умолчанию.
Универсальность — понятие неоднозначное. В посте идет речь про «real-time»-систему, запускаемую с флешки. И, если применение swap-а в «real-time»-системе для меня лично сомнительно (хотя могу и ошибаться), то, что касается флешки — не думаю, что найдется много желающих использовать swap.
Тем более, что в моем случае «универсальность» подразумевает под собой применение специализированной для выполнения определенной задачи системы, не привязанной, однако, к конкретному компьютеру.
>Тем более, что в моем случае «универсальность» подразумевает под собой применение специализированной для выполнения определенной задачи системы.

То есть универсальность по Вашему, это заточенность под специализированную задачу? Я бы посоветовал Вам почитать словарь.

Свап для реалтайма — впринципе не нужно(в qnx если не ошибаюсь свапа тоже нет), а вот для универсальности это важно(IMHO) — до сих пор существует куча софта, который чисто принципиально использует своп и его отсутствие может негативно сказаться на определенной группе ПО и о универсальности, как таковой можно забыть.
Sign up to leave a comment.

Articles