cloud-hypervisor: Add --disk option to provide VM rootfs

Based on the new virtio-blk support, this commit allows any user to
specify a --disk option in order to select the rootfs it wants to
use for the VM.

For now it assumes the partition 3 /dev/vd3 is the one where we can
find the rootfs.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
Sebastien Boeuf 2019-05-06 12:15:44 -07:00 committed by Samuel Ortiz
parent b67e0b3dad
commit 1270d09301
2 changed files with 30 additions and 6 deletions

View File

@ -25,6 +25,12 @@ fn main() {
.help("Path to kernel image (vmlinux)")
.takes_value(true),
)
.arg(
Arg::with_name("disk")
.long("disk")
.help("Path to VM disk image")
.takes_value(true),
)
.arg(
Arg::with_name("cpus")
.long("cpus")
@ -43,9 +49,14 @@ fn main() {
.value_of("kernel")
.map(PathBuf::from)
.expect("Missing argument: kernel");
let kernel_path = kernel_arg.as_path();
let disk_arg = cmd_arguments
.value_of("disk")
.map(PathBuf::from)
.expect("Missing argument: disk");
let disk_path = disk_arg.as_path();
let mut vcpus = DEFAULT_VCPUS;
if let Some(cpus) = cmd_arguments.value_of("cpus") {
vcpus = cpus.parse::<u8>().unwrap();
@ -59,7 +70,7 @@ fn main() {
println!("VM [{} vCPUS {} MB of memory]", vcpus, memory);
println!("Booting {:?}...", kernel_path);
let vm_config = VmConfig::new(kernel_path, vcpus, memory).unwrap();
let vm_config = VmConfig::new(kernel_path, disk_path, vcpus, memory).unwrap();
vmm::boot_kernel(vm_config).unwrap();
}

View File

@ -206,6 +206,7 @@ impl Vcpu {
pub struct VmConfig<'a> {
kernel_path: &'a Path,
disk_path: &'a Path,
cmdline: Option<cmdline::Cmdline>,
cmdline_addr: GuestAddress,
@ -214,9 +215,15 @@ pub struct VmConfig<'a> {
}
impl<'a> VmConfig<'a> {
pub fn new(kernel_path: &'a Path, vcpus: u8, memory_size: GuestUsize) -> Result<Self> {
pub fn new(
kernel_path: &'a Path,
disk_path: &'a Path,
vcpus: u8,
memory_size: GuestUsize,
) -> Result<Self> {
Ok(VmConfig {
kernel_path,
disk_path,
memory_size,
vcpu_count: vcpus,
..Default::default()
@ -232,6 +239,7 @@ impl<'a> Default for VmConfig<'a> {
VmConfig {
kernel_path: Path::new(""),
disk_path: Path::new(""),
cmdline: Some(cmdline),
cmdline_addr: CMDLINE_OFFSET,
memory_size: DEFAULT_MEMORY,
@ -257,7 +265,12 @@ struct DeviceManager {
}
impl DeviceManager {
fn new(memory: GuestMemoryMmap, allocator: &mut SystemAllocator, vm_fd: &VmFd) -> Result<Self> {
fn new(
memory: GuestMemoryMmap,
allocator: &mut SystemAllocator,
vm_fd: &VmFd,
vm_cfg: &VmConfig,
) -> Result<Self> {
let io_bus = devices::Bus::new();
let mut mmio_bus = devices::Bus::new();
let serial_evt = EventFd::new(EFD_NONBLOCK).map_err(Error::EventFd)?;
@ -277,7 +290,7 @@ impl DeviceManager {
let raw_img: File = OpenOptions::new()
.read(true)
.write(true)
.open("/foo/bar/rootfs.img")
.open(&vm_cfg.disk_path)
.map_err(Error::Disk)?;
let virtio_block_device =
@ -478,7 +491,7 @@ impl<'a> Vm<'a> {
)
.ok_or(Error::CreateSystemAllocator)?;
let device_manager = DeviceManager::new(guest_memory.clone(), &mut allocator, &fd)
let device_manager = DeviceManager::new(guest_memory.clone(), &mut allocator, &fd, &config)
.map_err(|_| Error::DeviceManager)?;
fd.register_irqfd(device_manager.serial_evt.as_raw_fd(), 4)
.map_err(Error::Irq)?;