This commit is contained in:
Mikaël Cluseau 2024-06-28 21:54:17 +02:00
parent 57064a39b6
commit bce1ec14f1
10 changed files with 384 additions and 44 deletions

244
Cargo.lock generated
View File

@ -2,6 +2,21 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "addr2line"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
version = "1.1.3" version = "1.1.3"
@ -47,7 +62,7 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5"
dependencies = [ dependencies = [
"windows-sys", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -57,9 +72,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"windows-sys", "windows-sys 0.52.0",
] ]
[[package]]
name = "anyhow"
version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "backtrace"
version = "0.3.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]]
name = "bytes"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
[[package]]
name = "cc"
version = "1.0.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]] [[package]]
name = "colorchoice" name = "colorchoice"
version = "1.0.1" version = "1.0.1"
@ -95,6 +149,12 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "gimli"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.14.5" version = "0.14.5"
@ -121,11 +181,14 @@ dependencies = [
name = "init" name = "init"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow",
"env_logger", "env_logger",
"log", "log",
"serde", "serde",
"serde_json", "serde_json",
"serde_yaml", "serde_yaml",
"shell-escape",
"tokio",
] ]
[[package]] [[package]]
@ -140,6 +203,12 @@ version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
name = "libc"
version = "0.2.155"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.21" version = "0.4.21"
@ -152,6 +221,41 @@ version = "2.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
[[package]]
name = "miniz_oxide"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
dependencies = [
"adler",
]
[[package]]
name = "mio"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
dependencies = [
"libc",
"wasi",
"windows-sys 0.48.0",
]
[[package]]
name = "object"
version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434"
dependencies = [
"memchr",
]
[[package]]
name = "pin-project-lite"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.81" version = "1.0.81"
@ -199,6 +303,12 @@ version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
[[package]]
name = "rustc-demangle"
version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.17" version = "1.0.17"
@ -249,6 +359,21 @@ dependencies = [
"unsafe-libyaml", "unsafe-libyaml",
] ]
[[package]]
name = "shell-escape"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
[[package]]
name = "signal-hook-registry"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.60" version = "2.0.60"
@ -260,6 +385,33 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "tokio"
version = "1.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a"
dependencies = [
"backtrace",
"bytes",
"libc",
"mio",
"pin-project-lite",
"signal-hook-registry",
"tokio-macros",
"windows-sys 0.48.0",
]
[[package]]
name = "tokio-macros"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.12" version = "1.0.12"
@ -278,13 +430,43 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
"windows-targets 0.48.5",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.52.0" version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [ dependencies = [
"windows-targets", "windows-targets 0.52.5",
]
[[package]]
name = "windows-targets"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
"windows_aarch64_gnullvm 0.48.5",
"windows_aarch64_msvc 0.48.5",
"windows_i686_gnu 0.48.5",
"windows_i686_msvc 0.48.5",
"windows_x86_64_gnu 0.48.5",
"windows_x86_64_gnullvm 0.48.5",
"windows_x86_64_msvc 0.48.5",
] ]
[[package]] [[package]]
@ -293,28 +475,46 @@ version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
dependencies = [ dependencies = [
"windows_aarch64_gnullvm", "windows_aarch64_gnullvm 0.52.5",
"windows_aarch64_msvc", "windows_aarch64_msvc 0.52.5",
"windows_i686_gnu", "windows_i686_gnu 0.52.5",
"windows_i686_gnullvm", "windows_i686_gnullvm",
"windows_i686_msvc", "windows_i686_msvc 0.52.5",
"windows_x86_64_gnu", "windows_x86_64_gnu 0.52.5",
"windows_x86_64_gnullvm", "windows_x86_64_gnullvm 0.52.5",
"windows_x86_64_msvc", "windows_x86_64_msvc 0.52.5",
] ]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]] [[package]]
name = "windows_aarch64_gnullvm" name = "windows_aarch64_gnullvm"
version = "0.52.5" version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.52.5" version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.52.5" version = "0.52.5"
@ -327,24 +527,48 @@ version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.52.5" version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.52.5" version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.52.5" version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.52.5" version = "0.52.5"

View File

@ -6,8 +6,11 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
anyhow = "1.0.86"
env_logger = "0.11.3" env_logger = "0.11.3"
log = "0.4.21" log = "0.4.21"
serde = { version = "1.0.198", features = ["derive"] } serde = { version = "1.0.198", features = ["derive"] }
serde_json = "1.0.116" serde_json = "1.0.116"
serde_yaml = "0.9.34" serde_yaml = "0.9.34"
shell-escape = "0.1.5"
tokio = { version = "1.38.0", features = ["rt", "signal", "process", "macros"] }

View File

@ -1,16 +1,18 @@
from rust:1.77.1-alpine as rust # ------------------------------------------------------------------------
from rust:1.79.0-alpine3.20 as rust
run apk add --no-cache musl-dev # pkgconfig cryptsetup-dev lvm2-dev clang-dev clang-static run apk add --no-cache musl-dev # pkgconfig cryptsetup-dev lvm2-dev clang-dev clang-static
workdir /src workdir /src
copy Cargo.* . copy Cargo.* .
copy src src copy src src
run --mount=type=cache,target=/usr/local/cargo/registry \ run --mount=type=cache,id=novit-rs,target=/usr/local/cargo/registry \
--mount=type=cache,sharing=private,target=/src/target \ --mount=type=cache,id=novit-rs-target,sharing=private,target=/src/target \
cargo build --release \ cargo build --release && cp target/release/init / \
&& cp target/release/init /init-rs && strip /init
from golang:1.21.6-alpine3.19 as build # ------------------------------------------------------------------------
from golang:1.22.4-alpine3.20 as build
workdir /src workdir /src
@ -23,7 +25,7 @@ run \
&& go build -o /go/bin/init -trimpath . && go build -o /go/bin/init -trimpath .
# ------------------------------------------------------------------------ # ------------------------------------------------------------------------
from alpine:3.19.0 as initrd from alpine:3.20.0 as initrd
run apk add --no-cache xz run apk add --no-cache xz
@ -31,18 +33,18 @@ workdir /layer
run . /etc/os-release \ run . /etc/os-release \
&& wget -O- https://dl-cdn.alpinelinux.org/alpine/v${VERSION_ID%.*}/releases/x86_64/alpine-minirootfs-${VERSION_ID}-x86_64.tar.gz |tar zxv && wget -O- https://dl-cdn.alpinelinux.org/alpine/v${VERSION_ID%.*}/releases/x86_64/alpine-minirootfs-${VERSION_ID}-x86_64.tar.gz |tar zxv
run apk add --no-cache -p . musl lvm2 lvm2-extra lvm2-dmeventd udev cryptsetup e2fsprogs btrfs-progs lsblk run apk add --no-cache -p . musl coreutils lvm2 lvm2-extra lvm2-dmeventd udev cryptsetup e2fsprogs btrfs-progs lsblk
run rm -rf usr/share/apk var/cache/apk run rm -rf usr/share/apk var/cache/apk
#copy --from=build /go/bin/init . #copy --from=build /go/bin/init .
copy --from=rust /init-rs init copy --from=rust /init /layer/init
# check viability # check viability
run chroot /layer /init hello run chroot . /init hello
run find |cpio -H newc -o >/initrd run find |cpio -H newc -o >/initrd
# ------------------------------------------------------------------------ # ------------------------------------------------------------------------
from alpine:3.19.0 from alpine:3.20.0
copy --from=initrd /initrd / copy --from=initrd /initrd /
entrypoint ["base64","/initrd"] entrypoint ["base64","/initrd"]

View File

@ -20,8 +20,6 @@ case $1 in
esac esac
$docker run --rm -i --net=host --user=$UID \ $docker run --rm -i --net=host --user=$UID \
-v $HOME/.cargo-alpine/registry:/usr/local/cargo/registry \
-v $PWD:/src -w /src \
nv-rs-build \ nv-rs-build \
cargo build $opts cargo build $opts

View File

@ -7,13 +7,12 @@ go.??? **/*.go {
prep: go build -o dist/ ./tools/... prep: go build -o dist/ ./tools/...
} }
**/*.rs { **/*.rs Cargo.* {
prep: cargo test prep: cargo test
#prep: cargo build #prep: cargo build
#prep: (cd test-initrd && ../target/debug/init) prep: docker build --network host -t novit-initrd-gen .
prep: bash ./build-init prep: docker run --net=host --rm novit-initrd-gen |base64 -d >dist/initrd.new
prep: docker exec -i -w /src/test-initrd nv-initrd-test ./init prep: mv dist/initrd.new dist/initrd
prep: ./build-init release
} }
#dist/init Dockerfile { #dist/init Dockerfile {

View File

@ -10,7 +10,8 @@ if ! [ -e $disk2 ]; then
qemu-img create -f qcow2 $disk2 10G qemu-img create -f qcow2 $disk2 10G
fi fi
exec qemu-system-x86_64 -pidfile qemu.pid -kernel test-kernel -initrd test-initrd.cpio \ exec qemu-system-x86_64 -pidfile qemu.pid \
-kernel test-kernel -initrd test-initrd.cpio \
-smp 2 -m 2048 \ -smp 2 -m 2048 \
-netdev bridge,br=novit,id=eth0 -device virtio-net-pci,netdev=eth0 \ -netdev bridge,br=novit,id=eth0 -device virtio-net-pci,netdev=eth0 \
-drive file=$disk1,if=virtio \ -drive file=$disk1,if=virtio \

View File

@ -2,10 +2,10 @@ mod bootstrap;
mod lsblk; mod lsblk;
mod lvm; mod lvm;
use anyhow::format_err;
use log::error; use log::error;
use std::io;
use std::io::{self, Read, Write}; use std::process::{exit, Command};
use std::process::exit;
use std::{env, fs}; use std::{env, fs};
fn main() { fn main() {
@ -14,6 +14,8 @@ fn main() {
} }
env_logger::init(); env_logger::init();
env::set_var("PATH", "/bin:/sbin");
if let Some(arg) = env::args().into_iter().nth(1) { if let Some(arg) = env::args().into_iter().nth(1) {
match arg.as_str() { match arg.as_str() {
"hello" => println!("hello"), "hello" => println!("hello"),
@ -25,20 +27,21 @@ fn main() {
exit(0); exit(0);
} }
let Ok(cfg) = let cfg: bootstrap::config::Config = retry(|| {
fs::File::open("config.yaml").inspect_err(|e| error!("failed to read config: {e}")) let cfg = fs::read("config.yaml").map_err(|e| format_err!("failed to read config: {e}"))?;
else { serde_yaml::from_slice(cfg.as_slice())
exit(1); .map_err(|e| format_err!("failed to parse config: {e}"))
}; });
let Ok(cfg) = serde_yaml::from_reader::<_, bootstrap::config::Config>(cfg)
.inspect_err(|e| error!("failed to parse config: {e}"))
else {
exit(1);
};
serde_yaml::to_writer(io::stdout(), &cfg).unwrap(); serde_yaml::to_writer(io::stdout(), &cfg).unwrap();
mount("none", "/proc", "proc", None);
mount("none", "/sys", "sysfs", None);
mount("none", "/dev", "devtmpfs", None);
mount("none", "/dev/pts", "devpts", Some("gid=5,mode=620"));
exec("ash", vec!["-c", "set -ex; pvs; false"]);
for pv in lvm::pvs().unwrap() { for pv in lvm::pvs().unwrap() {
println!("pv: {pv:?}"); println!("pv: {pv:?}");
} }
@ -53,3 +56,114 @@ fn main() {
// TODO // TODO
} }
fn mount(src: &str, dst: &str, fstype: &str, opts: Option<&str>) {
let _ = fs::create_dir_all(dst).inspect_err(|e| error!("failed to create dir {dst}: {e}"));
let mut args = vec![src, dst, "-t", fstype];
if let Some(opts) = opts {
args.extend(["-o", opts]);
}
exec("mount", args);
}
fn exec(prog: &str, args: Vec<&str>) {
let cmd_str = sh_str(prog, &args);
retry_or_ignore(|| {
println!("\x1b[34m# {cmd_str}\x1b[0m");
let mut cmd = Command::new(prog);
cmd.args(args.clone());
let s = cmd.status()?;
if s.success() {
Ok(())
} else {
Err(format_err!("command failed: {s}"))
}
});
}
fn retry_or_ignore(action: impl Fn() -> anyhow::Result<()>) {
loop {
match action() {
Ok(_) => return,
Err(e) => {
eprintln!("\x1b[31m{e}\x1b[0m");
loop {
eprint!("[r]etry, [i]gnore, or [s]hell? ");
let mut line = String::new();
io::stdin().read_line(&mut line).unwrap();
match line.trim() {
"r" => break,
"i" => return,
"s" => {
exec_shell();
break;
}
v => {
eprintln!("invalid choice: {v:?}");
}
};
}
}
}
}
}
fn retry<T>(action: impl Fn() -> anyhow::Result<T>) -> T {
loop {
match action() {
Ok(v) => return v,
Err(e) => {
eprintln!("\x1b[31m{e}\x1b[0m");
loop {
eprint!("[r]etry, or [s]hell? ");
let mut line = String::new();
io::stdin().read_line(&mut line).unwrap();
match line.trim() {
"r" => break,
"s" => {
exec_shell();
break;
}
v => {
eprintln!("invalid choice: {v:?}");
}
};
}
}
}
}
}
fn exec_shell() {
let mut child = match Command::new("ash").spawn() {
Ok(c) => c,
Err(e) => {
error!("failed to exec shell: {e}");
return;
}
};
let _ = child.wait();
}
fn sh_str(prog: &str, args: &Vec<&str>) -> String {
use std::borrow::Cow;
let mut buf = String::new();
buf.push_str(&shell_escape::escape(Cow::from(prog)));
for &arg in args {
buf.push(' ');
buf.push_str(&shell_escape::escape(Cow::from(arg)));
}
buf
}

View File

@ -1 +0,0 @@
../dist/init

Binary file not shown.

Binary file not shown.