xref: /aosp_15_r20/external/crosvm/docs/book/src/devices/block.md (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
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