Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: освободить RAm-disk загрузчика системы с rootfs в loopе   Alexandr S. Agranovsky   23 Feb 2003 22:18:27 
 Re: освободить RAm-disk загрузчика системы с rootfs в loopе   Dmitry Ponyatov   24 Feb 2003 12:23:04 
 Re: освободить RAm-disk загрузчика системы с rootfs в loopе   Dmitry Ponyatov   24 Feb 2003 12:29:04 
Архивное /ru.linux/3642d7a6aee8.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional