From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on atuin.qyliss.net X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.6 Received: from atuin.qyliss.net (localhost [IPv6:::1]) by atuin.qyliss.net (Postfix) with ESMTP id DE11290135; Mon, 10 Oct 2022 23:32:20 +0000 (UTC) Received: by atuin.qyliss.net (Postfix, from userid 496) id 0544690109; Mon, 10 Oct 2022 23:32:17 +0000 (UTC) Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by atuin.qyliss.net (Postfix) with ESMTPS id 686B3900C7 for ; Mon, 10 Oct 2022 23:32:12 +0000 (UTC) Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 05AC15C01A3 for ; Mon, 10 Oct 2022 19:32:08 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Mon, 10 Oct 2022 19:32:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alyssa.is; h=cc :content-transfer-encoding:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:sender :subject:subject:to:to; s=fm2; t=1665444728; x=1665531128; bh=c4 PL9Nk+reYb1z+r2ACl6gHKqkQ/A/UpvzyOkQlf6w0=; b=v0ca1DZc0vdlWUTh36 4+eF+5U91T6VeFVDLFymsrUsVgQ9favNDfLV1VktU3vZEzXLdlM23rlIjGrure7J 9oWlSo4/i8dyRvfvhZgXRzM0On657+eqzv5cgT8tYBfd5yPTFGdrHwjfzkuUSC1j mKVaf/3IQQrhb8CEpmgTxoG2v9E3Fy5xYrBKaPkn4uu43AemRhl8nJxd56RbB7AX MEo/7FyXRvyOYxEqC+gt0tFRy6U9iJTkcPwpEVwAiLxE3uCixa9FykirTt2mpy5u 07UJnz5BSr5qZpOcjqkDY9LLlVjC3jA8g/5cckxcQ4B5uBLEoH87s2iupNxq6dKz fv5A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:sender:subject :subject:to:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm3; t=1665444728; x=1665531128; bh=c4PL9Nk+reYb1 z+r2ACl6gHKqkQ/A/UpvzyOkQlf6w0=; b=SHWn0GN03roZJZ2y6yQNbDhxgcyhP y6lrEqxvA+7iLyNXOg8KR1mIHdE0dGkyp45kfxYCGKmEggseNs3SAO2G/DtHjcIo fjiCUTBckNg4EuPzOtxn/ICjxneCjGAZbmRPkf8S/MBuK+AkW/6lmRZCsjljgADY RE4KcxY3qA3HZAxRGWKmYOwGRSs7Nv+8FThlUrfHcpkdRO2Dssd0l1DPrYW0AqXP 2QH7LyFtcDHIh14aOIMEqD+JsNIynF3CRV5UP3guA6Vas6G2alCWBezQHqGwOGJh qExEY49If9CjDQdptfY+yHfVSfeUl2Fium1GsaQVcrBcwOtISGDOxgqyw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrfeejhedgvdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvffufffkofgjfhgggfestdekre dtredttdenucfhrhhomheptehlhihsshgrucftohhsshcuoehhihesrghlhihsshgrrdhi sheqnecuggftrfgrthhtvghrnheptefggeffffdutdeikeektedvkeffieetueevudffke eihfdtudfhhfdtgefgleejnecuffhomhgrihhnpehpvggvkhdrihhsnecuvehluhhsthgv rhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepqhihlhhishhsseigvddvtd drqhihlhhishhsrdhnvght X-ME-Proxy: Feedback-ID: i12284293:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Mon, 10 Oct 2022 19:32:07 -0400 (EDT) Received: by x220.qyliss.net (Postfix, from userid 1000) id EB349B64; Mon, 10 Oct 2022 23:32:05 +0000 (UTC) From: Alyssa Ross To: devel@spectrum-os.org Subject: [PATCH 02/22] host/start-vm: implement shared directories Date: Mon, 10 Oct 2022 23:28:42 +0000 Message-Id: <20221010232909.1953738-3-hi@alyssa.is> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20221010232909.1953738-1-hi@alyssa.is> References: <20221010232909.1953738-1-hi@alyssa.is> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: AQ5LDB2WCULTHPYESVKRPONH6BMEMAGC X-Message-ID-Hash: AQ5LDB2WCULTHPYESVKRPONH6BMEMAGC X-MailFrom: qyliss@x220.qyliss.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-devel.spectrum-os.org-0; header-match-devel.spectrum-os.org-1; header-match-devel.spectrum-os.org-2; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.5 Precedence: list List-Id: Patches and low-level development discussion Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Signed-off-by: Alyssa Ross --- host/start-vm/lib.rs | 26 +++++++++++++ host/start-vm/tests/meson.build | 2 + host/start-vm/tests/vm_command-shared-dir.rs | 41 ++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 host/start-vm/tests/vm_command-shared-dir.rs diff --git a/host/start-vm/lib.rs b/host/start-vm/lib.rs index 9a92ab7..3959566 100644 --- a/host/start-vm/lib.rs +++ b/host/start-vm/lib.rs @@ -112,6 +112,32 @@ pub fn vm_command(dir: PathBuf, config_root: &Path) -> Result { return Err("no block devices specified".to_string()); } + let shared_dirs_dir = config_dir.join("shared-dirs"); + match shared_dirs_dir.read_dir().map(Iterator::peekable) { + Ok(mut entries) => { + if entries.peek().is_some() { + command.arg("--fs"); + } + + for result in entries { + let entry = result + .map_err(|e| format!("examining directory entry: {}", e))? + .file_name(); + + let mut arg = OsString::from("tag="); + arg.push(&entry); + arg.push(",socket=../"); + arg.push(vm_name); + arg.push("-fs-"); + arg.push(&entry); + arg.push("/env/virtiofsd.sock"); + command.arg(arg); + } + } + Err(e) if e.kind() == ErrorKind::NotFound => {} + Err(e) => return Err(format!("reading directory {:?}: {}", shared_dirs_dir, e)), + } + command.arg("--serial").arg({ let mut serial = OsString::from("file=/run/"); serial.push(&vm_name); diff --git a/host/start-vm/tests/meson.build b/host/start-vm/tests/meson.build index 00bd33d..857414b 100644 --- a/host/start-vm/tests/meson.build +++ b/host/start-vm/tests/meson.build @@ -31,3 +31,5 @@ test('tap_open (name too long)', executable('tap_open-name-too-long', test('vm_command-basic', executable('vm_command-basic', 'vm_command-basic.rs', link_with : [rust_lib, rust_helper])) +test('vm_command-shared-dir', executable('vm_command-shared-dir', + 'vm_command-shared-dir.rs', link_with : [rust_lib, rust_helper])) diff --git a/host/start-vm/tests/vm_command-shared-dir.rs b/host/start-vm/tests/vm_command-shared-dir.rs new file mode 100644 index 0000000..2b13663 --- /dev/null +++ b/host/start-vm/tests/vm_command-shared-dir.rs @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: EUPL-1.2+ +// SPDX-FileCopyrightText: 2022 Alyssa Ross + +use std::fs::{create_dir, create_dir_all, File}; +use std::os::unix::fs::symlink; + +use start_vm::vm_command; +use test_helper::TempDir; + +fn contains_seq, N>(haystack: &[H], needle: &[N]) -> bool { + let start_indexes = 0..=(haystack.len() - needle.len()); + let mut candidates = start_indexes.map(|i| &haystack[i..][..needle.len()]); + candidates.any(|c| c == needle) +} + +fn main() -> std::io::Result<()> { + let tmp_dir = TempDir::new()?; + + let service_dir = tmp_dir.path().join("testvm"); + let vm_config = tmp_dir.path().join("svc/data/testvm"); + + create_dir(&service_dir)?; + create_dir_all(&vm_config)?; + File::create(vm_config.join("vmlinux"))?; + create_dir(vm_config.join("blk"))?; + symlink("/dev/null", vm_config.join("blk/root.img"))?; + + create_dir(vm_config.join("shared-dirs"))?; + create_dir(vm_config.join("shared-dirs/root"))?; + symlink("/", vm_config.join("shared-dirs/root/dir"))?; + + let expected_args = [ + "--fs", + "tag=root,socket=../testvm-fs-root/env/virtiofsd.sock", + ]; + + let command = vm_command(service_dir, &tmp_dir.path().join("svc/data")).unwrap(); + let args: Box<[_]> = command.get_args().collect(); + assert!(contains_seq(&args, &expected_args)); + Ok(()) +} -- 2.37.1