[Перевод] Загружаемся в Vim или Vim c PID 1
Это ответ на отличную статью от Pascal Bourguignon, в которой он рассказывает о том, как запустить Emacs с PID 1.
Как мы все знаем, никто не использует Emacs.
Предложение выше как бы намекает, что это начало очередной священной войны. Пожалуйста, начинайте. Если вам хочется что-то мне сообщить, все мои контакты у меня в блоге.
На самом деле, шутки в сторону. Я считаю, что это отличная статья, и после прочтения мне захотелось посмотреть, смогу ли я сделать что-то похожее с Vim. Не в пользовательском режиме Linux, но в действительности создав ISO для загрузки. Можно сказать, «загрузиться в Vim», если вам так хочется.Это, действительно, достаточно просто. Скомпилируйте Vim статически, установите init= для загрузки, и все готово.
Мы будем использовать маленький (9Mb) дистрибутив Tiny Core, Core edition и настроим его так, чтобы загрузка шла прямо в наш статически собранный Vim.
Собираем VimПожалуйста, следуйте другому моему руководству про то как собрать статически слинкованный Vim. В результате вы получите исполняемый файл, который мы будем использовать далее в этом руководстве.Подготовка Вам понадобится несколько инструментов, чтобы собрать ISO, а именно cpio, tar, gzip, advdef и mkisofs. Их, скорее всего, можно установить с помощью вашего пакетного менеджера, если они еще не установлены. Пожалуйста, сделайте это для начала.Сначала создадим директорию для построения:
mkdir vim-as-pid-1 cd vim-as-pid-1 Также создадим пару директорий для построения ISO:
mkdir /tmp/isomount mkdir extract Скачиваем последнюю версию Tiny Core, Core edition (без GUI):
wget http://distro.ibiblio.org/tinycorelinux/5.x/x86/release/Core-current.iso Копируем файлы из скаченного ISO:
mount Core-current.iso /tmp/isomount/ -o loop, ro cp -a /tmp/isomount/boot /tmp/ Эти команды создадут директорию /tmp/boot с загрузчиком и файлом core.gz. Не забудьте его размонтировать:
umount /tmp/isomount Мы будем использовать директорию /tmp/boot далее, когда будем все собирать вместе в ISO-файл.
Изменение ISO-файла Переходим в директорию, куда будет извлечен core.gz — корневая директория файловой системы:
cd extract Используем zcat и cpio, чтобы извлечь корень файловой системы из core.gz:
zcat /tmp/boot/core.gz | cpio -i -H newc -d У нас теперь есть извлеченная корневая директория файловой системы:
# ls bin dev etc home init lib linuxrc mnt opt proc root run sbin sys tmp usr var Поместите скомпилированный на предыдущем шагу исполняемый файл Vim в директорию bin/
cp ~/vim bin/ Вы также можете сделать еще разные настройки, например, отредактировать сообщение загрузчика. Он находится в файле с именем boot.msg в директории /tmp/boot/isolinux/:
# vim /tmp/boot/isolinux/boot.msg ^L _ ( — Boot to Vim //\ Vim as Pid 1, because Awesome! v_/_ https://raymii.org/
Press
vim etc/inittab Меняем эти строки:
:: sysinit:/etc/init.d/rcS tty1:: respawn:/sbin/getty 38400 tty1 на:
:: sysinit:/bin/vim tty1:: respawn:/bin/vim Собираем новенький ISO Убедимся, что мы все еще находимся в директории с именем extract. Далее пустим в дело следующую команду для построения нового файла tinycore.gz, который наш ISO будет использовать как initramfs: find | cpio -o -H newc | gzip -2 > …/tinycore.gz Копируем его в файл с названием core.gz в директорию /tmp/boot, которую мы скопировали ранее:
cp …/tinycore.gz /tmp/boot/core.gz Создаем новую директорию для файлов, которые будут находиться в новом ISO:
mkdir /tmp/newiso Копируем в нее директорию /tmp/boot:
cp -a /tmp/boot /tmp/newiso/ Собираем ISO, используя mkisofs:
cd /tmp/ mkisofs -l -J -R -V Boot_To_Vim -no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -o Boot_to_Vim.iso newiso Теперь у вас в /tmp есть файл с названием Boot_to_Vim.iso:
ls -la /tmp/Boot_to_Vim.iso -rw-r--r-- 1 root root 11044864 Sep 17 08:05 /tmp/Boot_to_Vim.iso Вы можете использовать его для загрузки в виртуальной машине или для прожига на диск. Если вы выйдете из Vim, он запустится снова.
Вы можете вызвать настоящий shell, набрав :! sh в командном режиме. Для выключения используйте команду :! halt.
Больше информации по ремастерингу Tiny Core можно найти здесь.