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.