diff --git a/docs/external-disk.md b/docs/external-disk.md new file mode 100644 index 000000000..9c4e31e24 --- /dev/null +++ b/docs/external-disk.md @@ -0,0 +1,91 @@ +# External Disk +`linuxkit run` has the ability to mount an external disk when booting. It involves two steps: + +1. Make the disk available as a device +2. Mount the disk + +## Make Disk Available +In order to make the disk available, you need to tell `linuxkit` where the disk file or block device is. This depends on your run method. + +**Note:** With all of the options below, *always* give disk options before the _prefix_. + +### Mac HyperKit +`linuxkit run hyperkit -disk -disk-size ` + +* `-disk-size `: size of disk in MB, e.g. `-disk-size 4096` will provide a 4GB disk. +* `-disk `: use the disk at location _path_, e.g. `-disk foo.img` will use the disk at `$PWD/foo.img` + +Several important points to note: + +1. if you do not provide `-disk `_path_, `linuxkit` assumes the default to be `$PWD/`_prefix_`-disk.img`. +2. If the disk at ``, or the default if `-disk` option is not provided, does not exist, `linuxkit` will create one of size ``. + +### QEMU +`linuxkit run qemu -disk -disk-size ` + +* `-disk-size `: size of disk in MB, e.g. `-disk-size 4096` will provide a 4GB disk. +* `-disk `: use the disk at location _path_, e.g. `-disk foo.img` will use the disk at `$PWD/foo.img` + +Several important points to note: + +1. if you do not provide `-disk `_path_, `linuxkit` assumes the default to be `$PWD/`_prefix_`-disk.img`. +2. If the disk at ``, or the default if `-disk` option is not provided, does not exist, `linuxkit` will create one of size ``. + +### vmware +`linuxkit run vmware -disk ` + +* `-disk `: use the disk at location _path_, e.g. `-disk foo.img` will use the disk at `$PWD/foo.img` + +Unlike with qemu and hyperkit, `linuxkit run vmware` _currently_ will not create the disk for you if it does not exist. We intend to align the functionality in the near future. + +## Mount the Disk +A disk created or used via `hyperkit run` will be available inside the image at `/dev/vda` with the first partition at `/dev/vda1`. + +In order to use the disk, you need to do several steps to make it available: + +1. Create a partition table if it does not have one. +2. Create a filesystem if it does not have one. +3. `fsck` the filesystem. +4. Mount it. + +To simplify the process, two `onboot` images are available for you to use: + +1. `format`, which: + * checks for a partition table and creates one if necessary + * checks for a filesystem on the partition and creates one if necessary + * runs `fsck` on the filesystem +2. `mount` which mounts the filesystem to a provided path + +```yml +onboot: + - name: format + image: "linuxkit/format:a16f2bd94a83dd0cea4d490f710567a0cc60be33" + binds: + - /dev:/dev + capabilities: + - CAP_SYS_ADMIN + - CAP_MKNOD + - name: mount + image: "linuxkit/mount:ad138d252798d9d0d6779f7f4d35b7fbcbbeefb9" + binds: + - /dev:/dev + - /var:/var:rshared,rbind + capabilities: + - CAP_SYS_ADMIN + rootfsPropagation: shared + command: ["/mount.sh", "/var/external"] +``` + +Notice several key points: + +1. format container + * The format container needs to have bind mounts for `/dev` + * The format container needs `CAP_SYS_ADMIN` and `CAP_MKNOD` capabilities + * The format container only needs to run **once**, not matter how many external disks or partitions are provided. It finds all block devices under `/dev` and processes them. +2. mount container + * The mount container `command` is `mount.sh` followed by the desired mount point. Remember that nearly everything in a linuxkit image is read-only except under `/var`, so mount it there. + * The mount container needs to have bind mounts for `/dev` and `/var` + * The mount container needs `CAP_SYS_ADMIN` capabilities + * The mount container needs `rootfsPropagation: shared` + +With the above in place, if run with the current disk options, the image will make the external disk available as `/dev/vda1` and mount it at `/var/external`.