废话就不多说了,直接上干货。

关于{#mainpage}

FreeNOS(Free Niek 的操作系统)是一个实验性的基于微内核的操作系统,用于学习目的,用 C++ 编写。 您可以根据 GPLv3 的条款随意使用代码。
访问项目网站 http://www.FreeNOS.org 了解更多信息。

特征

  • Intel x86 (PC) 和 ARMv6/ARMv7 架构(Raspberry Pi 1,2,3, Allwinner H2+/H3)
  • 虚拟内存
  • 简单的任务调度
  • 进程间通信 (IPC)
  • 支持 MPI 的对称多处理(通过控制台和以太网)
  • 设备:
    • VGA/键盘控制台(也支持 Ed 的 libteken http://80386.nl/projects/libteken/)
    • i8250串行UART
    • PCI主机控制器
    • CMOS RTC 时钟
    • ATA主机控制器
    • 全志H2+/H3以太网控制器
    • 环回以太网控制器
  • 文件系统:
    • 虚拟文件系统 (VFS)
    • 临时文件系统 (TmpFS)
    • Linnenbank 文件系统 (LinnFS)
  • 网络(IP、UDP、ICMP、ARP)
  • POSIX、ANSI C 库
  • 动态和共享内存
  • 全自动自动测试仪
  • 使用 jenkins (http://www.jenkins.io) 和 Vagrant (http://www.vagrantup.com) 进行自动化持续集成
  • Doxygen 记录的所有来源 (http://www.doxygen.org/)
  • 用 C++ 从头开始​​编写的用户和内核代码
  • 非常小的微内核(约 2K 行 C++ 代码,包括汇编中的一小部分)
  • 在 POSIX 系统上使用最新的 GCC (http://gcc.gnu.org/)、LLVM (http://www.llvm.org/) 和 SCons (http://www.scons.org/) 版本构建

主机设置

首先安装所有必需的构建依赖项。 FreeNOS 需要 SCons,一个 C++ 编译器,而英特尔则需要一个生成 ISO 映像的工具。 按照以下说明在您的主机操作系统上安装构建依赖项。

Ubuntu
使用以下命令更新系统存储库缓存并安装所需的开发工具:

$ sudo apt-get update
$ sudo apt-get install build-essential scons genisoimage xorriso qemu-system binutils-multiarch u-boot-tools liblz4-tool

如果你的 Ubuntu 主机是 64 位的,你需要安装 GCC multilib 包来交叉编译 32 位架构:

$ sudo apt-get install gcc-multilib g++-multilib

或者,您也可以安装 LLVM/Clang 编译器:

$ sudo apt-get install clang

FreeBSD
使用以下命令更新系统存储库缓存并安装所需的开发工具:

% su -
# pkg update
# pkg install qemu scons cdrkit-genisoimage xorriso gcc u-boot-tools liblz4

在 FreeBSD 上,确保使用最新版本的 GNU 链接器(来自 pkg):

# mv /usr/bin/ld.bfd /usr/bin/ld.bfd.orig

构建 FreeNOS

要在您的主机操作系统上下载并提取已发布的源代码,请运行以下命令。 将 ‘x.x.x’ 替换为 FreeNOS 的版本:

$ wget http://www.FreeNOS.org/pub/FreeNOS/source/FreeNOS-x.x.x.tar.gz
$ tar zxf FreeNOS-x.x.x.tar.gz

要获取最新的开发源,您可以克隆 GIT 存档:

$ git clone https://github.com/nieklinnenbank/FreeNOS

要使用默认设置(Intel,使用 GCC 并启用调试)构建 FreeNOS,请运行:

$ scons

要使用控制台上打印的所有完整构建命令构建 FreeNOS,请将 VERBOSE 构建变量设置为 True:

$ scons VERBOSE=True

要在启用编译器优化的情况下构建 FreeNOS,请将 DEBUG 设置为 False。 请注意,这将使使用 GDB 进行调试更加困难:

$ scons DEBUG=False

除了在命令行上提供构建变量,您还可以更改目标的“build.conf”配置文件。 构建配置文件包含构建变量,例如目标的编译器标志和参数。 同样,“build.host.conf”文件包含主机操作系统程序的构建变量。 有关更多详细信息,请参阅示例 build.conf 和 build.host.conf 文件。

此外,在运行 scons 时,shell 中设置的任何环境变量都将自动转换为相同的构建变量。

要为 Raspberry Pi 2 构建,请复制示例构建配置文件并运行 SCons:

$ cp config/arm/raspberry2/build.conf .
$ scons

要清理构建目录,请使用:

$ scons -c

或者使用以下命令来删除临时 SCons 文件:

$ rm -rf build .sconf_temp .sconsign.dblite

Running FreeNOS

要在主机操作系统上运行 FreeNOS 的自动测试器,请运行:

$ scons test

要在 Qemu 下的 FreeNOS 上运行相同的自动测试器,请运行:

$ scons qemu_test

要在带有串行控制台的 Qemu 虚拟机中启动 FreeNOS,请使用以下命令:

$ scons qemu

要使用 GDB 调试 FreeNOS,您需要使用构建变量 DEBUG=True 进行构建。 调试符号必须在已编译的程序中可用,调试器需要在源代码、CPU 指令之间进行转换,反之亦然。 使用 DEBUG=True 禁用编译器优化,这会降低性能但改善调试体验。 默认情况下,DEBUG 构建变量已设置为 True。

如果您已将 build.conf 配置为 DEBUG=False,则可以在命令行上传递它(或编辑 build.conf 以将 DEBUG 设置为 True):

$ scons DEBUG=True

确保您的主机操作系统具有可用于调试目标架构(Intel 或 ARM)的 GDB。 对于 Ubuntu:

$ sudo apt-get install gdb-multiarch

打开两个终端。 在第一个终端中,在启用了内部 gdbserver 的 Qemu 中启动 FreeNOS:

$ scons qemu_debug

在第二个终端中,启动 GDB 并使用以下命令连接到 Qemu 内部 gdbserver:

$ gdb-multiarch ./build/intel/pc/kernel/intel/pc/kernel
(gdb) target remote localhost:1234

您现在可以使用标准 GDB 命令以交互方式调试英特尔的 FreeNOS 内核。 同样,您也可以调试用户程序 (./build/intel/pc/bin/XXX)。 请注意,在调试用户程序时,映射的虚拟内存会因调度而频繁更改。 当您在虚拟内存地址(例如函数)上设置断点时,可能会发生另一个程序被调度并在同一虚拟地址上执行而错误地触发断点。 为了只触发选定用户程序的断点,您可以在与进程名称匹配的断点上设置条件:

(gdb) condition 1 $_streq((char *)0xe0000000, "./server/datastore/server")

上面的命令在索引号为 1 的断点上设置了一个条件,表示它应该只在程序名称字符串等于“./server/datastore/server”时停止执行。

intel/pc

对于 Intel 目标,您还可以使用图形 VGA 控制台(使用 SDL)启动 Qemu:

$ scons qemu_sdl

要在真实硬件上测试 FreeNOS,请将引导 ISO 写入可引导设备,例如 USB 磁盘。 将 USB 磁盘插入主机操作系统并找到相应的设备名称:

$ fdisk -l

或者,使用 dmesg 命令查找设备名称。 使用以下命令写入引导 ISO,其中 sdX 是 USB 磁盘设备的名称。 注意:确保选择正确的设备以防止数据丢失:

$ sudo dd if=build/intel/pc/boot.iso of=/dev/sdX
$ sudo sync

将 USB 磁盘设备插入目标系统,并确保在计算机启动时选择它作为引导设备(例如通过 BIOS)。 您应该会看到 FreeNOS VGA 控制台。

arm/raspberry

要构建 FreeNOS 以在 Raspberry Pi 1 上运行,请使用提供的 build.conf 文件并重建系统:

$ cp config/arm/raspberry/build.conf .
$ scons

要在 Qemu 下为 raspberry pi 1 测试 FreeNOS,请将 QEMU_BUILD 构建变量设置为 True 来重建系统:

$ scons QEMU_BUILD=True
$ scons qemu

要使用 SD 卡在真正的 Raspberry Pi 上进行测试,请从 https://www.raspberrypi.org/downloads/raspbian/ 下载最新的 Raspbian ‘Lite’ 映像并解压缩。 将 SD 卡插入主机操作系统上的读卡器/写入器插槽,并使用以下命令找到适当的设备名称:

$ fdisk -l

或者,使用 dmesg 命令查找设备名称。 使用以下命令将 Raspbian 映像写入 SD 卡,其中 sdX 是 SD 卡设备的名称。 注意:确保选择正确的设备以防止数据丢失:

$ sudo dd if=/path/to/raspbian/image.img of=/dev/sdX
$ sudo sync

重新插入 SD 卡以将其自动安装在您的主机操作系统上。 使用(在 Ubuntu 上)将 FreeNOS raspberry pi 内核可执行文件复制到 Raspbian 映像上的“/boot”分区:

$ sudo cp build/arm/raspberry/kernel.img /media/boot/kernel.img
$ sudo sync
$ sudo umount /media/boot

您需要一根 USB 转 TTL 串行电缆来连接到 Raspberry Pi UART。 任何 USB 转 TTL 串行电缆都可以使用,例如 Adafruit USB 转 TTL 串行电缆:

https://www.adafruit.com/product/954

使用 GPIO 引脚将 USB 转串行电缆连接到 Raspberry Pi:

[ ] [ ]
[ ] [X]  Pin 4  (V5)     <---  Red (only needed if powered via USB)
[ ] [X]  Pin 6  (Ground) <---  Black
[ ] [X]  Pin 8  (RX)     <---  White
[ ] [X]  Pin 10 (TX)     <---  Green
[ ] [ ]
[ ] [ ]
[ ] [ ]
[ ] [ ]
[ ] [ ]

另请参阅 Adafruit 关于将串行电缆连接到 Raspberry Pi 的以下教程:

https://learn.adafruit.com/adafruits-raspberry-pi-lesson-5-using-a-console-cable/connect-the-lead

将您的 Raspberry Pi 连接到主机以通过 USB 或使用外部电源适配器为其供电。 在主机操作系统上,启动一个串行控制台客户端程序,例如 minicom 并将其连接到 USB 串行设备(波特率 115200):

$ minicom -D /dev/ttyUSB0

您现在应该看到 FreeNOS 控制台输出。

arm/raspberry2

遵循与上述 Raspberry Pi 1 相同的说明,但使用 Raspberry Pi 2 配置文件来构建 FreeNOS:

$ cp config/arm/raspberry2/build.conf .
$ scons

将内核可执行文件复制到 SD 卡“/boot”分区时,使用“kernel7.img”文件名确保 Raspberry Pi 引导加载程序正确启动内核(ARMv7):

$ cp build/arm/raspberry/kernel.img /media/boot/kernel7.img

此外,对于 raspberry pi 2 和更新版本,将以下内容添加到 /boot/config.txt 文件中,以确保第一个 UART 在 GPIO 引脚 8 和 10 上可用:

dtoverlay=pi3-miniuart-bt
enable_uart=1

arm/sunxi-h3

SD卡上的U-Boot

FreeNOS 支持带有 Allwinner H3 片上系统的 ARM 板,例如 Orange Pi PC 和 Orange Pi Zero(H2+ 是 H3 变体)。 要为 Allwinner H3 构建 FreeNOS,请复制提供的配置文件:

$ cp config/arm/sunxi-h3/build.conf .
$ scons

可以将 U-Boot 格式的内核映像复制到安装了 U-Boot 的 SD 卡:

$ cp build/arm/sunxi-h3/kernel/arm/sunxi-h3/kernel.ub /media/sdcard/kernel.ub

要在 SD 卡上安装 U-Boot 主线,请克隆源并为您的板选择正确的配置(Orange Pi PC:orangepi_pc_defconfig,Orange Pi zero:orangepi_zero_defconfig):

$ git clone https://gitlab.denx.de/u-boot/u-boot u-boot-git
$ cd u-boot-git
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make mrproper
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make orangepi_pc_defconfig

要更改默认配置,请使用以下命令进入 Kconfig 交互式编辑器:

$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make menuconfig

在构建之前,您需要选择以下配置项:

Device Tree Control > Provider for DTB for DT Control > Embedded DTB

要构建 U-Boot 二进制文件,只需使用不带任何参数的 make:

$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make

文件 u-boot-sunxi-with-spl.bin 现在可以写入 SD 卡:

$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdXXX bs=1024 seek=8 conv=notrunc

将 SD 卡插入目标板并连接 UART 控制台,在 U-Boot 交互式控制台中输入以下命令加载并启动 FreeNOS:

=> setenv bootm_boot_mode sec
=> fatload mmc 0:1 0x400fffc0 kernel.ub
14757888 bytes read in 670 ms (21 MiB/s)
=> bootm 0x400fffc0

You may also choose to download the FreeNOS kernel image via the network. To use a static IP address and server use:

=> setenv image kernel.ub
=> setenv image_addr 0x400fffc0
=> setenv bootm_boot_mode sec
=> setenv ipaddr 172.16.10.120
=> setenv serverip 172.16.10.1
=> tftp $image_addr $serverip:$image
=> bootm $image_addr

要使用 DHCP 检索 IP 地址,请在下载和引导之前使用“dhcp”命令:

=> setenv bootm_boot_mode sec
=> dhcp
=> tftp 0x400fffc0 kernel.ub
=> bootm 0x400fffc0

U-Boot on SPI Flash

或者,Orange Pi Zero 板包含一个小型 SPI 闪存,也可用于安装 U-Boot。 这可以通过 USB 的特殊 FEL 模式使用 Allwinner Sunxi 工具来完成。 首先克隆并构建 sunxi-tools:

$ git clone https://github.com/linux-sunxi/sunxi-tools
$ cd sunxi-tools

通过 USB 电缆将您的开发板连接到您的 PC 并验证 FEL 模式是否有效:

$ sunxi-fel ver

使用前面的步骤构建 U-Boot 后,将 U-Boot 二进制文件写入闪存:

$ ./sunxi-fel -v -p spiflash-write 0 ../u-boot/u-boot-sunxi-with-spl.bin

通过此更改,板将不再进入 FEL 模式。 为了重新写入 SPI 闪存,您可以使用 Armbian 擦除闪存。 在 https://www.armbian.com/orange-pi-zero/ 下载 Orange Pi Zero 的最新 Armbian 映像。 挂载映像并编辑文件 /boot/armbianEnv.txt。 添加以下条目以启用 /dev/mtd0:

spi-jedec-nor
param_spinor_spi_bus=0

从修改后的 Armbian 映像启动板并运行以下命令以擦除 SPI 闪存:

$ sudo apt-get install mtd-utils
$ sudo flash_erase /dev/mtd0 0 0200000

U-Boot on Qemu/TFTP

使用 U-Boot 测试引导过程的另一种方法是使用 Qemu。 您可以通过 Qemu 启动 U-Boot 作为要使用 -kernel 加载的内核,并为 -netdev 提供 tftp= 参数以启用 Qemu 中的集成 TFTP 服务器。 以下命令可用于通过 TFTP 下载 FreeNOS 映像并启动它:

$ qemu-system-arm -M orangepi-pc -kernel /path/to/u-boot/u-boot -nographic \-net nic,id=net0 -netdev user,id=hub0port0,tftp=/path/to/FreeNOS/
...
=> setenv bootm_boot_mode sec
=> dhcp
=> tftp 0x400fffc0 build/arm/sunxi-h3/kernel/arm/sunxi-h3/kernel.ub
=> bootm 0x400fffc0

Using FreeNOS

当 FreeNOS 启动时,系统将打印启动输出并显示系统登录提示。 目前登录将接受任何用户名值并且不要求输入密码。 FreeNOS 交互式控制台提示符如下所示:

(localhost) / #

FreeNOS 具有类似 UNIX 的界面,您可以输入 /bin 目录中的任何可用命令:

(localhost) / # ls bin

例如,“ps”命令打印系统中运行的所有进程的列表:

(localhost) / # ps

您还可以使用以下命令在 Qemu 或真实硬件上运行全自动自动测试器:

(localhost) / # /test/run

要查看有关 FreeNOS 版本和硬件设置的一些信息,您可以使用“sysinfo”命令:

(localhost) / # sysinfo

提示符中的“/”表示当前活动目录。 使用 ‘cd’ 内置 shell 命令更改它:

(localhost) / # cd /tmp
(localhost) /tmp #

FreeNOS shell 有几个内置命令,使用 ‘help’ 命令查看所有内置 shell 命令:

(localhost) / # help

Allwinner H2+/H3 板上的 FreeNOS 支持联网。 您可以通过以下方式查看网络堆栈的当前状态:

(localhost) / # netctl

要分配静态 IP 地址,您可以在相应设备中写入 IPV4 地址文件:

(localhost) / # write /network/sun8i/ipv4/address 172.16.10.90

要通过 DHCP 获取地址,您可以使用以下命令启动 DHCP 客户端:

(localhost) / # dhcpc sun8i

当设备具有有效的 IPV4 地址时,您可以使用以下方式发送 ICMP ping:

(localhost) / # netping -i sun8i 172.16.10.1

用于计算素数的示例应用程序是 /bin/prime 命令。 要让它计算最多 1024 的所有素数并输出素数结果,请使用:

(localhost) / # prime --stdout 1024

prime 命令还有一个称为“mpiprime”的多核变体变体,它使用消息传递接口 (MPI) 库。 mpiprime 程序可以使用多个内核并行计算素数。 要通过控制台运行它并让 shell 测量所用时间:

(localhost) / # time mpiprime 2000000

您可以将时间结果与计算相同数量素数的单核程序的时间进行比较:

(localhost) / # time prime 2000000

此外,可以在 Allwinner H2+/H3 (arm/sunxi-h3) 目标上通过网络在运行 FreeNOS 的多个节点上启动 MPI 程序。 您可以通过启动相应的 MPI 程序来做到这一点,该程序在您的主机操作系统上编译并使用 MPI 库主机代码通过以太网与远程节点进行通信。 您需要提供指定 IP 地址和核心标识符列表的配置文件。 例如,查看配置为使用本地 Qemu 程序进行测试的文件 config/host/mpihosts.txt。 使用以下命令启动启用 MPI 的 QEMU 实例:

$ scons qemu_mpi

在另一个终止中,启动与 Qemu 实例通信的 MPI ping 测试程序:

$ ./build/host/bin/mpiping/mpiping ./config/host/mpihosts.txt

您还可以通过网络启动主程序的 MPI 变体:

$ ./build/host/bin/mpiprime/mpiprime ./config/host/mpihosts.txt 3000000

为您自己的配置文件提供任意 IP 地址列表,以便在您自己的计算集群上运行 MPI 程序。

Jenkins持续集成

用 Vagrant 自动化

FreeNOS 持续集成的安装和配置使用 Vagrant (https://www.vagrantup.com/) 完全自动化。 Vagrant 是一个开源程序,它可以自动创建和配置各种后端的虚拟机,例如 Virtual Box 和 libvirt / KVM。 FreeNOS 提供了一些脚本文件,Vagrant 可以使用这些文件自动创建 Jenkins 主节点和从节点,配置它们并开始构建作业。
从官方网站 https://www.vagrantup.com/ 或通过您的操作系统包管理器安装 Vagrant。 例如,在 Ubuntu Linux 上:

$ sudo apt-get install vagrant

Vagrant 必须有一个后端虚拟机管理程序来运行实际的虚拟机。 这可以使用任何支持的后端来完成,例如 VirtualBox 或 libvirt/KVM。 有关如何为您的 VM 后端设置 Vagrant 的完整详细信息,请访问:https://www.vagrantup.com/docs/installation/。
要在 Ubuntu Linux 上使用 Vagrant 安装和使用 libvirt / KVM,首先确保在计算机的 BIOS 中启用了处理器的硬件虚拟化扩展。 之后,使用以下命令安装 libvirt、KVM 和 Vagrant libvirt 支持:

$ sudo apt-get install vagrant-libvirt libvirt-bin libvirt-dev qemu-kvm qemu-utils qemu

On Ubuntu 20.04:

$ sudo apt-get install libvirt-clients libvirt-daemon-system qemu-kvm vagrant-libvirt

将自己添加到 libvirt 用户组以使用 libvirt 安装:

$ sudo usermod -a -G libvirt my_userid

测试带有 KVM 的 libvirt 是否正常工作:

$ virsh list

如果您没有收到任何错误,则说明带有 KVM 的 libvirt 应该可以正常工作。
要启动主机,安装它并启动 jenkins,使用:

$ cd /path/to/FreeNOS
$ cd support/jenkins
$ vagrant up master

安装完成后,在 http://localhost:8888/ 打开您的网络浏览器以使用 Jenkins。 默认用户名和密码为:admin、admin。

要启动 Ubuntu 从站,请使用:

$ vagrant up ubuntu1804

同样,使用以下命令启动 FreeBSD 12.0 从站:

$ vagrant up freebsd12

当您希望自动启动所有机器、安装和配置它们并自动运行作业时,只需使用以下命令。 请注意,这将消耗大量 CPU 和 RAM:

$ vagrant up

对 FreeNOS 代码进行更改后,可以通过再次配置从属服务器来重新运行 jenkins 作业:

$ vagrant provision freebsd12
$ vagrant provision ubuntu1804

这将确保从站完全更新到最新的操作系统和编译器,并为所有可用配置运行 Jenkins 作业。
使用 Vagrant 的 windows 用户注意:不要在 git 中将 core.autocrlf 设置为 true,否则源文件将添加 \r\n 字符,导致 bash 脚本出错。

Jenkins Master (Manual Install)

以下部分描述了如何在您的主机操作系统上手动安装 Jenkins 以实现 FreeNOS 的持续集成。 使用您最喜欢的包管理器或从官方网站 (https://jenkins.io/) 在您的主机操作系统上安装 Jenkins。 按照安装向导的说明进行操作,安装后转到 Jenkins Web 界面:http://localhost:8080

安装后,导航到: 管理 Jenkins > 管理插件 确保安装了以下插件。 从“可用”选项卡中选择插件以查找尚未安装的插件:

  • Matrix Project Plugin (https://wiki.jenkins-ci.org/display/JENKINS/Matrix+Project+Plugin)
  • Matrix Combinations Plugin (https://wiki.jenkins-ci.org/display/JENKINS/matrix+combinations+plugin)
  • Node and Label Parameter Plugin (https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin)
  • Libvirt Slaves Plugin (https://wiki.jenkins.io/display/JENKINS/Libvirt+Slaves+Plugin)
  • SSH Plugin (https://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin)
  • Workspace Cleanup Plugin (https://wiki.jenkins-ci.org/display/JENKINS/Workspace+Cleanup+Plugin)
    完成 Jenkins 配置后,在您的主机操作系统上安装 KVM 和 Libvirt。 对于 Ubuntu 使用:
$ sudo apt-get install qemu-kvm libvirt-bin virtinst

通过 SSH 将 Jenkins 连接到 libvirt,导航到:Manage Jenkins > Configure System 选择“添加新云”并选择“Hypervisor Type”:QEMU,“Hypervisor Host”:localhost 并选择所需的 SSH 用户名。
按“高级”选择身份验证参数并按“测试连接”以验证 Jenkins 可以通过 SSH 访问 libvirt。 对于 Ubuntu,您需要确保 SSH 用户位于“kvm”和“libvirtd”组中:

$ sudo usermod -a -G kvm,libvirtd jenkins

Jenkins 需要通过主机名找到 KVM 来宾。 您可以在 /etc/hosts 文件中手动配置 DNS 主机名到 IP 转换,也可以使用内部 libvirt DNSMasq 服务器自动配置。

要在 KVM 中设置自动 DNS 转换,首先编辑 ‘default’ libvirt 网络接口以添加 ‘.kvm’ 仅限本地域:

$ virsh net-edit default

在 … 标签内添加以下行:

<domain name='kvm' localOnly='yes'/>

要在您的主机上使用 libvirt 内部 DNSMasq 服务器,您可以更改 /etc/resolv.conf 文件以添加以下内容:

nameserver 192.168.122.1

如果您的主机操作系统使用 NetworkManager 进行联网,请添加以下文件:

$ sudo -s
# cat > /etc/NetworkManager/conf.d/localdns.conf
[main]
dns=dnsmasq
# cat > /etc/NetworkManager/dnsmasq.d/libvirt_dnsmasq.conf
server=/kvm/192.168.122.1

确保所有 KVM 来宾都在 .kvm 域中设置了主机名(例如 someguest.kvm)。 重新启动 libvirt 和可选的 NetworkManager 以应用更改:

$ sudo /etc/init.d/libvirt-bin restart
$ sudo /etc/init.d/NetworkManager restart

您现在应该能够在 .kvm 域中的来宾启动后解析它们的主机名,例如:

$ virsh start ubuntu-1804
$ host ubuntu-1804.kvm

另请访问以下页面,了解有关 KVM 自动 DNS 设置的更多详细信息:https://liquidat.wordpress.com/2017/03/03/howto-automated-dns-resolution-for-kvmlibvirt-guests-with-a-local-domain/

FreeBSD 12.0 Slave (Manual Install)

从 FreeNOS 源运行 ./support/jenkins/freebsd-12.sh 中的示例安装脚本,以使用 FreeBSD 12.0 设置 KVM 来宾。 另请参阅安装脚本中的注释以获取更多信息:

jenkins@host$ cd support/jenkins
jenkins@host$ ./freebsd-12.sh

要在 Jenkins 中配置 FreeBSD 12.0 从站以构建 FreeNOS,首先需要确保 Jenkins 用户可以使用 SSH 登录到从站。 或者,您可以使用公钥身份验证对其进行配置:

jenkins@host$ virsh start freebsd-12
jenkins@host$ ssh-keygen
jenkins@host$ ssh-copy-id jenkins@freebsd-12.kvm

测试 Jenkins 用户是否可以使用 SSH(通过密码或密钥)登录到 FreeBSD KVM 来宾:

jenkins@host$ ssh jenkins@freebsd-12.kvm

将示例节点配置 XML 文件复制到 Jenkins 安装目录:

jenkins@host$ mkdir /var/lib/jenkins/nodes/freebsd-12-test
jenkins@host$ cp freebsd-12.node.xml /var/lib/jenkins/nodes/freebsd-12-test/config.xml

还将作业配置 XML 文件复制到 Jenkins 安装目录:

jenkins@host$ mkdir /var/lib/jenkins/jobs/FreeNOS-freebsd12-test
jenkins@host$ cp freebsd-12.job.xml /var/lib/jenkins/jobs/FreeNOS-freebsd12-test/config.xml

重启 Jenkins 服务器以使用新的配置文件:

$ sudo /etc/init.d/jenkins restart

Jenkins 仍然需要身份验证凭据才能连接到从站。 导航:

Manage Jenkins > Manage Nodes > freebsd-12 > Configure

在子菜单“辅助启动方法”中,在“通过 SSH 启动代理”下,选择现有的 SSH 凭据让 jenkins 使用它来登录从节点或使用“添加”按钮添加新凭据。 如果您在主机操作系统上为 jenkins 用户生成了 SSH 密钥,请插入 SSH 私钥或提供用户名/密码。
按“保存”按钮完成并使用“启动代理”测试连接。
您现在可以按“FreeNOS-freebsd12”构建作业上的“调度构建”按钮进行测试。

Ubuntu 18.04 Slave

遵循与上述 FreeBSD 12.0 Slave 相同的说明,只需将 slave 名称替换为 ‘ubuntu-1804’。

Authors

The FreeNOS code has been written from scratch by Niek Linnenbank. People who contributed to FreeNOS are:

  • Dan Rulos (AmayaOS)
  • Coen Bijlsma (libparse, srv/time)
  • Ed Schouten (libteken)
  • Alexander Schrijver (OpenBSD patches)

FreeNOS--项目的README相关推荐

  1. DuangDuangDuang!码云项目的 Readme.md 特殊技能

    为什么80%的码农都做不了架构师?>>>    我们在 码云 上创建新项目的时候,常常会看到默认使用 README 文件初始化该项目(如图1 所示),然后在新建项目的根目录下就会生成 ...

  2. md 生成目录 码云_DuangDuangDuang!码云项目的 Readme.md 特殊技能

    原标题:DuangDuangDuang!码云项目的 Readme.md 特殊技能 我们在 码云 上创建新项目的时候,常常会看到默认使用 README 文件初始化该项目(如图1 所示),然后在新建项目的 ...

  3. Web高效管理多个项目的SVN仓库

    转至:https://www.jianshu.com/p/a0af00642585 采用方案 Linux+Apache+Subversion+MySQL+JDK+Tomcat+Svnadmin 目录 ...

  4. 2021年新项目的Python最佳实践

    介绍 本教程的目标是描述Python开发生态系统.对于从另一种编程语言来使用Python的人来说,这是很有帮助的. 他们说你应该坚持算法和数据结构,你可以在几周内学习一门新的语言,这只是一种新的语法. ...

  5. 手动将web项目的class文件打成jar包,手动打jar包,java -cvf,IDE打包底层指令

    手动将web项目的class文件打成jar包. 我们的项目在使用IDE进行编译后,在项目的target目录下将会生成class文件.我们可以将class文件打成jar包. 使用的到命令为: 在targ ...

  6. SVN优化(一) SVN忽略maven项目的target

    SVN优化(一) SVN忽略maven项目的target 一 eclipse刚开始导入的项目: 二  解决办法 方式一: 在项目代码路径,如: F:\xyx\sl  鼠标右键,"Tortoi ...

  7. 管理多供应商物联网项目的10个关键步骤

    管理多供应商物联网项目的10个关键步骤 10 critical steps for managing a multi-vendor IoT project 一旦您决定创建一个成功的端到端物联网应用开发 ...

  8. 我是如何做软件测试项目的?

    最近公司刚完成了一个比较大的项目-单品页模块化,即使用现在比较流行的Twitter Bootstrap进行前端开发.说其大是因为工作量大,开发前期投入约80人日,包括前端开发及PHP开发,且不包括修复 ...

  9. [笔记]解决m2eclipse给项目添加maven依赖管理时可能不给项目的build path...

    为什么80%的码农都做不了架构师?>>>    解决办法:在m2eclipse提供的菜单里关闭项目的Maven依赖管理,然后再启动Maven的依赖管理!!! 检查:1)查看项目的.c ...

  10. 比尔盖茨是这样审查项目的 2

    比尔盖茨是这样审查项目的  2 --选自<软件随想录:程序员部落酋长Joel谈软件> [续]http://blog.csdn.net/turingbooks/archive/2009/12 ...

最新文章

  1. 批处理如何做到等待用户输入一个值(dos命令行)
  2. C语言基本数据结构之五(折半插入,堆排序,冒泡排序,快速排序,并归排序)
  3. linux下C语言套接字编程sockaddr和sockaddr_in的区别
  4. Android 学习笔记 BroadcastReceiver广播...
  5. 数据挖掘领域十大经典算法初探
  6. KVM console 串口连接虚拟机
  7. php 有indexof函数吗,详解PHP处理字符串类似indexof的方法函数
  8. 一天学完spark的Scala基础语法教程教程三、循环结构(idea版本)
  9. SAP CRM呼叫中心的邮件发送实现 - Function module CRM_EMAIL_SEND_EMAIL
  10. 数据科学家 数据工程师_数据科学家实际上赚了多少钱?
  11. Python查杀Windows系统中指定进程
  12. 黑龙江省计算机应用能力考试,2020黑龙江省一级计算机基础及MS Office应用考试在线自测试题库(不限设备,登陆即可做题)...
  13. 数资 | 已知现期量如何求出增长量?
  14. POJ-1637 混合图欧拉回路-网络流求解
  15. 学计算机做纸质笔记,详细图文教你康奈尔大学推荐的超级笔记法,只要一张A4纸张,你也可以做学霸...
  16. 改变世界前,先改变自己
  17. python绘制缓和曲线_CAD中缓和曲线的画法 - AutoCAD基础应用 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  18. 在matlab中怎么限定值域,matlab中如何限定wgn函数的值域
  19. redis文件事件和时间事件
  20. 2015第六届蓝桥杯 C/C++C组真题及题解

热门文章

  1. Kafka Topic分区手动迁移:kafka-reassign-partitions
  2. NetSuite 合并报表之外币折算差异(CTA)
  3. 有符号数和无符号数在计算机中怎么区分?
  4. 政府主办!百万奖金!大厂offer!山东省数据应用创新创业大赛等你来!
  5. Azure核心服务(VM)——>创建windows虚拟机并在此之上部署一个cms网站
  6. 什么是肿瘤免疫逃逸?
  7. 架构师修炼系列【业务高可用】
  8. 数据分析师必备技能之埋点
  9. 15.模拟e^x的麦克劳林展开式
  10. 渗透测试--medium_socnet