通过 SSH 卸载编译?

Ara*_* K. 3 compiling ssh arch-linux gentoo cross-compilation

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

Eri*_*ikF 5

不,您不必交叉编译(如果您的目标是另一种架构,那将是必要的。)我可以想到有两种方法可以设置您的系统来执行此操作:

  1. 使用distcc. 在Gentoo的和拱门维基做描述了如何安装和配置程序,所以我不会在这里复制了整个事情的一个好工作。简而言之,您需要进行以下设置才能使其工作:

    • 您的CFLAGSin/etc/portage/make.conf 不能使用march=nativeor mtune=native,因为远程计算机将使用其“本机”CPU 的想法,而不是本地计算机的。如果您使用“本机”,请通过运行找出要使用的标志:

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

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

    • 添加FEATURES="buildpkg"到/etc/portage/make.conf.
    • 生成的包将在/usr/portage/packages. 您也可以通过这种方式编译内核,只需将生成的内核和相应/lib/modules目录复制到 Chromebook 即可。(请记住,这些目录位置是相对于 chroot 的!)维基建议使用 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环境是不太挑剔,但如果您对搬运环境的任何部分的变化(CFLAGS,USE旗帜,面具,型材等),你必须确保双方保持一致,否则你可以与有包装结束错误的依赖关系。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
Run Code Online (Sandbox Code Playgroud)