Это ответ на отличную статью от 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 <Enter> to begin or F2, F3, or F4 to view boot options.
Изменение inittab
Для загрузки прямо в Vim, нам надо поменять конфигурацию инициализации. Отредактируем следующий файл:
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 можно найти здесь.
Автор: Myshov