通过 SSH 卸载编译?

通过 SSH 卸载编译?

我有一台被破解的 Chromebook,我在上面运行 Gentoo。当我尝试编译时任何事物,CPU 使用率飙升至 100%,温度升高约 10 摄氏度,电池使用率激增(4.XW -> 10 W),这是一个缓慢的过程。但我还有一台正在运行的 Arch Linux 计算机,我可以通过 SSH 连接到它。它们都是 x86_64 CPU。有什么方法可以通过 SSH 将内容(Linux 内核、日常软件包等)的编译卸载到 Arch Linux 机器上吗?我以前没有做过这样的事情。可能需要交叉编译吗?

答案1

不,您不必交叉编译(如果您针对的是另一个体系结构,则这是必要的。)我可以想到两种方法来设置您的系统来执行此操作:

  1. 使用distcc。这根图拱门维基很好地描述了如何安装和配置程序,所以我不会在这里复制整个内容。简而言之,您需要进行以下设置才能使其正常工作:

    • CFLAGS/etc/portage/make.conf 一定不使用march=nativemtune=native,因为远程计算机将使用其“本机”CPU 的概念,而不是本地计算机的。如果您使用“native”,请找出要使用的标志通过运行:

      $ gcc -v -E -x c -march=native -mtune=native - < /dev/null 2>&1 | grep cc1 | perl -pe 's/^.* - //g;'
      
    • 两台计算机需要相同的编译器和 binutils 版本。

    • 两台计算机都需要distcc安装、配置和运行。
  2. 使用chrootArch 系统上的环境和 Chromebook 文件系统的副本(就像您正在安装 Gentoo 一样,因此复制resolv.conf从 Arch 安装中复制,并在每个文件系统中安装适当的文件系统)Gentoo安装手册,请记住关于/dev/shmArch 的版本是否是符号链接的警告。)它需要尽可能接近您的 Chromebook 环境,否则您最终可能会得到不正确的二进制文件;如果你做了一个副本,你将需要重建更少的包。该环境内部:

    • 添加。FEATURES="buildpkg"/etc/portage/make.conf
    • 生成的包将位于/usr/portage/packages.您也可以通过这种方式编译内核,只需将生成的内核和相应的/lib/modules目录复制到 Chromebook 即可。 (请记住,这些目录位置是相对于 chroot 的!) wiki 建议安装 NFS 或其他服务器,这样您就不必手动复制文件:这可以在 Arch 系统上正确设置。我喜欢rsyncd为此目的进行设置,但可以使用您喜欢的任何方法来访问文件。

    在您的 Chromebook 上:

    • 如果你想阻止它在本地编译,请确保添加到FEATURES="getbinpkg"/etc/portage/make.conf
    • 如果您使用远程文件访问,请添加PORTAGE_BINHOST="protocol://path/to/your/chroot/usr/portage/packages"/etc/portage/make.conf.

    请参阅Gentoo wiki 中的二进制包指南了解更多信息。

这两种方法我以前都用过,而且效果都很好。我对这两种方法的观察:

  1. distcc即使双方都有相同的设置,工作起来也很挑剔。保持gcc版本binutils相同将是您最大的挑战。然而,一旦你开始使用,它的速度相当快,如果你有足够快的额外计算机,你可以添加它们。

  2. 环境chroot不太挑剔,但是如果您对 portage 环境的任何部分(CFLAGSUSE标志、掩码、配置文件等)进行更改,您必须确保双方保持一致,否则您最终可能会得到具有以下内容的软件包:错误的依赖关系。 Gentoo 在确保 USE 标志匹配方面非常出色,但它不跟踪二进制包中的编译器选项。优点之一是您不会受到 Chromebook 上用于编译的(缺乏)磁盘空间和内存的限制。

如果您要使用该chroot方法,我将编写一个脚本来完成设置所需的所有无趣工作(替换/mnt/gentoo为您的 chroot 位置):

cp -L /etc/resolv.conf /mnt/gentoo/etc
mount -t proc proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
chroot /mnt/gentoo /bin/bash
umount -R /mnt/gentoo/dev
umount -R /mnt/gentoo/sys
umount /mnt/gentoo/proc

答案2

受到已接受答案的启发,但评论太多:

铬书,将根文件系统与系统挂载点隔离/dev/sys等等/run

mount -o bind / /mnt/gentoo
# If neccesary
mount -o bind /boot /mnt/gentoo/boot
mount -o bind /usr /mnt/gentoo/usr

/etc/exports:/mnt/gentoo 192.168.0.2(rw,同步,nohide,no_root_squash)

确保内核支持通过 NFS 导出。并启动相关服务。 ( nfsd)

拱门Linux盒子,/etc/fstab

# You might need to tune mount options for performance.
192.168.0.3:/mnt/gentoo   /mnt/gentoo   nfs   defaults 0 0

确保在 Arch 端(netmountnfs)启动了正确的服务。检查远程文件系统是否已成功挂载。

优雅地从 ErikF 窃取(不要复制resolv.conf,因为正在运行的系统应该已经拥有它):

mount -t proc proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
chroot /mnt/gentoo /bin/bash
umount -R /mnt/gentoo/dev
umount -R /mnt/gentoo/sys
umount /mnt/gentoo/proc

确保/etc/portage/make.conf设置正确-march,不是native

现在,emerge按照您的喜好运行,所有内容都会直接安装到 chromebook 的 rootfs 中。

重要的提示:我已经添加了这个答案作为一种看起来很有趣的可能性。它还没有经过测试。此外,导出根文件系统(rw、no_root_squash)会让任何尊重 IT 安全的人感到毛骨悚然。因此,只能在非常值得信赖的网络上执行此操作!

相关内容