This is a text-only version of the following page on https://raymii.org:
---
Title       :   Boot to Vim, Vim as Pid 1
Author      :   Remy van Elst
Date        :   18-09-2014
URL         :   https://raymii.org/s/blog/Vim_as_PID_1_Boot_to_Vim.html
Format      :   Markdown/HTML
---




- **Update 22-04-2023:** I've figured out [how to boot to Vi bare metal][9], no operating system required!

![image][1]

This is a response on a great article from [Pascal Bourguignon][2], namely how
to run [Emacsas PID 1][3].

As we all know, nobody uses emacs.

The above statement is ment to start a flamewar. Please do so, see the contact
page to contact me.

No, all joking aside, I found it to be a good article and wanted to see how I
could do that with Vim. Not in User Mode Linux, but by creating an actual ISO.
Boot to Vim, as you might want to call it.

This is actually fairly simple. Compile vim statically, set it as `init=` at
boot and you're done.

We are going to use small (9MB) distro named [Tiny Core, Core edition][4] and
customize that to boot right into our static build of Vim.

<p class="ad"> <b>Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below:</b><br><br> <a href="https://leafnode.nl">I'm developing an open source monitoring app called  Leaf Node Monitoring, for windows, linux & android. Go check it out!</a><br><br> <a href="https://github.com/sponsors/RaymiiOrg/">Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.</a><br><br> <a href="https://www.digitalocean.com/?refcode=7435ae6b8212">You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $100 credit for 60 days. </a><br><br> </p>


### Building Vim

Please read and follow my [tutorial on building a statically linked Vim][6].
This will give you an executable we will use later on in the tutorial.

### Preparation

You will need a few tools to build the ISO, namely `cpio`, `tar`, `gzip`,
`advdef` and `mkisofs`. These can probably be installed with your package
manager. Please do that first.

First create a folder for building:



   mkdir vim-as-pid-1
   cd vim-as-pid-1


Also create a few folders for the ISO build:



   mkdir /tmp/isomount
   mkdir extract


Download the latest Tiny Core, Core edition (without GUI):



   wget http://distro.ibiblio.org/tinycorelinux/5.x/x86/release/Core-current.iso


Copy the files from the ISO:



   mount Core-current.iso /tmp/isomount/ -o loop,ro

   cp -a /tmp/isomount/boot /tmp/


This creates a `/tmp/boot` folder with the `core.gz` and boot loader. Don't
forget to umount it:



   umount /tmp/isomount


We will use the `/tmp/boot` folder later on when putting back together the ISO.

### Changing the ISO

Go into the folder where we will extract the `core.gz` root filesystem:



   cd extract


Use `zcat` and `cpio` to extract the `core.gz` rootfs:



   zcat /tmp/boot/core.gz | cpio -i -H newc -d


We now have an extracted root filesystem:



   # ls
   bin  dev  etc  home  init  lib  linuxrc  mnt  opt  proc  root  run  sbin  sys  tmp  usr  var


Place the [earlier built static Vim][6] in the `bin/` folder:



   cp ~/vim bin/


You can do more customizations, for example, editing the boot loader message.
That is in a file named `boot.msg` in `/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.


### Changing the inittab

To boot in to Vim right away we need to change the init configuration. Edit the
following file:



   vim etc/inittab


Change the following lines:



   ::sysinit:/etc/init.d/rcS
   tty1::respawn:/sbin/getty 38400 tty1


To:



   ::sysinit:/bin/vim
   tty1::respawn:/bin/vim


Do note that this does not actually make Vim PID 1. Init will still manage Vim,
and do stuff like `fsck` and mount the root partition read/write. If you want to
go barebones, add `init=/bin/vim` to the bootloader (`isolinux.cfg`). Then, from
Vim, do `:!fsck /dev/sda` and `mount -o remount,rw /`.

### Building a new ISO

Make sure you are still in the `extract` folder. Issue the following command to
build a new `tinycore.gz` file which the ISO will use as it's `initramfs`:



   find | cpio -o -H newc | gzip -2 > ../tinycore.gz


Copy that over the original `core.gz` file in `/tmp/boot` which we copied
ealier:



   cp ../tinycore.gz /tmp/boot/core.gz


Create a new folder for the new ISO build files:



   mkdir /tmp/newiso


Copy the `/tmp/boot` folder to it:



   cp -a /tmp/boot /tmp/newiso/


Build a new ISO using `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


You now have a file in `/tmp` named `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


You can use this to boot a VM, or burn an ISO. If you exit `vim`, it will
restart.

You can start up a real shell by giving the `:!sh` command, in command mode. To
shut down, issue the `:!halt` command.

More info on remastering Tiny Core can be found [here][7].

![image][8]

  [1]: https://raymii.org/s/inc/img/boot-to-vim-1.png
  [2]: http://www.informatimago.com/index.html
  [3]: http://www.informatimago.com/linux/emacs-on-user-mode-linux.html?raymii.org
  [4]: http://distro.ibiblio.org/tinycorelinux/
  [5]: https://www.digitalocean.com/?refcode=7435ae6b8212
  [6]: https://raymii.org/s/blog/Statically_cross_compiled_vim_for_x86_x86-64_and_mips.html
  [7]: http://wiki.tinycorelinux.net/wiki:remastering
  [8]: https://raymii.org/s/inc/img/boot-to-vim-2.png
  [9]: /s/blog/Bare_Metal_Boot_to_Vi.html

---

License:
All the text on this website is free as in freedom unless stated otherwise.
This means you can use it in any way you want, you can copy it, change it
the way you like and republish it, as long as you release the (modified)
content under the same license to give others the same freedoms you've got
and place my name and a link to this site with the article as source.

This site uses Google Analytics for statistics and Google Adwords for
advertisements. You are tracked and Google knows everything about you.
Use an adblocker like ublock-origin if you don't want it.

All the code on this website is licensed under the GNU GPL v3 license
unless already licensed under a license which does not allows this form
of licensing or if another license is stated on that page / in that software:

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.

Just to be clear, the information on this website is for meant for educational
purposes and you use it at your own risk. I do not take responsibility if you
screw something up. Use common sense, do not 'rm -rf /' as root for example.
If you have any questions then do not hesitate to contact me.

See https://raymii.org/s/static/About.html for details.