• Stars
    star
    140
  • Rank 261,473 (Top 6 %)
  • Language
    Dockerfile
  • License
    MIT License
  • Created almost 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A small Linux x86 VM meant for use in the browser

Browser VM

A custom Buildroot config for a Linux x86 VM, meant to be run in the browser as part of browser-shell. The resulting Linux ISO is meant to be run under emulation in the browser via v86, and includes:

  • a custom Linux 4.15 kernel, which strips out many unnecessary drivers, modules, etc. and adds Plan 9 filesystem sharing
  • a root filesystem and Unix commands via BusyBox
  • an ISO-based bootloader (i.e., we create a "DVD" that is booted by v86)

Following the Buildroot customization docs we create a folder buildroot-v86/ with all the necessary config files, filesystem overlay, and scripts necessary to build our distribution.

Running via Docker

To build the Docker image use the build.sh script, or:

$ docker build -t buildroot .

And then to run the build:

$ docker run \
    --rm \
    --name build-v86 \
    -v $PWD/dist:/build \
    -v $PWD/buildroot-v86/:/buildroot-v86 \
    buildroot

NOTE: we define two volumes to allow the container to access the v86 config, and also to write the ISO once complete. In the above I've used $PWD, but you can use any absolute path.

When the build completes, an ISO file will be places in ./dist/v86-linux.iso in your source tree (i.e., outside the container).

If you need to re-configure things, instead of just running the build, do the following:

$ docker run \
    --rm \
    --name build-v86 \
    -v $PWD/dist:/build \
    -v $PWD/buildroot-v86/:/buildroot-v86 \
    -ti \
    --entrypoint "bash" \
    buildroot

Now in the resulting bash terminal, you can run make menuconfig and other make commands.

buildroot-v86/ Layout

We define a v86 buildroot "board" via the following files and directories:

+-- board/
    +-- v86
        +-- linux.config        # our custom Linux kernel config (make linux-menuconfig)
        +-- post_build.sh       # script to copy ISO file out of docker container
        +-- rootfs_overlay/     # overrides for files in the root filesystem
            +-- etc/
                +-- inittab     # we setup a ttyS0 console terminal to auto-login
                +-- fstab       # we auto-mount the Plan 9 Filer filesystem to /mnt
    +-- configs/
        +-- v86_defconfig       # our custom buildroot config (make menuconfig)
    +-- Config.in               # empty, but required https://buildroot.org/downloads/manual/manual.html#outside-br-custom
    +-- external.mk             # empty, but required https://buildroot.org/downloads/manual/manual.html#outside-br-custom
    +-- external.desc           # our v86 board config for make
    +-- build-v86.sh            # entrypoint for Docker to run our build

If you need or want to update these config files, do the following:

$ make BR2_EXTERNAL=/buildroot-v86 v86_defconfig
$ make menuconfig
...
$ make savedefconfig
$ make linux-menuconfig
...
$ make linux-savedefconfig

Configuration Notes

These are the options I set when configuring buildroot for v86. I'm only specifying the things I set.

$ cd buildroot-2018.02
$ make menuconfig

Then follow these config steps in the buildroot config menu (NOTE: these docs may have drifted from the actual config in the source, so consult that first):

Target options

  • Target Architecture: i386
  • Target Architecture Variant: pentium mobile (Pentium with MMX, SSE)

Build options

  • Enable compiler cache (not strictly necessary, but helps with rebuilds)

Toolchain

  • C library: uLibc-ng (I'd like to experiment with musl too)

System configuration

  • remount root filesystem read-write during boot (I think this is unnecessary)
  • Root filesystem overlay directories: /build/overlay-fs (for etc/inittab)

Kernel

  • Linux Kernel: true
  • Defconfig name: i386
  • Kernel binary format: bzImage (vmlinux seemed to break on boot)

Target packages

Need to figure this out. I tried adding imagemagik, git, uemacs, but they are all adding too much size to the image.

Filesystem images

  • cpio the root filesystem (for use as an initial RAM filesystem)
  • initial RAM filesystem linked into the linux kernel (not sure I need this, trying without...)
  • iso image
    • Use initrd
  • tar the root filesystem Compression method (no compression)

Bootloaders

  • syslinux
    • install isolinux

Linux configuration

Now configure the Linux Kernel:

$ make linux-menuconfig

And set the following options to accomplish this:

CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_9P_FS=y
CONFIG_9P_FS_POSIX_ACL=y
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y

Processor type and features

  • Processor family (Pentium-Pro) also tried Pentium M before.

Bus options (PCI, etc.)

  • PCI Debugging: true (I want to see what's happening with PCI errors, normally not needed)

Networking support

  • Plan 9 Resource Sharing Support (9P2000) (built into kernel * vs. M)
    • 9P Virtio Transport (* - make this is on, it won't exist if virtio is off)
    • Debug information (* - optional)

Device Drivers

  • Virtio drivers
    • PCI driver for virtio devices (built into kernel * vs. M)
      • Support for legacy virtio draft 0.9.X and older devices (New)
    • Platform bus driver for memory mapped virtio devices (* vs. M) - not sure I need this...
      • Memory mapped virtio devices parameter parsing - or this...

Filesystems

  • Caches

    • General filesystem local caching manager (*)
      • Filesystem caching on files (*)
  • Network File Systems

    • Plan 9 Resource Sharing Support (9P2000) (*)
      • Enable 9P client caching support
      • 9P Posic Access Control Lists

Now run make

When it finishes, the built image is in ./output/images.

More Repositories

1

have-fun-with-machine-learning

An absolute beginner's guide to Machine Learning and Image Classification with Neural Networks
Python
5,064
star
2

nohost

A web server in your web browser
JavaScript
260
star
3

browser-shell

A Linux command-line shell in the browser
HTML
259
star
4

VncSharp

VncSharp is a GPL implementation of the VNC Remote Framebuffer (RFB) Protocol for the .NET Framework
C#
222
star
5

sfxr.js

JavaScript port of SFXR, video game sound effect generator
JavaScript
29
star
6

hacktoberfest-at-seneca-2018

Tracking and Support for Hacktoberfest 2018 at Seneca College
16
star
7

browser-mime

MIME types for use in browsers
JavaScript
16
star
8

next

What I'm doing next (name TBD)
JavaScript
14
star
9

learn-travis

An example to show how to get TravisCI integrated into a node.js project
JavaScript
10
star
10

snowy-owls-ca

Tracking Snowy Owls Across Canada
JavaScript
7
star
11

node-webvtt

A command line interface and npm package for the WebVTT JavaScript parser.
JavaScript
6
star
12

SpecialPowers

Mozilla SpecialPowers testing extension
JavaScript
5
star
13

node-eden

Name generator
JavaScript
5
star
14

Seneca2017LearningLab

A repo for DPS909/OSD600 students to learn open source tooling
JavaScript
4
star
15

purl

Pretty print the contents of a resource at a URL
JavaScript
4
star
16

bridge-troll

Collect all the trolls living under Ontario's bridges
JavaScript
3
star
17

unicode

Unicode Dance Party
HTML
3
star
18

openai-form-example

Working with OpenAI and HTML Forms
HTML
3
star
19

Video-Stats

HTML5 Video painting performance statistics for Firefox 5 video
JavaScript
3
star
20

git-idfs-db

A git db implementation that wraps an IDBFS interface instance. Creates real git repos in the fs.
JavaScript
2
star
21

brackets-5ialog

HTML5 File Dialogs for Brackets
JavaScript
2
star
22

amore.webmaker.org

Webmaker localization app
JavaScript
2
star
23

node-bugzilla

A node module to make filing bugs in node apps easy
JavaScript
2
star
24

web422-week12

WebSockets Emoji Chat App Server and React Client
JavaScript
1
star
25

recreate-newyorker-css

Recreating a New Yorker web page's text styles in HTML and CSS
HTML
1
star
26

recreate-youtube-css

Recreating the YouTube search results page's CSS styles in HTML and CSS
HTML
1
star
27

aparecium

A charm to reveal secret messages
JavaScript
1
star
28

bitjs

Automatically exported from code.google.com/p/bitjs
JavaScript
1
star
29

pretty-effective

An Analysis of the Prettier Project
1
star
30

pdfjs-express-example

Minimal example of serving a PDF file from express to the browser and rendering with PDF.js
JavaScript
1
star
31

aws-learner-lab-utils

Various scripts, utils, and tools for using the AWS Learner Lab
JavaScript
1
star