mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-03 13:11:31 +00:00
improve dev guide and validate guide steps
This commit is contained in:
36
README.md
36
README.md
@ -24,7 +24,7 @@ pvcalls is extremely interesting, and although it is certainly possible to utili
|
|||||||
|
|
||||||
### Why is this prototype utilizing AGPL?
|
### Why is this prototype utilizing AGPL?
|
||||||
|
|
||||||
This repository is licensed under AGPL. This is because what is here is not intended for anything other than curiousity and research. Mycelium will utilize a different license for any production versions of hypha.
|
This repository is licensed under AGPL. This is because what is here is not intended for anything other than curiosity and research. Mycelium will utilize a different license for any production versions of hypha.
|
||||||
|
|
||||||
As such, no external contributions are accepted at this time.
|
As such, no external contributions are accepted at this time.
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ hypha is composed of three major executables:
|
|||||||
| hyphactr | guest | none, guest init | N/A | container |
|
| hyphactr | guest | none, guest init | N/A | container |
|
||||||
|
|
||||||
You will find the code to each executable available in the bin/ and src/ directories inside
|
You will find the code to each executable available in the bin/ and src/ directories inside
|
||||||
it's coresponding code path from the above table.
|
it's corresponding code path from the above table.
|
||||||
|
|
||||||
### Environment
|
### Environment
|
||||||
|
|
||||||
@ -58,31 +58,45 @@ it's coresponding code path from the above table.
|
|||||||
| Architecture | x86_64 | aarch64 support requires minimal effort, but limited to x86 for research phase |
|
| Architecture | x86_64 | aarch64 support requires minimal effort, but limited to x86 for research phase |
|
||||||
| Memory | At least 6GB | dom0 will need to be configured will lower memory limit to give hypha guests room |
|
| Memory | At least 6GB | dom0 will need to be configured will lower memory limit to give hypha guests room |
|
||||||
| Xen | 4.17 | Temporary due to hardcoded interface version constants |
|
| Xen | 4.17 | Temporary due to hardcoded interface version constants |
|
||||||
| Debian | sid / stable | Debian is recommended due to the ease of Xen setup |
|
| Debian | stable / sid | Debian is recommended due to the ease of Xen setup |
|
||||||
| musl-gcc | any | hyphactr is built for musl to allow static linking, as initrd is a single file |
|
|
||||||
| rustup | any | Install Rustup from https://rustup.rs |
|
| rustup | any | Install Rustup from https://rustup.rs |
|
||||||
|
|
||||||
### Setup
|
### Debian Setup
|
||||||
|
|
||||||
1. Install the specified Debian version on a x86_64 host _capable_ of KVM (NOTE: KVM is not used, Xen is a type-1 hypervisor).
|
1. Install the specified Debian version on a x86_64 host _capable_ of KVM (NOTE: KVM is not used, Xen is a type-1 hypervisor).
|
||||||
|
|
||||||
2. Ensure you have installed Xen (apt install xen-system-amd64) and configure `/etc/default/grub.d/xen.cfg` to give hypha guests
|
2. Install required packages: `apt install git xen-system-amd64 flex bison libelf-dev libssl-dev bc`
|
||||||
some room:
|
|
||||||
|
3. Install [rustup](https://rustup.rs) for managing a Rust environment.
|
||||||
|
|
||||||
|
4. Configure `/etc/default/grub.d/xen.cfg` to give hypha guests some room:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Configure dom0_mem to be 4GB, but leave the rest of the RAM for hypha guests.
|
# Configure dom0_mem to be 4GB, but leave the rest of the RAM for hypha guests.
|
||||||
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=4G,max:4G"
|
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=4G,max:4G"
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Build a guest kernel image:
|
After changing the grub config, update grub: `update-grub`
|
||||||
|
|
||||||
|
Then reboot to boot the system as a Xen dom0.
|
||||||
|
|
||||||
|
You can validate that Xen is setup by running `xl info` and ensuring it returns useful information about the Xen hypervisor.
|
||||||
|
|
||||||
|
5. Clone the hypha source code:
|
||||||
|
```sh
|
||||||
|
$ git clone https://github.com/mycelium-eng/hypha.git hypha
|
||||||
|
$ cd hypha
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Build a guest kernel image:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ ./kernel/build.sh -j4
|
$ ./kernel/build.sh -j4
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Copy the guest kernel image at `kernel/target/kernel` to `/var/lib/hypha/default/kernel` to have it automatically detected by hyphactl.
|
7. Copy the guest kernel image at `kernel/target/kernel` to `/var/lib/hypha/default/kernel` to have it automatically detected by hyphactl.
|
||||||
5. Launch `./scripts/hyphanet-debug.sh` and keep it running in the foreground.
|
8. Launch `./scripts/hyphanet-debug.sh` and keep it running in the foreground.
|
||||||
6. Run hyphactl to launch a container:
|
9. Run hyphactl to launch a container:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ ./scripts/hyphactl-debug.sh launch --attach mirror.gcr.io/library/alpine:latest /bin/busybox sh
|
$ ./scripts/hyphactl-debug.sh launch --attach mirror.gcr.io/library/alpine:latest /bin/busybox sh
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
TARGET="x86_64-unknown-linux-musl"
|
TARGET="x86_64-unknown-linux-gnu"
|
||||||
|
|
||||||
export RUSTFLAGS="-Ctarget-feature=+crt-static"
|
export RUSTFLAGS="-Ctarget-feature=+crt-static"
|
||||||
cd "$(dirname "${0}")/.."
|
cd "$(dirname "${0}")/.."
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# Automatically generated file; DO NOT EDIT.
|
# Automatically generated file; DO NOT EDIT.
|
||||||
# Linux/x86 6.7.5 Kernel Configuration
|
# Linux/x86 6.7.3 Kernel Configuration
|
||||||
#
|
#
|
||||||
CONFIG_CC_VERSION_TEXT="gcc (Debian 13.2.0-13) 13.2.0"
|
CONFIG_CC_VERSION_TEXT="gcc (Debian 13.2.0-13) 13.2.0"
|
||||||
CONFIG_CC_IS_GCC=y
|
CONFIG_CC_IS_GCC=y
|
||||||
@ -120,6 +120,7 @@ CONFIG_BPF_JIT=y
|
|||||||
CONFIG_BPF_JIT_ALWAYS_ON=y
|
CONFIG_BPF_JIT_ALWAYS_ON=y
|
||||||
CONFIG_BPF_JIT_DEFAULT_ON=y
|
CONFIG_BPF_JIT_DEFAULT_ON=y
|
||||||
CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
|
CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
|
||||||
|
CONFIG_USERMODE_DRIVER=y
|
||||||
# CONFIG_BPF_PRELOAD is not set
|
# CONFIG_BPF_PRELOAD is not set
|
||||||
# CONFIG_BPF_LSM is not set
|
# CONFIG_BPF_LSM is not set
|
||||||
# end of BPF subsystem
|
# end of BPF subsystem
|
||||||
@ -1199,8 +1200,9 @@ CONFIG_DEFAULT_CUBIC=y
|
|||||||
# CONFIG_DEFAULT_RENO is not set
|
# CONFIG_DEFAULT_RENO is not set
|
||||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||||
CONFIG_TCP_SIGPOOL=y
|
CONFIG_TCP_SIGPOOL=y
|
||||||
|
# CONFIG_TCP_AO is not set
|
||||||
CONFIG_TCP_MD5SIG=y
|
CONFIG_TCP_MD5SIG=y
|
||||||
CONFIG_IPV6=m
|
CONFIG_IPV6=y
|
||||||
CONFIG_IPV6_ROUTER_PREF=y
|
CONFIG_IPV6_ROUTER_PREF=y
|
||||||
CONFIG_IPV6_ROUTE_INFO=y
|
CONFIG_IPV6_ROUTE_INFO=y
|
||||||
# CONFIG_IPV6_OPTIMISTIC_DAD is not set
|
# CONFIG_IPV6_OPTIMISTIC_DAD is not set
|
||||||
@ -1237,7 +1239,7 @@ CONFIG_NET_PTP_CLASSIFY=y
|
|||||||
CONFIG_NETWORK_PHY_TIMESTAMPING=y
|
CONFIG_NETWORK_PHY_TIMESTAMPING=y
|
||||||
CONFIG_NETFILTER=y
|
CONFIG_NETFILTER=y
|
||||||
CONFIG_NETFILTER_ADVANCED=y
|
CONFIG_NETFILTER_ADVANCED=y
|
||||||
CONFIG_BRIDGE_NETFILTER=m
|
# CONFIG_BRIDGE_NETFILTER is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Core Netfilter Configuration
|
# Core Netfilter Configuration
|
||||||
@ -1245,7 +1247,7 @@ CONFIG_BRIDGE_NETFILTER=m
|
|||||||
CONFIG_NETFILTER_INGRESS=y
|
CONFIG_NETFILTER_INGRESS=y
|
||||||
CONFIG_NETFILTER_EGRESS=y
|
CONFIG_NETFILTER_EGRESS=y
|
||||||
CONFIG_NETFILTER_SKIP_EGRESS=y
|
CONFIG_NETFILTER_SKIP_EGRESS=y
|
||||||
CONFIG_NETFILTER_NETLINK=m
|
CONFIG_NETFILTER_NETLINK=y
|
||||||
CONFIG_NETFILTER_FAMILY_BRIDGE=y
|
CONFIG_NETFILTER_FAMILY_BRIDGE=y
|
||||||
CONFIG_NETFILTER_FAMILY_ARP=y
|
CONFIG_NETFILTER_FAMILY_ARP=y
|
||||||
CONFIG_NETFILTER_BPF_LINK=y
|
CONFIG_NETFILTER_BPF_LINK=y
|
||||||
@ -1404,7 +1406,6 @@ CONFIG_NETFILTER_XT_MATCH_NFACCT=m
|
|||||||
CONFIG_NETFILTER_XT_MATCH_OSF=m
|
CONFIG_NETFILTER_XT_MATCH_OSF=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_OWNER=m
|
CONFIG_NETFILTER_XT_MATCH_OWNER=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_POLICY=m
|
CONFIG_NETFILTER_XT_MATCH_POLICY=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
|
|
||||||
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
|
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
|
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
|
||||||
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
|
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
|
||||||
@ -1420,7 +1421,7 @@ CONFIG_NETFILTER_XT_MATCH_TIME=m
|
|||||||
CONFIG_NETFILTER_XT_MATCH_U32=m
|
CONFIG_NETFILTER_XT_MATCH_U32=m
|
||||||
# end of Core Netfilter Configuration
|
# end of Core Netfilter Configuration
|
||||||
|
|
||||||
CONFIG_IP_SET=m
|
CONFIG_IP_SET=y
|
||||||
CONFIG_IP_SET_MAX=256
|
CONFIG_IP_SET_MAX=256
|
||||||
CONFIG_IP_SET_BITMAP_IP=m
|
CONFIG_IP_SET_BITMAP_IP=m
|
||||||
CONFIG_IP_SET_BITMAP_IPMAC=m
|
CONFIG_IP_SET_BITMAP_IPMAC=m
|
||||||
@ -1589,7 +1590,8 @@ CONFIG_BRIDGE_EBT_REDIRECT=m
|
|||||||
CONFIG_BRIDGE_EBT_SNAT=m
|
CONFIG_BRIDGE_EBT_SNAT=m
|
||||||
CONFIG_BRIDGE_EBT_LOG=m
|
CONFIG_BRIDGE_EBT_LOG=m
|
||||||
CONFIG_BRIDGE_EBT_NFLOG=m
|
CONFIG_BRIDGE_EBT_NFLOG=m
|
||||||
# CONFIG_BPFILTER is not set
|
CONFIG_BPFILTER=y
|
||||||
|
CONFIG_BPFILTER_UMH=m
|
||||||
CONFIG_IP_DCCP=m
|
CONFIG_IP_DCCP=m
|
||||||
CONFIG_INET_DCCP_DIAG=m
|
CONFIG_INET_DCCP_DIAG=m
|
||||||
|
|
||||||
@ -1624,18 +1626,18 @@ CONFIG_L2TP=m
|
|||||||
CONFIG_L2TP_V3=y
|
CONFIG_L2TP_V3=y
|
||||||
CONFIG_L2TP_IP=m
|
CONFIG_L2TP_IP=m
|
||||||
CONFIG_L2TP_ETH=m
|
CONFIG_L2TP_ETH=m
|
||||||
CONFIG_STP=m
|
CONFIG_STP=y
|
||||||
CONFIG_MRP=m
|
CONFIG_MRP=y
|
||||||
CONFIG_BRIDGE=m
|
CONFIG_BRIDGE=y
|
||||||
CONFIG_BRIDGE_IGMP_SNOOPING=y
|
CONFIG_BRIDGE_IGMP_SNOOPING=y
|
||||||
CONFIG_BRIDGE_VLAN_FILTERING=y
|
CONFIG_BRIDGE_VLAN_FILTERING=y
|
||||||
# CONFIG_BRIDGE_MRP is not set
|
# CONFIG_BRIDGE_MRP is not set
|
||||||
# CONFIG_BRIDGE_CFM is not set
|
# CONFIG_BRIDGE_CFM is not set
|
||||||
# CONFIG_NET_DSA is not set
|
# CONFIG_NET_DSA is not set
|
||||||
CONFIG_VLAN_8021Q=m
|
CONFIG_VLAN_8021Q=y
|
||||||
# CONFIG_VLAN_8021Q_GVRP is not set
|
# CONFIG_VLAN_8021Q_GVRP is not set
|
||||||
CONFIG_VLAN_8021Q_MVRP=y
|
CONFIG_VLAN_8021Q_MVRP=y
|
||||||
CONFIG_LLC=m
|
CONFIG_LLC=y
|
||||||
CONFIG_LLC2=m
|
CONFIG_LLC2=m
|
||||||
# CONFIG_ATALK is not set
|
# CONFIG_ATALK is not set
|
||||||
# CONFIG_X25 is not set
|
# CONFIG_X25 is not set
|
||||||
@ -1773,7 +1775,7 @@ CONFIG_NET_FLOW_LIMIT=y
|
|||||||
# Network testing
|
# Network testing
|
||||||
#
|
#
|
||||||
CONFIG_NET_PKTGEN=m
|
CONFIG_NET_PKTGEN=m
|
||||||
# CONFIG_NET_DROP_MONITOR is not set
|
CONFIG_NET_DROP_MONITOR=y
|
||||||
# end of Network testing
|
# end of Network testing
|
||||||
# end of Networking options
|
# end of Networking options
|
||||||
|
|
||||||
@ -3360,6 +3362,7 @@ CONFIG_BCMA_POSSIBLE=y
|
|||||||
# CONFIG_MFD_SM501 is not set
|
# CONFIG_MFD_SM501 is not set
|
||||||
# CONFIG_MFD_SKY81452 is not set
|
# CONFIG_MFD_SKY81452 is not set
|
||||||
# CONFIG_MFD_SYSCON is not set
|
# CONFIG_MFD_SYSCON is not set
|
||||||
|
# CONFIG_MFD_TI_AM335X_TSCADC is not set
|
||||||
# CONFIG_MFD_LP3943 is not set
|
# CONFIG_MFD_LP3943 is not set
|
||||||
# CONFIG_MFD_TI_LMU is not set
|
# CONFIG_MFD_TI_LMU is not set
|
||||||
# CONFIG_TPS6105X is not set
|
# CONFIG_TPS6105X is not set
|
||||||
|
@ -676,13 +676,17 @@ impl XenClient {
|
|||||||
pub fn open_console(&mut self, domid: u32) -> Result<(File, File)> {
|
pub fn open_console(&mut self, domid: u32) -> Result<(File, File)> {
|
||||||
let dom_path = self.store.get_domain_path(domid)?;
|
let dom_path = self.store.get_domain_path(domid)?;
|
||||||
let console_tty_path = format!("{}/console/tty", dom_path);
|
let console_tty_path = format!("{}/console/tty", dom_path);
|
||||||
let tty = self
|
let mut tty: Option<String> = None;
|
||||||
.store
|
for _ in 0..5 {
|
||||||
.read_string_optional(&console_tty_path)?
|
tty = self.store.read_string_optional(&console_tty_path)?;
|
||||||
.unwrap_or("".to_string());
|
if tty.is_some() {
|
||||||
if tty.is_empty() {
|
break;
|
||||||
return Err(Error::TtyNotFound);
|
|
||||||
}
|
}
|
||||||
|
thread::sleep(Duration::from_millis(200));
|
||||||
|
}
|
||||||
|
let Some(tty) = tty else {
|
||||||
|
return Err(Error::TtyNotFound);
|
||||||
|
};
|
||||||
let read = OpenOptions::new().read(true).write(false).open(&tty)?;
|
let read = OpenOptions::new().read(true).write(false).open(&tty)?;
|
||||||
let write = OpenOptions::new().read(false).write(true).open(&tty)?;
|
let write = OpenOptions::new().read(false).write(true).open(&tty)?;
|
||||||
Ok((read, write))
|
Ok((read, write))
|
||||||
|
Reference in New Issue
Block a user