AWSのfirecrackerが1.0になったようなので試してみました。
firecrackerはAWSが開発したKVMベースのVMMです。マイクロVMを超高速で起動できる仕組みです。LambdaやFargateの下回りとして使われているとのことです。
Rustによる実装です。
firecracker
まずはfirecracker単体で使ってみました。
下記のgetstartedの説明通りに進めていけば実行できました。x86_64環境であれば、ビルド済みのバイナリが利用できます。ビルド不要。
firecrackerはVMMです。ゲストOSを起動する前に、firecrackerプロセスを起動しておきます。firecrackerプロセスは、socketでAPI呼び出しを待ち受ける状態になります。その後、APIを使って、kernelやrootfsの場所や、仮想CPU数やメモリサイズの指定し、最後にマイクロVMを起動します。
公式のサイトの図がイメージをつかみやすいです。
firecrackerプロセスは一つで、そこから複数のマイクロVMが起動するのかなというイメージを持っていましたが、実際はfirecrackerプロセスとマイクロVMはセット(1対1)のようです。
物理PCの準備
firecrackerを動かすためにはKVMが動くlinux環境が必要です。物理的なPCか、AWSならi3.metalのようなベアメタルなインスタンスを用意することになります。
ベアメタルなインスタンスは高いので、今回は家にあったノートPCにUbuntu 18.04 LTSをインストールして、ホストマシンにしました。Sandy Bridge世代のものですが、問題なく動作しました。
firecrackerのインストール
インストール方法は公式サイトに書いてある通り、x86_64用のバイナリを入手するだけです。
release_url="https://github.com/firecracker-microvm/firecracker/releases"
latest=$(basename $(curl -fsSLI -o /dev/null -w %{url_effective} ${release_url}/latest))
arch=`uname -m`
curl -L ${release_url}/download/${latest}/firecracker-${latest}-${arch}.tgz \
| tar -xz
firecrackerはバイナリです。muslライブラリと静的リンクしてビルドされているので、libc含め一切依存するライブラリがないバイナリファイルとして提供されます。
たしかに依存するライブラリはありません。
$ ldd firecracker
not a dynamic executable
$ file firecracker
firecracker: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=54e6f0603d7be00e58d31739ebc01a635b56fc09, not stripped
ゲストOSのカーネルとrootfsイメージのダウンロード
firecrackerを使ってマイクロVMを起動してみます。これも公式のgetting-startedにしたがって実行していけばすぐにできます。
最初にゲストOSとして実行するカーネルとrootfsをS3からダウンロードします。
まずカーネル。
$ curl -fsSL -o hello-vmlinux.bin https://s3.amazonaws.com/spec.ccfc.min/img/quickstart_guide/x86_64/kernels/vmlinux.bin
$ file hello-vmlinux.bin
hello-vmlinux.bin: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=7c8bd33f36cb5eed93f1c724ab40b407198bbe6c, not stripped
次にrootfs。
$ curl -fsSL -o hello-rootfs.ext4 https://s3.amazonaws.com/spec.ccfc.min/img/quickstart_guide/x86_64/rootfs/bionic.rootfs.ext4
$ file hello-rootfs.ext4
hello-rootfs.ext4: Linux rev 1.0 ext4 filesystem data, UUID=07fe00e8-e1ff-437e-b0f1-cf10cc0a255f (needs journal recovery) (extents) (64bit) (huge files)
試しにマウントしてみると、Ubuntu 18.04ベースのrootfsであることがわかります。
$ sudo mount hello-rootfs.ext4 /mnt/
$ cat /mnt/etc/os-release
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
```
## ゲストOSの起動
まずfirecrackerプロセスを起動しておきます。REST APIを待ち受ける状態になります。TCPではなく、Unixドメインソケットで待ち受けるため、ソケットファイルを指定します。前に使ったファイルが残っている場合は削除しておきます。
```bash
$ ./firecracker --api-sock /tmp/firecracker.socket
```
次にfirecrackerのREST APIを使って、カーネルとrootfsのイメージを指定します。
REST APIの仕様は公式githubに[swagger形式のドキュメント](https://github.com/firecracker-microvm/firecracker/blob/main/src/api_server/swagger/firecracker.yaml)に書かれています。
kernal_image_pathにダウンロードしたカーネルイメージのパスを指定します。
```bash
curl --unix-socket /tmp/firecracker.socket -i \
-X PUT 'http://localhost/boot-source' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d "{
\"kernel_image_path\": \"${kernel_path}\",
\"boot_args\": \"console=ttyS0 reboot=k panic=1 pci=off\"
```
path_on_hostにrootfsイメージのパスを指定します。
```bash
curl --unix-socket /tmp/firecracker.socket -i \
-X PUT 'http://localhost/drives/rootfs' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d "{
\"drive_id\": \"rootfs\",
\"path_on_host\": \"${rootfs_path}\",
\"is_root_device\": true,
\"is_read_only\": false
}"
```
最後にゲストOSを起動します。
```bash
curl --unix-socket /tmp/firecracker.socket -i \
-X PUT 'http://localhost/actions' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"action_type": "InstanceStart"
}'
```
## 起動時間
Sandy Bridge世代のずいぶん古いCPUですが、1秒ほどでゲストOSの起動が完了しました。たしかに速い!
コンテナではなく、VMなので当たり前ですが、ホストとは違うカーネルでちゃんと動いています。
```bash
root@ubuntu-fc-uvm:~# uname -a
Linux ubuntu-fc-uvm 4.14.174 #2 SMP Wed Jul 14 11:47:24 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
```
## ゲストOSの終了
firecrackerのAPIに終了用のものはないようです。ゲストOSの中でrebootを実行するとゲストOSが停止し、その後firecrackerプロセス停止します。
## ゲストOSを複数起動
ゲストOSを複数起動する場合、firecrackerプロセスを複数起動します。待ち受けのUNIXソケットのファイル名は別のものを用意しておきます。
その後の、ゲストOSの起動方法はこれまで全く同様です。
## ゲストOSの起動ログ
```bash
[ 0.000000] Linux version 4.14.174 (@57edebb99db7) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #2 SMP Wed Jul 14 11:47:24 UTC 2021
[ 0.000000] Command line: console=ttyS0 reboot=k panic=1 pci=off root=/dev/vda rw virtio_mmio.device=4K@0xd0000000:5
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
[ 0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x0000000007ffffff] usable
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] DMI not present or invalid.
[ 0.000000] Hypervisor detected: KVM
[ 0.000000] tsc: Using PIT calibration value
[ 0.000000] e820: last_pfn = 0x8000 max_arch_pfn = 0x400000000
[ 0.000000] MTRR: Disabled
[ 0.000000] x86/PAT: MTRRs disabled, skipping PAT initialization too.
[ 0.000000] CPU MTRRs all blank - virtualized system.
[ 0.000000] x86/PAT: Configuration [0-7]: WB WT UC- UC WB WT UC- UC
[ 0.000000] found SMP MP-table at [mem 0x0009fc00-0x0009fc0f]
[ 0.000000] Scanning 1 areas for low memory corruption
[ 0.000000] No NUMA configuration found
[ 0.000000] Faking a node at [mem 0x0000000000000000-0x0000000007ffffff]
[ 0.000000] NODE_DATA(0) allocated [mem 0x07fde000-0x07ffffff]
[ 0.000000] kvm-clock: Using msrs 4b564d01 and 4b564d00
[ 0.000000] kvm-clock: cpu 0, msr 0:7fdc001, primary cpu clock
[ 0.000000] kvm-clock: using sched offset of 37376381 cycles
[ 0.000000] clocksource: kvm-clock: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x0000000000001000-0x0000000000ffffff]
[ 0.000000] DMA32 [mem 0x0000000001000000-0x0000000007ffffff]
[ 0.000000] Normal empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000000001000-0x000000000009efff]
[ 0.000000] node 0: [mem 0x0000000000100000-0x0000000007ffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000000001000-0x0000000007ffffff]
[ 0.000000] Intel MultiProcessor Specification v1.4
[ 0.000000] MPTABLE: OEM ID: FC
[ 0.000000] MPTABLE: Product ID: 000000000000
[ 0.000000] MPTABLE: APIC at: 0xFEE00000
[ 0.000000] Processor #0 (Bootup-CPU)
[ 0.000000] IOAPIC[0]: apic_id 2, version 17, address 0xfec00000, GSI 0-23
[ 0.000000] Processors: 1
[ 0.000000] smpboot: Allowing 1 CPUs, 0 hotplug CPUs
[ 0.000000] PM: Registered nosave memory: [mem 0x00000000-0x00000fff]
[ 0.000000] PM: Registered nosave memory: [mem 0x0009f000-0x000fffff]
[ 0.000000] e820: [mem 0x08000000-0xffffffff] available for PCI devices
[ 0.000000] Booting paravirtualized kernel on KVM
[ 0.000000] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645519600211568 ns
[ 0.000000] random: get_random_bytes called from start_kernel+0x94/0x486 with crng_init=0
[ 0.000000] setup_percpu: NR_CPUS:128 nr_cpumask_bits:128 nr_cpu_ids:1 nr_node_ids:1
[ 0.000000] percpu: Embedded 41 pages/cpu s128600 r8192 d31144 u2097152
[ 0.000000] KVM setup async PF for cpu 0
[ 0.000000] kvm-stealtime: cpu 0, msr 7c15040
[ 0.000000] PV qspinlock hash table entries: 256 (order: 0, 4096 bytes)
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 32137
[ 0.000000] Policy zone: DMA32
[ 0.000000] Kernel command line: console=ttyS0 reboot=k panic=1 pci=off root=/dev/vda rw virtio_mmio.device=4K@0xd0000000:5
[ 0.000000] PID hash table entries: 512 (order: 0, 4096 bytes)
[ 0.000000] Memory: 111016K/130680K available (8204K kernel code, 645K rwdata, 1480K rodata, 1324K init, 2792K bss, 19664K reserved, 0K cma-reserved)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] Kernel/User page tables isolation: enabled
[ 0.004000] Hierarchical RCU implementation.
[ 0.004000] RCU restricting CPUs from NR_CPUS=128 to nr_cpu_ids=1.
[ 0.004000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.004000] NR_IRQS: 4352, nr_irqs: 48, preallocated irqs: 16
[ 0.004000] Console: colour dummy device 80x25
[ 0.004000] console [ttyS0] enabled
[ 0.004000] tsc: Detected 2491.904 MHz processor
[ 0.004000] Calibrating delay loop (skipped) preset value.. 4983.80 BogoMIPS (lpj=9967616)
[ 0.004000] pid_max: default: 32768 minimum: 301
[ 0.004064] Security Framework initialized
[ 0.005158] SELinux: Initializing.
[ 0.006168] Dentry cache hash table entries: 16384 (order: 5, 131072 bytes)
[ 0.008076] Inode-cache hash table entries: 8192 (order: 4, 65536 bytes)
[ 0.009965] Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
[ 0.011541] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes)
[ 0.012471] Last level iTLB entries: 4KB 512, 2MB 8, 4MB 8
[ 0.014095] Last level dTLB entries: 4KB 512, 2MB 32, 4MB 32, 1GB 0
[ 0.016008] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization
[ 0.018061] Spectre V2 : Mitigation: Full generic retpoline
[ 0.020004] Spectre V2 : Spectre v2 / SpectreRSB mitigation: Filling RSB on context switch
[ 0.022018] Spectre V2 : Enabling Restricted Speculation for firmware calls
[ 0.024014] Spectre V2 : mitigation: Enabling conditional Indirect Branch Prediction Barrier
[ 0.026035] Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl and seccomp
[ 0.028058] MDS: Mitigation: Clear CPU buffers
[ 0.045102] Freeing SMP alternatives memory: 28K
[ 0.047917] smpboot: Max logical packages: 1
[ 0.048372] x2apic enabled
[ 0.049468] Switched APIC routing to physical x2apic.
[ 0.053688] ..TIMER: vector=0x30 apic1=0 pin1=0 apic2=-1 pin2=-1
[ 0.055285] smpboot: CPU0: Intel(R) Xeon(R) Processor @ 2.50GHz (family: 0x6, model: 0x2a, stepping: 0x7)
[ 0.056000] Performance Events: unsupported p6 CPU model 42 no PMU driver, software events only.
[ 0.056080] Hierarchical SRCU implementation.
[ 0.057460] smp: Bringing up secondary CPUs ...
[ 0.058538] smp: Brought up 1 node, 1 CPU
[ 0.059487] smpboot: Total of 1 processors activated (4983.80 BogoMIPS)
[ 0.060592] devtmpfs: initialized
[ 0.061460] x86/mm: Memory block size: 128MB
[ 0.062740] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[ 0.064012] futex hash table entries: 256 (order: 2, 16384 bytes)
[ 0.065429] NET: Registered protocol family 16
[ 0.066743] cpuidle: using governor ladder
[ 0.067702] cpuidle: using governor menu
[ 0.073788] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[ 0.075682] SCSI subsystem initialized
[ 0.076043] pps_core: LinuxPPS API ver. 1 registered
[ 0.077087] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 0.078861] PTP clock support registered
[ 0.079751] dmi: Firmware registration failed.
[ 0.080128] NetLabel: Initializing
[ 0.080920] NetLabel: domain hash size = 128
[ 0.081850] NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO
[ 0.082979] NetLabel: unlabeled traffic allowed by default
[ 0.084316] clocksource: Switched to clocksource kvm-clock
[ 0.085669] VFS: Disk quotas dquot_6.6.0
[ 0.086531] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[ 0.090754] NET: Registered protocol family 2
[ 0.091928] TCP established hash table entries: 1024 (order: 1, 8192 bytes)
[ 0.093521] TCP bind hash table entries: 1024 (order: 2, 16384 bytes)
[ 0.094866] TCP: Hash tables configured (established 1024 bind 1024)
[ 0.096273] UDP hash table entries: 256 (order: 1, 8192 bytes)
[ 0.097649] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
[ 0.099187] NET: Registered protocol family 1
[ 0.101435] virtio-mmio: Registering device virtio-mmio.0 at 0xd0000000-0xd0000fff, IRQ 5.
[ 0.103260] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x23eb59c9ee2, max_idle_ns: 440795321417 ns
[ 0.105722] platform rtc_cmos: registered platform RTC device (no PNP device found)
[ 0.107706] Scanning for low memory corruption every 60 seconds
[ 0.109217] audit: initializing netlink subsys (disabled)
[ 0.110769] Initialise system trusted keyrings
[ 0.111780] Key type blacklist registered
[ 0.112815] audit: type=2000 audit(1644025465.366:1): state=initialized audit_enabled=0 res=1
[ 0.114920] workingset: timestamp_bits=36 max_order=15 bucket_order=0
[ 0.119245] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ 0.121861] Key type asymmetric registered
[ 0.122852] Asymmetric key parser 'x509' registered
[ 0.124079] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
[ 0.125930] io scheduler noop registered (default)
[ 0.127085] io scheduler cfq registered
[ 0.128025] virtio-mmio virtio-mmio.0: Failed to enable 64-bit or 32-bit DMA. Trying to continue, but this might not work.
[ 0.130692] Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
[ 0.154530] serial8250: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a U6_16550A
[ 0.158304] loop: module loaded
[ 0.159839] Loading iSCSI transport class v2.0-870.
[ 0.161242] iscsi: registered transport (tcp)
[ 0.162275] tun: Universal TUN/TAP device driver, 1.6
2022-02-05T01:44:25.517143005 [anonymous-instance:fc_vcpu 0:WARN:src/devices/src/legacy/i8042.rs:126] Failed to trigger i8042 kbd interrupt (disabled by guest OS)
[ 0.171237] i8042: Failed to disable AUX port, but continuing anyway... Is this a SiS?
[ 0.173117] i8042: If AUX port is really absent please use the 'i8042.noaux' option
2022-02-05T01:44:25.528441615 [anonymous-instance:fc_vcpu 0:WARN:src/devices/src/legacy/i8042.rs:126] Failed to trigger i8042 kbd interrupt (disabled by guest OS)
[ 0.448350] serio: i8042 KBD port at 0x60,0x64 irq 1
[ 0.451399] hidraw: raw HID events driver (C) Jiri Kosina
[ 0.453668] nf_conntrack version 0.5.0 (1024 buckets, 4096 max)
[ 0.456220] ip_tables: (C) 2000-2006 Netfilter Core Team
[ 0.458438] Initializing XFRM netlink socket
[ 0.459843] NET: Registered protocol family 10
[ 0.461469] Segment Routing with IPv6
[ 0.462363] NET: Registered protocol family 17
[ 0.463432] Bridge firewalling registered
[ 0.464479] NET: Registered protocol family 40
[ 0.465567] sched_clock: Marking stable (464394220, 0)->(570767821, -106373601)
[ 0.467477] registered taskstats version 1
[ 0.468301] Loading compiled-in X.509 certificates
[ 0.470231] Loaded X.509 cert 'Build time autogenerated kernel key: e98e9d271da5d0a322cc4d7bfaa8c2c4c3e46010'
[ 0.472314] Key type encrypted registered
[ 0.961259] input: AT Raw Set 2 keyboard as /devices/platform/i8042/serio0/input/input0
[ 0.972393] EXT4-fs (vda): recovery complete
[ 0.973765] EXT4-fs (vda): mounted filesystem with ordered data mode. Opts: (null)
[ 0.975766] VFS: Mounted root (ext4 filesystem) on device 254:0.
[ 0.977454] devtmpfs: mounted
[ 0.979179] Freeing unused kernel memory: 1324K
[ 0.984073] Write protecting the kernel read-only data: 12288k
[ 0.987326] Freeing unused kernel memory: 2016K
[ 0.990372] Freeing unused kernel memory: 568K
2022-02-05T01:44:26.348060672 [anonymous-instance:fc_vcpu 0:WARN:src/devices/src/virtio/mmio.rs:319] invalid virtio mmio write: 0x0:0x1
[ 1.007607] random: fast init done
SELinux: Could not open policy file <= /etc/selinux/targeted/policy/policy.31: No such file or directory
[ 1.013397] systemd[1]: Failed to insert module 'autofs4': No such file or directory
[ 1.018033] systemd[1]: systemd 237 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid)
[ 1.024077] systemd[1]: Detected virtualization kvm.
[ 1.025397] systemd[1]: Detected architecture x86-64.
Welcome to Ubuntu 18.04.5 LTS!
[ 1.029465] systemd[1]: Set hostname to <ubuntu-fc-uvm>.
[ 1.084672] systemd[1]: /etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf:3: Ignoring unknown escape sequences: "-p -- \u"
[ 1.089966] random: systemd: uninitialized urandom read (16 bytes read)
[ 1.091649] systemd[1]: Reached target Remote File Systems.
[ OK ] Reached target Remote File Systems.
[ 1.094216] random: systemd: uninitialized urandom read (16 bytes read)
[ 1.095756] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[ OK ] Started Forward Password Requests to Wall Directory Watch.
[ 1.099052] random: systemd: uninitialized urandom read (16 bytes read)
[ 1.100614] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[ OK ] Started Dispatch Password Requests to Console Directory Watch.
[ 1.103752] systemd[1]: Reached target Paths.
[ OK ] Reached target Paths.
[ 1.105828] systemd[1]: Reached target Local Encrypted Volumes.
[ OK ] Reached target Local Encrypted Volumes.
[UNSUPP] Starting of Arbitrary Executable Fi…tem Automount Point not supported.
[ OK ] Reached target Swap.
[ OK ] Created slice System Slice.
[ OK ] Listening on Journal Socket.
Starting Load Kernel Modules...
[ OK ] Created slice system-serial\x2dgetty.slice.
Starting Remount Root and Kernel File Systems...
[ OK ] Listening on Journal Audit Socket.
[ OK ] Listening on udev Control Socket.
Mounting Huge Pages File System...
[ OK ] Reached target Slices.
Mounting POSIX Message Queue File System...
[ OK ] Listening on Journal Socket (/dev/log).
Starting Journal Service...
[ OK ] Listening on udev Kernel Socket.
Starting udev Coldplug all Devices...
Starting Create Static Device Nodes in /dev...
[ OK ] Created slice system-getty.slice.
Mounting Kernel Debug File System...
[ OK ] Listening on /dev/initctl Compatibility Named Pipe.
[ OK ] Reached target Sockets.
[ OK ] Started Journal Service.
[ OK ] Started Load Kernel Modules.
[ OK ] Started Remount Root and Kernel File Systems.
[ OK ] Mounted Huge Pages File System.
[ OK ] Mounted POSIX Message Queue File System.
[ OK ] Started Create Static Device Nodes in /dev.
[ OK ] Mounted Kernel Debug File System.
Starting Load/Save Random Seed...
[ OK ] Reached target Local File Systems (Pre).
[ OK ] Reached target Local File Systems.
Starting udev Kernel Device Manager...
Starting Apply Kernel Variables...
Starting Flush Journal to Persistent Storage...
[ OK ] Started Load/Save Random Seed.
[ OK ] Started Apply Kernel Variables.
[ OK ] Started udev Kernel Device Manager.
[ OK ] Started udev Coldplug all Devices.
[ OK ] Started Flush Journal to Persistent Storage.
Starting Create Volatile Files and Directories...
[ OK ] Started Create Volatile Files and Directories.
Starting Update UTMP about System Boot/Shutdown...
[ OK ] Started Update UTMP about System Boot/Shutdown.
[ OK ] Reached target System Initialization.
[ OK ] Started Daily Cleanup of Temporary Directories.
[ OK ] Started Daily apt download activities.
[ OK ] Reached target Basic System.
Starting OpenBSD Secure Shell server...
Starting Permit User Sessions...
[ OK ] Started Message of the Day.
Starting getty on tty2-tty6 if dbus and logind are not available...
[ OK ] Started Daily apt upgrade and clean activities.
Starting fcnet.service...
[ OK ] Started Discard unused blocks once a week.
[ OK ] Reached target Timers.
[ OK ] Started Permit User Sessions.
[ OK ] Started fcnet.service.
[ OK ] Found device /dev/ttyS0.
[ OK ] Started OpenBSD Secure Shell server.
[ OK ] Started getty on tty2-tty6 if dbus and logind are not available.
[ OK ] Started Getty on tty6.
[ OK ] Started Getty on tty5.
[ OK ] Started Getty on tty4.
[ OK ] Started Getty on tty3.
[ OK ] Started Getty on tty2.
[ OK ] Started Getty on tty1.
[ OK ] Started Serial Getty on ttyS0.
[ OK ] Reached target Login Prompts.
[ OK ] Reached target Multi-User System.
[ OK ] Reached target Graphical Interface.
Starting Update UTMP about System Runlevel Changes...
[ OK ] Started Update UTMP about System Runlevel Changes.
Ubuntu 18.04.5 LTS ubuntu-fc-uvm ttyS0
ubuntu-fc-uvm login: root (automatic login)
Last login: Sat Feb 5 01:40:13 UTC 2022 on ttyS0
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.14.174 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
root@ubuntu-fc-uvm:~#
```