|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Alexandr S. Agranovsky 2:5020/400 23 Feb 2003 22:18:27 To : Dmitry Ponyatov Subject : Re: освободить RAm-disk загрузчика системы с rootfs в loopе -------------------------------------------------------------------------------- Hi, Dmitry Ponyatov DP> ? Позволяет ли это BIOS ?), монтирует /dev/hda1: DP> /etc/init.d/rcS: DP> mount /proc DP> mount / -o remount,rw DP> modprobe <нужные ide- или scsi- модули, msdosfs> DP> mount /dev/hda1 /mnt DP> mount /mnt/fatlinux/rootfs /root -o loop это - вынести в /linuxrc DP> chroot /root Лишнее: только создает проблемы на дальнейшем этапе DP> Hо к сожалению никак не удается освободить память, занятую начальным DP> загрузчиком -- freeramdisk /dev/ram0 ругается "device busy" правильно... во-первых, у тебя там уже init и rcS (и интерпретатор bash) запущены, во вторых, если chroot DP> Как правильно освободить память, занятую bootfs /dev/ram0 ? Hа паре машин, DP> на ... для монтирования рутовой файловой системы надо использовтаь не init.d-скрипты в initrd, а написать скрипт и обозвать его /linuxrc, поместить его в корень initrd-образа. Использовать же надо либо команду pivot_root, либо передать ядру параметр root=/dev/loop0 - в этом случае после отработки linuxrc ядро выбросит initrd, перемонтирует root и запустит init с настоящего rootfs. hint: утверждение, что ядро после окончании инциализации первым делом сразу запускает init посредством кода в init/main.c: if (execute_command) execve(execute_command,argv_init,envp_init); execve("/sbin/init",argv_init,envp_init); execve("/etc/init",argv_init,envp_init); execve("/bin/init",argv_init,envp_init); execve("/bin/sh",argv_init,envp_init); panic("No init found. Try passing init= option to kernel."); не верно в смысле "только init, sh или переданное через командную строку". Выше этого текста сразу после do_basic_setup(); идет prepare_namespace(); которая определена в init/do_mounts.c. Если определен CONFIG_BLK_DEV_INITRD то эта функция при соблюдении условия rootfs!=ramdisk вызывает handle_initrd(), который в свою очередь пытается запустить "/linuxrc": pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD); Другими словами, если в ядро вкомпилена поддержка initrd, загружается сам initrd и конечная rootfs не будет размещаться в /dev/ram*, то будет производиться попытка выполнения /linuxrc, расположенного в корне initrd. До монтирования реальной rootfs и запуска init. Вышеописанное было способом номер один. Способ номер два - использование вызова pivot_root - с этим проще, мана тут хватит. Hо способ этот возможен только с ядер 2.4. Hа 2.2/2.0 только /linuxrc. - --- Alexandr S. Agranovsky llb@udmnet.ru --- ifmail v.2.15dev5 * Origin: LLB, LLC (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/3642d7a6aee8.html, оценка из 5, голосов 10
|