1*bb4ee6a4SAndroid Build Coastguard Worker# Block 2*bb4ee6a4SAndroid Build Coastguard Worker 3*bb4ee6a4SAndroid Build Coastguard Workercrosvm supports 4*bb4ee6a4SAndroid Build Coastguard Worker[virtio-block](https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html#x1-2390002) 5*bb4ee6a4SAndroid Build Coastguard Workerdevice that works as a disk for the guest. 6*bb4ee6a4SAndroid Build Coastguard Worker 7*bb4ee6a4SAndroid Build Coastguard WorkerFirst, create a ext4 (or whatever file system you want) disk file. 8*bb4ee6a4SAndroid Build Coastguard Worker 9*bb4ee6a4SAndroid Build Coastguard Worker```sh 10*bb4ee6a4SAndroid Build Coastguard Workerfallocate -l 1G disk.img 11*bb4ee6a4SAndroid Build Coastguard Workermkfs.ext4 disk.img 12*bb4ee6a4SAndroid Build Coastguard Worker``` 13*bb4ee6a4SAndroid Build Coastguard Worker 14*bb4ee6a4SAndroid Build Coastguard WorkerThen, pass it with `--block` flag so the disk will be exposed as `/dev/vda`, `/dev/vdb`, etc. The 15*bb4ee6a4SAndroid Build Coastguard Workerdevice can be mounted with the `mount` command. 16*bb4ee6a4SAndroid Build Coastguard Worker 17*bb4ee6a4SAndroid Build Coastguard Worker```sh 18*bb4ee6a4SAndroid Build Coastguard Workercrosvm run \ 19*bb4ee6a4SAndroid Build Coastguard Worker --block disk.img 20*bb4ee6a4SAndroid Build Coastguard Worker ... # usual crosvm args 21*bb4ee6a4SAndroid Build Coastguard Worker``` 22*bb4ee6a4SAndroid Build Coastguard Worker 23*bb4ee6a4SAndroid Build Coastguard WorkerTo expose the block device as a read-only disk, you can add the `ro` flag after the disk image path: 24*bb4ee6a4SAndroid Build Coastguard Worker 25*bb4ee6a4SAndroid Build Coastguard Worker```sh 26*bb4ee6a4SAndroid Build Coastguard Workercrosvm run \ 27*bb4ee6a4SAndroid Build Coastguard Worker --block disk.img,ro 28*bb4ee6a4SAndroid Build Coastguard Worker ... # usual crosvm args 29*bb4ee6a4SAndroid Build Coastguard Worker``` 30*bb4ee6a4SAndroid Build Coastguard Worker 31*bb4ee6a4SAndroid Build Coastguard Worker## Rootfs 32*bb4ee6a4SAndroid Build Coastguard Worker 33*bb4ee6a4SAndroid Build Coastguard WorkerIf you use a block device as guest's rootfs, you can add the `root` flag to the `--block` parameter: 34*bb4ee6a4SAndroid Build Coastguard Worker 35*bb4ee6a4SAndroid Build Coastguard Worker```sh 36*bb4ee6a4SAndroid Build Coastguard Workercrosvm run \ 37*bb4ee6a4SAndroid Build Coastguard Worker --block disk.img,root 38*bb4ee6a4SAndroid Build Coastguard Worker ... # usual crosvm args 39*bb4ee6a4SAndroid Build Coastguard Worker``` 40*bb4ee6a4SAndroid Build Coastguard Worker 41*bb4ee6a4SAndroid Build Coastguard WorkerThis flag automatically adds a `root=/dev/vdX` kernel parameter with the corresponding virtio-block 42*bb4ee6a4SAndroid Build Coastguard Workerdevice name and read-only (`ro`) or read-write (`rw`) option depending on whether the `ro` flag has 43*bb4ee6a4SAndroid Build Coastguard Workeralso been specified or not. 44*bb4ee6a4SAndroid Build Coastguard Worker 45*bb4ee6a4SAndroid Build Coastguard Worker## Options 46*bb4ee6a4SAndroid Build Coastguard Worker 47*bb4ee6a4SAndroid Build Coastguard WorkerThe `--block` parameter support additional options to enable features and control disk parameters. 48*bb4ee6a4SAndroid Build Coastguard WorkerThese may be specified as extra comma-separated `key=value` options appended to the required 49*bb4ee6a4SAndroid Build Coastguard Workerfilename option. For example: 50*bb4ee6a4SAndroid Build Coastguard Worker 51*bb4ee6a4SAndroid Build Coastguard Worker```sh 52*bb4ee6a4SAndroid Build Coastguard Workercrosvm run 53*bb4ee6a4SAndroid Build Coastguard Worker --block disk.img,ro,sparse=false,o_direct=true,block_size=4096,id=MYSERIALNO 54*bb4ee6a4SAndroid Build Coastguard Worker ... # usual crosvm args 55*bb4ee6a4SAndroid Build Coastguard Worker``` 56*bb4ee6a4SAndroid Build Coastguard Worker 57*bb4ee6a4SAndroid Build Coastguard WorkerThe available options are documented in the following sections. 58*bb4ee6a4SAndroid Build Coastguard Worker 59*bb4ee6a4SAndroid Build Coastguard Worker### Sparse 60*bb4ee6a4SAndroid Build Coastguard Worker 61*bb4ee6a4SAndroid Build Coastguard Worker- Syntax: `sparse=(true|false)` 62*bb4ee6a4SAndroid Build Coastguard Worker- Default: `sparse=true` 63*bb4ee6a4SAndroid Build Coastguard Worker 64*bb4ee6a4SAndroid Build Coastguard WorkerThe `sparse` option controls whether the disk exposes the thin provisioning `discard` command. If 65*bb4ee6a4SAndroid Build Coastguard Worker`sparse` is set to `true`, the `VIRTIO_BLK_T_DISCARD` request will be available, and it will be 66*bb4ee6a4SAndroid Build Coastguard Workertranslated to the appropriate system call on the host disk image file (for example, 67*bb4ee6a4SAndroid Build Coastguard Worker`fallocate(FALLOC_FL_PUNCH_HOLE)` for raw disk images on Linux). If `sparse` is set to `false`, the 68*bb4ee6a4SAndroid Build Coastguard Workerdisk will be fully allocated at startup (using [`fallocate()`] or equivalent on other platforms), 69*bb4ee6a4SAndroid Build Coastguard Workerand the `VIRTIO_BLK_T_DISCARD` request will not be supported for this device. 70*bb4ee6a4SAndroid Build Coastguard Worker 71*bb4ee6a4SAndroid Build Coastguard Worker### `O_DIRECT` 72*bb4ee6a4SAndroid Build Coastguard Worker 73*bb4ee6a4SAndroid Build Coastguard Worker- Syntax: `o_direct=(true|false)` 74*bb4ee6a4SAndroid Build Coastguard Worker- Default: `o_direct=false` 75*bb4ee6a4SAndroid Build Coastguard Worker 76*bb4ee6a4SAndroid Build Coastguard WorkerThe `o_direct` option enables the Linux `O_DIRECT` flag on the underlying disk image, indicating 77*bb4ee6a4SAndroid Build Coastguard Workerthat I/O should be sent directly to the backing storage device rather than using the host page 78*bb4ee6a4SAndroid Build Coastguard Workercache. This should only be used with raw disk images, not qcow2 or other formats. The `block_size` 79*bb4ee6a4SAndroid Build Coastguard Workeroption may need to be adjusted to ensure that I/O is sufficiently aligned for the host block device 80*bb4ee6a4SAndroid Build Coastguard Workerand filesystem requirements. 81*bb4ee6a4SAndroid Build Coastguard Worker 82*bb4ee6a4SAndroid Build Coastguard Worker### Block size 83*bb4ee6a4SAndroid Build Coastguard Worker 84*bb4ee6a4SAndroid Build Coastguard Worker- Syntax: `block_size=BYTES` 85*bb4ee6a4SAndroid Build Coastguard Worker- Default: `block_size=512` 86*bb4ee6a4SAndroid Build Coastguard Worker 87*bb4ee6a4SAndroid Build Coastguard WorkerThe `block_size` option overrides the reported block size (also known as sector size) of the 88*bb4ee6a4SAndroid Build Coastguard Workervirtio-block device. This should be a power of two larger than or equal to 512. 89*bb4ee6a4SAndroid Build Coastguard Worker 90*bb4ee6a4SAndroid Build Coastguard Worker### ID 91*bb4ee6a4SAndroid Build Coastguard Worker 92*bb4ee6a4SAndroid Build Coastguard Worker- Syntax: `id=DISK_ID` 93*bb4ee6a4SAndroid Build Coastguard Worker- Default: No identifier 94*bb4ee6a4SAndroid Build Coastguard Worker 95*bb4ee6a4SAndroid Build Coastguard WorkerThe `id` option provides the virtio-block device with a unique identifier. The `DISK_ID` string must 96*bb4ee6a4SAndroid Build Coastguard Workerbe 20 or fewer ASCII printable characters. The `id` may be used by the guest environment to uniquely 97*bb4ee6a4SAndroid Build Coastguard Workeridentify a specific block device rather than making assumptions about block device names. 98*bb4ee6a4SAndroid Build Coastguard Worker 99*bb4ee6a4SAndroid Build Coastguard WorkerThe Linux virtio-block driver exposes the disk identifer in a `sysfs` file named `serial`; an 100*bb4ee6a4SAndroid Build Coastguard Workerexample path looks like `/sys/devices/pci0000:00/0000:00:02.0/virtio1/block/vda/serial` (the PCI 101*bb4ee6a4SAndroid Build Coastguard Workeraddress may differ depending on which other devices are enabled). 102*bb4ee6a4SAndroid Build Coastguard Worker 103*bb4ee6a4SAndroid Build Coastguard Worker## Resizing 104*bb4ee6a4SAndroid Build Coastguard Worker 105*bb4ee6a4SAndroid Build Coastguard WorkerThe crosvm block device supports run-time resizing. This can be accomplished by starting crosvm with 106*bb4ee6a4SAndroid Build Coastguard Workerthe `-s` control socket, then using the `crosvm disk` command to send a resize request: 107*bb4ee6a4SAndroid Build Coastguard Worker 108*bb4ee6a4SAndroid Build Coastguard Worker`crosvm disk resize DISK_INDEX NEW_SIZE VM_SOCKET` 109*bb4ee6a4SAndroid Build Coastguard Worker 110*bb4ee6a4SAndroid Build Coastguard Worker- `DISK_INDEX`: 0-based index of the block device (counting all `--block` in order). 111*bb4ee6a4SAndroid Build Coastguard Worker- `NEW_SIZE`: desired size of the disk image in bytes. 112*bb4ee6a4SAndroid Build Coastguard Worker- `VM_SOCKET`: path to the VM control socket specified when running crosvm (`-s`/`--socket` option). 113*bb4ee6a4SAndroid Build Coastguard Worker 114*bb4ee6a4SAndroid Build Coastguard WorkerFor example: 115*bb4ee6a4SAndroid Build Coastguard Worker 116*bb4ee6a4SAndroid Build Coastguard Worker```sh 117*bb4ee6a4SAndroid Build Coastguard Worker# Create a 1 GiB disk image 118*bb4ee6a4SAndroid Build Coastguard Workertruncate -s 1G disk.img 119*bb4ee6a4SAndroid Build Coastguard Worker 120*bb4ee6a4SAndroid Build Coastguard Worker# Run crosvm with a control socket 121*bb4ee6a4SAndroid Build Coastguard Workercrosvm run \ 122*bb4ee6a4SAndroid Build Coastguard Worker --block disk.img,sparse=false \ 123*bb4ee6a4SAndroid Build Coastguard Worker -s /tmp/crosvm.sock \ 124*bb4ee6a4SAndroid Build Coastguard Worker ... # other crosvm args 125*bb4ee6a4SAndroid Build Coastguard Worker 126*bb4ee6a4SAndroid Build Coastguard Worker# In another shell, extend the disk image to 2 GiB. 127*bb4ee6a4SAndroid Build Coastguard Workercrosvm disk resize \ 128*bb4ee6a4SAndroid Build Coastguard Worker 0 \ 129*bb4ee6a4SAndroid Build Coastguard Worker $((2 * 1024 * 1024 * 1024)) \ 130*bb4ee6a4SAndroid Build Coastguard Worker /tmp/crosvm.sock 131*bb4ee6a4SAndroid Build Coastguard Worker 132*bb4ee6a4SAndroid Build Coastguard Worker# The guest OS should recognize the updated size and log a message: 133*bb4ee6a4SAndroid Build Coastguard Worker# virtio_blk virtio1: [vda] new size: 4194304 512-byte logical blocks (2.15 GB/2.00 GiB) 134*bb4ee6a4SAndroid Build Coastguard Worker``` 135*bb4ee6a4SAndroid Build Coastguard Worker 136*bb4ee6a4SAndroid Build Coastguard WorkerThe `crosvm disk resize` command only resizes the block device and its backing disk image. It is the 137*bb4ee6a4SAndroid Build Coastguard Workerresponsibility of the VM socket user to perform any partition table or filesystem resize operations, 138*bb4ee6a4SAndroid Build Coastguard Workerif required. 139*bb4ee6a4SAndroid Build Coastguard Worker 140*bb4ee6a4SAndroid Build Coastguard Worker[`fallocate()`]: https://man7.org/linux/man-pages/man2/fallocate.2.html#DESCRIPTION 141