From nobody Mon Aug 05 16:12:38 2024 X-Original-To: virtualization@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Wd1gQ6Nzqz5SHKX; Mon, 05 Aug 2024 16:12:50 +0000 (UTC) (envelope-from freebsd@omnilan.de) Received: from mx0.gentlemail.de (mx0.gentlemail.de [IPv6:2001:41d0:700:4a43:a25:de0:0:13]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4Wd1gN0fqgz4YjD; Mon, 5 Aug 2024 16:12:47 +0000 (UTC) (envelope-from freebsd@omnilan.de) Authentication-Results: mx1.freebsd.org; dkim=none; dmarc=none; spf=pass (mx1.freebsd.org: domain of freebsd@omnilan.de designates 2001:41d0:700:4a43:a25:de0:0:13 as permitted sender) smtp.mailfrom=freebsd@omnilan.de Received: from mh0.gentlemail.de (mh0.gentlemail.de [135.125.173.218]) by mx0.gentlemail.de (8.18.1/8.18.1) with ESMTP id 475GCdXF029029; Mon, 5 Aug 2024 16:12:39 GMT (envelope-from freebsd@omnilan.de) Received: from [172.21.3.1] (s1.omnilan.de [217.91.127.234]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mh0.gentlemail.de (Postfix) with ESMTPSA id 660821CBC; Mon, 05 Aug 2024 16:12:39 +0000 (UTC) Content-Type: multipart/mixed; boundary="------------radhHtt5qIt0nPYoCwSlwKnA" Message-ID: <178d585e-2ce0-4b69-a017-8af7f9b78a57@omnilan.de> Date: Mon, 5 Aug 2024 18:12:38 +0200 List-Id: Discussion List-Archive: https://lists.freebsd.org/archives/freebsd-virtualization List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: freebsd-virtualization@freebsd.org Sender: owner-freebsd-virtualization@FreeBSD.org MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: freebsd-current@freebsd.org Content-Language: en-US, de-DE Cc: virtualization@FreeBSD.org From: Harry Schmalzbauer Subject: RFC: rc(8) script for bhyve(8) on FreeBSD Organization: OmniLAN X-Spamd-Bar: -- X-Spamd-Result: default: False [-2.17 / 15.00]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_MEDIUM(-0.98)[-0.984]; R_SPF_ALLOW(-0.20)[+mx]; MIME_UNKNOWN(0.10)[application/x-xz]; MIME_GOOD(-0.10)[multipart/mixed,text/plain]; XM_UA_NO_VERSION(0.01)[]; NEURAL_HAM_SHORT(-0.00)[-0.000]; FROM_HAS_DN(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; ASN(0.00)[asn:16276, ipnet:2001:41d0::/32, country:FR]; ARC_NA(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:~]; HAS_ORG_HEADER(0.00)[]; RCPT_COUNT_TWO(0.00)[2]; R_DKIM_NA(0.00)[]; MLMMJ_DEST(0.00)[virtualization@FreeBSD.org,freebsd-current@freebsd.org]; RCVD_COUNT_TWO(0.00)[2]; FROM_EQ_ENVFROM(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; TO_DN_NONE(0.00)[]; RCVD_TLS_LAST(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; DMARC_NA(0.00)[omnilan.de]; HAS_ATTACHMENT(0.00)[] X-Rspamd-Queue-Id: 4Wd1gN0fqgz4YjD This is a multi-part message in MIME format. --------------radhHtt5qIt0nPYoCwSlwKnA Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hello, two years elapsed since I last deployed a FreeBSD machine that utilizd bhyve(8), which already had bhyve_config(5) support back then. I was astonished that I still couldn't find bhyve in /etc/rc.d in 14.1-stable as of last week. Since I utilize ng_bridge(8) and do some more things differently than vm-bhyve / iocage and the like, I wanted to have something straight forward, capable of making use of the wonderful bhyve_config(5) feature, for use cases where /usr/share/examples/bhyve/vmrun.sh isn't suitable. Please find attached my first approch, which currently covers the following features: - auto-preload FreeBSD guest using bhyveload(8) in case config file doesn't define lpc.bootrom - Allows referencing %(youname_somevar) in config file if defined as bhyve_youname_somevar in rc.conf(5).   (For example:     bhyve_vmdisk_default_pool="myppol2"     bhyve_vmdisk_default_dataset="bhyveVOL/sys"     and pci.0.3.0.path=/dev/zvol/%(vmdisk_default_pool)/%(vmdisk_default_dataset)/%(name) in bhyve_config(5) file   ) - Adaptive handling of start/stop requests depending on 'AUTO' 'ALL' or specific list of VM names, depending on the non-bhyve_cfg(5) 'autostart' option. - Hopefully balanced amount of messages about what's going on, to be user friendly but not spamming. There's a lot of room for improvements (selectable pre-jail/post-jail order, bootdisk detection, priority handling, a useful 'status' implementation, style) and for sure some bugs, but this version works well for my current setup. Happy to contribute if useful for others, feedback welcome. -harry --------------radhHtt5qIt0nPYoCwSlwKnA Content-Type: application/x-xz; name="rc.d_bhyve.shar.xz" Content-Disposition: attachment; filename="rc.d_bhyve.shar.xz" Content-Transfer-Encoding: base64 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 n+Ek5gABgDve1wEAzJVCXLHEZ/sCAAAAAARZWg== --------------radhHtt5qIt0nPYoCwSlwKnA--