This document provides a quick guide on using \texttt{link.py} to create and manage virtual Ethernet (veth) pairs in Incus containers. Veth pairs are useful for creating network connections between different network namespaces, such as those used by containers.
\section*{Requirements}
\begin{itemize}
\item\textbf{Python} (preferably version 3.x)
\item\textbf{Root privileges}: Run \texttt{link.py} with \texttt{sudo} to ensure the necessary permissions.
\item\textbf{Incus installed} and properly configured on your system.
\item\textbf{Running containers}: Ensure that the Incus containers you want to connect are running.
\end{itemize}
\section*{Basic Usage}
The general syntax to run \texttt{link.py} is as follows:
\begin{lstlisting}[language=bash]
sudo python link.py \
-ns1 <namespace1> -t1 <type1> \
-ns2 <namespace2> -t2 <type2> \
-n1 <veth1> -n2 <veth2> \
[-b1 <bridge1>] [-b2 <bridge2>]
\end{lstlisting}
\begin{itemize}
\item\texttt{-ns1}, \texttt{-ns2}: Names of the network namespaces or containers.
\item\texttt{-t1}, \texttt{-t2}: Container type (use \texttt{incus} for Incus containers).
\item\texttt{-n1}, \texttt{-n2}: Names of the veth interfaces.
\item\texttt{-b1}, \texttt{-b2} (optional): Attach veth to a specified bridge on either end.
\end{itemize}
\section*{Example Commands}
\subsection*{Example 1: Connect Host and Incus Container}
Connect the host network namespace to an Incus container's network namespace.
\begin{lstlisting}[language=bash]
sudo python link.py \
-ns1 my_incus_container -t1 incus \
-n1 veth_container -n2 veth_host
\end{lstlisting}
\subsection*{Example 2: Connect Two Incus Containers}
Create a veth pair connecting two Incus containers.
\begin{lstlisting}[language=bash]
sudo python link.py \
-ns1 incus_container1 -t1 incus \
-ns2 incus_container2 -t2 incus \
-n1 veth1 -n2 veth2
\end{lstlisting}
\subsection*{Example 3: Attach Host End to a Bridge}
Create a veth pair between the host and an Incus container, attaching the host end to a bridge named \texttt{br0}.
\begin{lstlisting}[language=bash]
sudo python link.py \
-ns1 my_incus_container -t1 incus \
-n1 veth_container -n2 veth_host \
-b2 br0
\end{lstlisting}
\section*{Notes}
\begin{itemize}
\item If \texttt{'1'} is specified for \texttt{-ns1} or \texttt{-ns2}, it defaults to the host namespace.
\item Ensure bridges exist before attempting to attach veth pairs to them.
\item The script automatically brings up interfaces and bridges after creation.
\end{itemize}
\section*{Testing Connectivity}
Assign IP addresses to each end of the veth pair for testing connectivity. Example commands:
\begin{lstlisting}[language=bash]
# On the host
sudo ip addr add 192.168.10.1/24 dev veth_host
# Inside the Incus container
sudo incus exec my_incus_container -- ip addr add 192.168.10.2/24 dev veth_container
# Test with ping
ping 192.168.10.2
\end{lstlisting}
\section*{Troubleshooting}
\begin{itemize}
\item\textbf{Permission errors}: Ensure you're running the script with \texttt{sudo}.
\item\textbf{Interface not found}: Verify that the interface names are unique and do not conflict with existing interfaces.
\item\textbf{Container not found}: Check that the Incus container names are correct and that they are running.