mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-10 05:46:48 +00:00
Add INITRAMFS_SKIP_GZIP option to make initramfs encoding/decoding faster
This commit is contained in:
parent
b472737771
commit
c4229e3c2f
8
Makefile
8
Makefile
@ -112,6 +112,12 @@ ifeq ($(ENABLE_KVM), 1)
|
|||||||
CARGO_OSDK_ARGS += --qemu-args="-accel kvm"
|
CARGO_OSDK_ARGS += --qemu-args="-accel kvm"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Skip GZIP to make encoding and decoding of initramfs faster
|
||||||
|
ifeq ($(INITRAMFS_SKIP_GZIP),1)
|
||||||
|
CARGO_OSDK_INITRAMFS_OPTION := --initramfs=$(realpath test/build/initramfs.cpio)
|
||||||
|
CARGO_OSDK_ARGS += $(CARGO_OSDK_INITRAMFS_OPTION)
|
||||||
|
endif
|
||||||
|
|
||||||
# Pass make variables to all subdirectory makes
|
# Pass make variables to all subdirectory makes
|
||||||
export
|
export
|
||||||
|
|
||||||
@ -243,7 +249,7 @@ ktest: initramfs $(CARGO_OSDK)
|
|||||||
@# Exclude linux-bzimage-setup from ktest since it's hard to be unit tested
|
@# Exclude linux-bzimage-setup from ktest since it's hard to be unit tested
|
||||||
@for dir in $(OSDK_CRATES); do \
|
@for dir in $(OSDK_CRATES); do \
|
||||||
[ $$dir = "ostd/libs/linux-bzimage/setup" ] && continue; \
|
[ $$dir = "ostd/libs/linux-bzimage/setup" ] && continue; \
|
||||||
(cd $$dir && OVMF=off cargo osdk test) || exit 1; \
|
(cd $$dir && OVMF=off cargo osdk test $(CARGO_OSDK_INITRAMFS_OPTION)) || exit 1; \
|
||||||
tail --lines 10 qemu.log | grep -q "^\\[ktest runner\\] All crates tested." \
|
tail --lines 10 qemu.log | grep -q "^\\[ktest runner\\] All crates tested." \
|
||||||
|| (echo "Test failed" && exit 1); \
|
|| (echo "Test failed" && exit 1); \
|
||||||
done
|
done
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
use core2::io::{Cursor, Read};
|
||||||
use cpio_decoder::{CpioDecoder, FileType};
|
use cpio_decoder::{CpioDecoder, FileType};
|
||||||
use lending_iterator::LendingIterator;
|
use lending_iterator::LendingIterator;
|
||||||
use libflate::gzip::Decoder as GZipDecoder;
|
use libflate::gzip::Decoder as GZipDecoder;
|
||||||
@ -14,17 +15,47 @@ use super::{
|
|||||||
};
|
};
|
||||||
use crate::{fs::path::is_dot, prelude::*};
|
use crate::{fs::path::is_dot, prelude::*};
|
||||||
|
|
||||||
|
struct BoxedReader<'a>(Box<dyn Read + 'a>);
|
||||||
|
|
||||||
|
impl<'a> BoxedReader<'a> {
|
||||||
|
pub fn new(reader: Box<dyn Read + 'a>) -> Self {
|
||||||
|
BoxedReader(reader)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Read for BoxedReader<'_> {
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> core2::io::Result<usize> {
|
||||||
|
self.0.read(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Unpack and prepare the rootfs from the initramfs CPIO buffer.
|
/// Unpack and prepare the rootfs from the initramfs CPIO buffer.
|
||||||
pub fn init(initramfs_buf: &[u8]) -> Result<()> {
|
pub fn init(initramfs_buf: &[u8]) -> Result<()> {
|
||||||
init_root_mount();
|
init_root_mount();
|
||||||
procfs::init();
|
procfs::init();
|
||||||
|
|
||||||
println!("[kernel] unpacking the initramfs.cpio.gz to rootfs ...");
|
let reader = {
|
||||||
|
let mut initramfs_suffix = "";
|
||||||
|
let reader = match &initramfs_buf[..4] {
|
||||||
|
// Gzip magic number: 0x1F 0x8B
|
||||||
|
&[0x1F, 0x8B, _, _] => {
|
||||||
|
initramfs_suffix = ".gz";
|
||||||
|
let gzip_decoder = GZipDecoder::new(initramfs_buf)
|
||||||
|
.map_err(|_| Error::with_message(Errno::EINVAL, "invalid gzip buffer"))?;
|
||||||
|
BoxedReader::new(Box::new(gzip_decoder))
|
||||||
|
}
|
||||||
|
_ => BoxedReader::new(Box::new(Cursor::new(initramfs_buf))),
|
||||||
|
};
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"[kernel] unpacking the initramfs.cpio{} to rootfs ...",
|
||||||
|
initramfs_suffix
|
||||||
|
);
|
||||||
|
|
||||||
|
reader
|
||||||
|
};
|
||||||
|
let mut decoder = CpioDecoder::new(reader);
|
||||||
let fs = FsResolver::new();
|
let fs = FsResolver::new();
|
||||||
let mut decoder = CpioDecoder::new(
|
|
||||||
GZipDecoder::new(initramfs_buf)
|
|
||||||
.map_err(|_| Error::with_message(Errno::EINVAL, "invalid gzip buffer"))?,
|
|
||||||
);
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let Some(entry_result) = decoder.next() else {
|
let Some(entry_result) = decoder.next() else {
|
||||||
|
@ -9,7 +9,12 @@ ATOMIC_WGET := $(CUR_DIR)/../tools/atomic_wget.sh
|
|||||||
BUILD_DIR := $(CUR_DIR)/build
|
BUILD_DIR := $(CUR_DIR)/build
|
||||||
INITRAMFS := $(BUILD_DIR)/initramfs
|
INITRAMFS := $(BUILD_DIR)/initramfs
|
||||||
INITRAMFS_FILELIST := $(BUILD_DIR)/initramfs.filelist
|
INITRAMFS_FILELIST := $(BUILD_DIR)/initramfs.filelist
|
||||||
|
INITRAMFS_SKIP_GZIP ?= 0
|
||||||
|
ifeq ($(INITRAMFS_SKIP_GZIP),1)
|
||||||
|
INITRAMFS_IMAGE := $(BUILD_DIR)/initramfs.cpio
|
||||||
|
else
|
||||||
INITRAMFS_IMAGE := $(BUILD_DIR)/initramfs.cpio.gz
|
INITRAMFS_IMAGE := $(BUILD_DIR)/initramfs.cpio.gz
|
||||||
|
endif
|
||||||
EXT2_IMAGE := $(BUILD_DIR)/ext2.img
|
EXT2_IMAGE := $(BUILD_DIR)/ext2.img
|
||||||
EXFAT_IMAGE := $(BUILD_DIR)/exfat.img
|
EXFAT_IMAGE := $(BUILD_DIR)/exfat.img
|
||||||
INITRAMFS_EMPTY_DIRS := \
|
INITRAMFS_EMPTY_DIRS := \
|
||||||
@ -107,7 +112,7 @@ $(INITRAMFS)/usr/local:
|
|||||||
|
|
||||||
.PHONY: $(INITRAMFS)/test
|
.PHONY: $(INITRAMFS)/test
|
||||||
$(INITRAMFS)/test:
|
$(INITRAMFS)/test:
|
||||||
@make --no-print-directory -C apps
|
@$(MAKE) --no-print-directory -C apps
|
||||||
|
|
||||||
$(INITRAMFS)/benchmark: | $(INITRAMFS)/benchmark/bin
|
$(INITRAMFS)/benchmark: | $(INITRAMFS)/benchmark/bin
|
||||||
@cp -rf $(CUR_DIR)/benchmark/* $@
|
@cp -rf $(CUR_DIR)/benchmark/* $@
|
||||||
@ -134,11 +139,11 @@ $(INITRAMFS_EMPTY_DIRS):
|
|||||||
|
|
||||||
.PHONY: $(SYSCALL_TEST_DIR)
|
.PHONY: $(SYSCALL_TEST_DIR)
|
||||||
$(SYSCALL_TEST_DIR):
|
$(SYSCALL_TEST_DIR):
|
||||||
@make --no-print-directory -C syscall_test
|
@$(MAKE) --no-print-directory -C syscall_test
|
||||||
|
|
||||||
.PHONY: $(INITRAMFS_IMAGE)
|
.PHONY: $(INITRAMFS_IMAGE)
|
||||||
$(INITRAMFS_IMAGE): $(INITRAMFS_FILELIST)
|
$(INITRAMFS_IMAGE): $(INITRAMFS_FILELIST)
|
||||||
@if ! cmp -s $(INITRAMFS_FILELIST) $(INITRAMFS_FILELIST).previous ; then \
|
@if ! cmp -s $(INITRAMFS_FILELIST) $(INITRAMFS_FILELIST).previous || ! test -f $@; then \
|
||||||
echo "Generating the initramfs image..."; \
|
echo "Generating the initramfs image..."; \
|
||||||
cp -f $(INITRAMFS_FILELIST) $(INITRAMFS_FILELIST).previous; \
|
cp -f $(INITRAMFS_FILELIST) $(INITRAMFS_FILELIST).previous; \
|
||||||
( \
|
( \
|
||||||
@ -148,7 +153,12 @@ $(INITRAMFS_IMAGE): $(INITRAMFS_FILELIST)
|
|||||||
# `$(INITRAMFS)` in the second column. This prunes the first \
|
# `$(INITRAMFS)` in the second column. This prunes the first \
|
||||||
# column and passes the second column to `cpio`. \
|
# column and passes the second column to `cpio`. \
|
||||||
cut -d " " -f 2- $(INITRAMFS_FILELIST) | \
|
cut -d " " -f 2- $(INITRAMFS_FILELIST) | \
|
||||||
cpio -o -H newc | gzip \
|
cpio -o -H newc | \
|
||||||
|
if [ "$(INITRAMFS_SKIP_GZIP)" != 1 ]; then \
|
||||||
|
gzip; \
|
||||||
|
else \
|
||||||
|
cat; \
|
||||||
|
fi \
|
||||||
) > $@; \
|
) > $@; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -175,11 +185,11 @@ build: $(INITRAMFS_IMAGE) $(EXT2_IMAGE) $(EXFAT_IMAGE)
|
|||||||
|
|
||||||
.PHONY: format
|
.PHONY: format
|
||||||
format:
|
format:
|
||||||
@make --no-print-directory -C apps format
|
@$(MAKE) --no-print-directory -C apps format
|
||||||
|
|
||||||
.PHONY: check
|
.PHONY: check
|
||||||
check:
|
check:
|
||||||
@make --no-print-directory -C apps check
|
@$(MAKE) --no-print-directory -C apps check
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user