firecracker
77 строк · 2.0 Кб
1#!/usr/bin/env python3
2# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3# SPDX-License-Identifier: Apache-2.0
4
5# pylint:disable=invalid-name
6
7"""
8Run Firecracker in an IPython REPL
9"""
10
11import argparse
12import re
13from pathlib import Path
14
15from framework.artifacts import disks, kernels
16from framework.microvm import MicroVMFactory
17from host_tools.cargo_build import get_firecracker_binaries
18
19kernels = list(kernels("vmlinux-*"))
20rootfs = list(disks("ubuntu*ext4"))
21
22
23def parse_byte_size(param):
24"""
25>>> parse_byte_size("1MB")
261048576
27"""
28unit = {
29"MB": 2**20,
30"GB": 2**30,
31}
32match = re.match(r"(?P<val>\d+)(?P<unit>[MG]B)", param.upper())
33return int(match.group("val")) * unit[match.group("unit")]
34
35
36parser = argparse.ArgumentParser()
37parser.add_argument(
38"--kernel",
39choices=kernels,
40default=kernels[-1],
41help=f"Kernel to use. [{kernels[-1]}]",
42)
43parser.add_argument(
44"--rootfs",
45choices=rootfs,
46default=rootfs[-1],
47help=f"Rootfs to use. [{rootfs[-1]}]",
48)
49parser.add_argument("--vcpus", type=int, default=2)
50parser.add_argument(
51"--guest-mem-size",
52type=parse_byte_size,
53default=128 * 2**20, # 128MB
54)
55parser.add_argument("--rootfs-size", type=parse_byte_size, default=1 * 2**30) # 1GB
56parser.add_argument("--binary-dir", help="Path to the firecracker binaries")
57args = parser.parse_args()
58print(args)
59
60bins = None
61if args.binary_dir:
62binary_dir = Path(args.binary_dir).resolve()
63bins = binary_dir / "firecracker", binary_dir / "jailer"
64else:
65bins = get_firecracker_binaries()
66
67print("This step may take a while to compile Firecracker ...")
68vmfcty = MicroVMFactory(*bins)
69uvm = vmfcty.build(args.kernel, args.rootfs)
70uvm.help.enable_console()
71uvm.help.resize_disk(uvm.rootfs_file, args.rootfs_size)
72uvm.spawn()
73uvm.help.print_log()
74uvm.add_net_iface()
75uvm.basic_config(vcpu_count=args.vcpus, mem_size_mib=args.guest_mem_size // 2**20)
76uvm.start()
77uvm.get_all_metrics()
78