- При загрузке системы указываем опцию ядра «init=/bin/bash»
- Когда загрузились — перемонтируйте файловую систему в режим чтения/записи «mount / -o remount,rw»
- «passwd root» и указываем новый пароль
- Перезагружаемся
Конечный этап загрузки ядра Linux — запуск процесса init. В конце ядерной функции kernel_init происходит вызов init_post(). В ядре 2.6.37 эта функция выглядит так:
818static noinline int init_post(void)
819{
820 /* need to finish all async __init code before freeing the memory */
821 async_synchronize_full();
822 free_initmem();
823 mark_rodata_ro();
824 system_state = SYSTEM_RUNNING;
825 numa_default_policy();
826
827
828 current->signal->flags |= SIGNAL_UNKILLABLE;
829
830 if (ramdisk_execute_command) {
831 run_init_process(ramdisk_execute_command);
832 printk(KERN_WARNING «Failed to execute %s\n»,
833 ramdisk_execute_command);
834 }
835
836 /*
837 * We try each of these until one succeeds.
838 *
839 * The Bourne shell can be used instead of init if we are
840 * trying to recover a really broken machine.
841 */
842 if (execute_command) {
843 run_init_process(execute_command);
844 printk(KERN_WARNING «Failed to execute %s. Attempting «
845 «defaults…\n», execute_command);
846 }
847 run_init_process(«/sbin/init»);
848 run_init_process(«/etc/init»);
849 run_init_process(«/bin/init»);
850 run_init_process(«/bin/sh»);
851
852 panic(«No init found. Try passing init= option to kernel. «
853 «See Linux Documentation/init.txt for guidance.»);
854}
По умолчанию запускается процесс «/sbin/init» (847 строчка). А то что мы укажем через опцию «init=…» будет запущено в 843 строчке. Функция run_init_process — это всего лишь обертка для kernel_execve.
Вообще в ядре есть очень много интересных опций загрузки, которые сильно упрощают жизнь при восстановлении системы. Подробнее о них написано в документе, который находится в корне исходников ядра Documentation/kernel-parameters.txt или можете почитать тут для ядра 2.6.37.