4.4. openMosix 一般说明

4.4.1. 内核编译

始终使用来自 https://linuxkernel.org.cn/ 的纯净原始内核源代码来编译 openMosix 内核! 请尽量使用离您最近的镜像下载内核,并始终尝试下载您已拥有的最新内核源代码的补丁,而不是下载整个内核。 Linux 社区将非常感谢这一点,并且将大大增加您的极客 Karma ;-) 请务必使用与内核版本相对应的正确的 openMosix 补丁。 在我写这篇文章时,最新的 2.4 内核是 2.4.20,因此您应该下载 openMosix-2.4.20-x.gz 补丁,其中 "x" 代表补丁修订版(即:修订号越大,它就越新)。 请勿使用任何 Linux 发行版附带的内核:它将无法工作。 这些内核源代码已被发行版制作者大量修补,因此,将 openMosix 补丁应用于这样的内核肯定会失败! 我经历过,相信我 ;-)

下载 openMosix 补丁的实际版本,并将其移动到您的内核源代码目录中(例如 /usr/src/linux-2.4.20)。 如果您的内核源代码目录不是 "/usr/src/linux-[版本号]",则至少需要创建一个指向 "/usr/src/linux-[版本号]" 的符号链接。 假设您是 root 用户,并且已将 gzip 压缩的补丁文件下载到您的主目录中,请使用 patch 实用程序应用补丁(猜猜是什么?)

mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20
cd /usr/src/linux-2.4.20
zcat openMosix-2.4.20-2.gz | patch -Np1
在极少数情况下,如果您的系统上没有 "zcat",请执行
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20
cd /usr/src/linux-2.4.20
gunzip openMosix-2.4.20-2.gz
cat openMosix-2.4.20-2 | patch -Np1
如果更奇怪的情况是您的系统上没有 "cat" (!),请执行
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20
cd /usr/src/linux-2.4.20
gunzip openMosix-2.4.20-2.gz
patch -Np1 < openMosix-2.4.20-2
"patch" 命令现在应该显示内核源代码中已修补文件的列表。 如果您足够有冒险精神,请在内核配置文件中启用与 openMosix 相关的选项,例如
...
CONFIG_MOSIX=y
# CONFIG_MOSIX_TOPOLOGY is not set
CONFIG_MOSIX_UDB=y
# CONFIG_MOSIX_DEBUG is not set
# CONFIG_MOSIX_CHEAT_MIGSELF is not set
CONFIG_MOSIX_WEEEEEEEEE=y
CONFIG_MOSIX_DIAG=y
CONFIG_MOSIX_SECUREPORTS=y
CONFIG_MOSIX_DISCLOSURE=3
CONFIG_QKERNEL_EXT=y
CONFIG_MOSIX_DFSA=y
CONFIG_MOSIX_FS=y
CONFIG_MOSIX_PIPE_EXCEPTIONS=y
CONFIG_QOS_JID=y
...
但是,如果您使用 Linux 内核配置工具之一配置上述选项,将会容易得多
make config | menuconfig | xconfig
上述意味着您必须选择 "config"、"menuconfig" 和 "xconfig" 之一。 这只是个人口味问题。 顺便说一句,"config" 将在任何系统上工作; "menuconfig" 需要安装 curses 库,而 "xconfig" 需要安装 X-window 环境以及 TCL/TK 库和解释器。

现在使用以下命令编译它

make dep bzImage modules modules_install
编译后,在您的引导加载程序中安装带有 openMosix 选项的新内核; 例如,在 /etc/lilo.conf 中为新内核插入一个条目,然后运行 lilo。

重新启动,您的 openMosix 集群节点就启动了!

4.4.2. /etc/openmosix.map 文件的语法

在启动 openMosix 之前,必须有一个 /etc/openmosix.map 配置文件,该文件在每个节点上必须相同。

标准现在是 /etc/openmosix.map,/etc/mosix.map 和 /etc/hpc.map 是旧标准,但工具的 CVS 版本是向后兼容的,并查找 /etc/openmosix.map、/etc/mosix.map 和 /etc/hpc.map(按该顺序)。

openmosix.map 文件包含三个空格分隔的字段

openMosix-Node_ID               IP-Address(or hostname)          Range-size
一个 openmosix.map 文件示例可能如下所示
1       node1   1
2       node2   1
3       node3   1
4       node4   1
1       192.168.1.1     1
2       192.168.1.2     1
3       192.168.1.3     1
4       192.168.1.4     1
或借助 range-size,以上两个示例都等同于
1       192.168.1.1     4
openMosix 根据其 openMosix-Node_ID "向上计数" 节点的 IP 地址的最后一个字节。 当然,如果您使用的 range-size 大于 1,则必须使用 IP 地址而不是主机名。

如果一个节点有多个网络接口,则可以使用 range-size 字段中的 ALIAS 选项进行配置(相当于将 range-size 设置为 0),例如

1       192.168.1.1     1
2       192.168.1.2     1
3       192.168.1.3     1
4       192.168.1.4     1
4       192.168.10.10   ALIAS
在这里,openMosix-Node_ID 为 4 的节点有两个网络接口 (192.168.1.4 + 192.168.10.10),这两个接口对 openMosix 都是可见的。

始终确保在您的集群的每个节点上运行相同的 openMosix 版本和配置!

在每个节点上使用 "setpe" 实用程序启动 openMosix

setpe -w -f /etc/openmosix.map
在您的 openMosix 集群中的每个节点上执行此命令(将在本 HOWTO 的后面部分描述)。

或者,您可以获取 "openmosix" 脚本,该脚本可以在 userspace-tools 的 scripts 目录中找到,将其复制到 /etc/init.d 目录,chmod 0755 它,然后以 root 身份使用以下命令

/etc/init.d/openmosix stop
/etc/init.d/openmosix start
/etc/init.d/openmosix restart

安装现已完成:集群已启动并正在运行 :)

4.4.3. oMFS

首先,必须在内核配置中启用 CONFIG_MOSIX_FS 选项。 如果当前内核在编译时未启用此选项,则需要重新编译并启用此选项。

此外,集群节点文件系统上的 UID(用户 ID)和 GID(组 ID)必须相同。 您可能希望使用 openldap 来完成此操作。 内核中的 CONFIG_MOSIX_DFSA 选项是可选的,但如果应该使用 DFSA,则当然是必需的。 要在集群上挂载 oMFS,每个节点的 /etc/fstab 中都必须有一个额外的 fstab 条目。

为了启用 DFSA

mfs_mnt         /mfs            mfs     dfsa=1          0 0
为了禁用 DFSA
mfs_mnt          /mfs           mfs     dfsa=0          0 0
此 fstab 条目的语法是
[device_name]           [mount_point]   mfs     defaults        0 0
在每个节点上挂载 /mfs 挂载点后,每个节点的文件系统都将通过 /mfs/[openMosix-Node_ID]/ 目录访问。

借助一些符号链接,所有集群节点都可以访问相同的数据,例如 node1 上的 /work

on node2 :      ln -s /mfs/1/work /work
on node3 :      ln -s /mfs/1/work /work
on node3 :      ln -s /mfs/1/work /work
...
现在每个节点都可以从 /work 读取和写入!

以下特殊文件从 oMFS 中排除

创建如下链接

ln -s /mfs/1/mfs/1/usr         
ln -s /mfs/1/mfs/3/usr
是无效的。

以下系统调用在 DFSA 挂载的文件系统上运行时,无需将迁移的进程(在其主(远程)节点上执行此调用)返回到其主节点

read, readv, write, writev, readahead, lseek, llseek, open, creat, close, dup, dup2, fcntl/fcntl64, getdents, getdents64, old_readdir, fsync, fdatasync, chdir, fchdir, getcwd, stat, stat64, newstat, lstat, lstat64, newlstat, fstat, fstat64, newfstat, access, truncate, truncate64, ftruncate, ftruncate64, chmod, chown, chown16, lchown, lchown16, fchmod, fchown, fchown16, utime, utimes, symlink, readlink, mkdir, rmdir, link, unlink, rename

以下是在 DFSA 挂载的文件系统上系统调用可能无法工作的情况

除了 /mfs/1/、/mfs/2/ 等文件之外,您还将找到一些其他目录。

表 4-1. 其他目录

/mfs/here您的进程当前运行的节点
/mfs/home您的主节点
/mfs/magic由 "creat" 系统调用(或带有 "O_CREAT" 选项的 "open")使用时的当前节点 - 否则,是上次成功创建 oMFS magic 文件的节点(这对于创建临时文件,然后立即取消链接它们非常有用)
/mfs/lastexec进程上次成功发出 "execve" 系统调用的节点。
/mfs/selected您通过进程自身或其祖先之一(在 fork 此进程之前)选择的节点,将数字写入 "/proc/self/selected"。

请注意,这些 magic 文件都是“per process”的。 也就是说,它们的内容取决于哪个进程打开它们。

关于 openMFS 的最后一点说明是,有些版本在您在这些文件系统上运行 "df" 时会返回错误的结果。 如果您突然在这些系统上拥有大约 1.3 TB 的可用空间,请不要感到惊讶。