运行 glibc 程序

来自 Alpine Linux

如果您想在 Alpine Linux 中运行 glibc 程序,有几种方法可以做到这一点。您可以安装 gcompat 兼容层,您可以将 glibc 与 musl 一起安装(手动安装,因为它没有打包),或者您可以采用简单的方法,使用 Flatpak(最简单)、容器或 chroot。

因为存在不同的用例,这只是对可能和合理的方法的简单概述。

您的选项

gcompat

gcompat 是 Alpine 用户的首选兼容层。

apk add gcompat

之后,您可以像往常一样运行您的二进制文件。

Flatpak

Flatpak 是在 Alpine 上运行任何图形 glibc 程序的最简单方法。首先安装它。

apk add flatpak

然后您可以运行任何 Flatpak 应用程序

flatpak run <flatpak name>

建议按照 此处 的说明启用 Flathub,因为您可能需要的大多数 glibc 程序都将在此处打包。

然后您可以从中安装应用程序,例如

flatpak install com.valvesoftware.Steam

Chroot

另一种更易于推广到其他 glibc 应用程序的选项是将基于 glibc 的发行版安装到 chroot 中。然后,您可以 chroot 进入它,或者使用符号链接和一些配置使其 glibc(和关联的库)可从 Alpine 中使用。

在使用下面描述的任何方法设置 chroot 后,可以在 Alpine 中设置加载器,如下所示(这些说明适用于 /var/chroots/debian 中的 Debian chroot,在 x86_64 上,但可以通过使用适当的路径来适应其他系统)

mkdir -p /lib64 ln -s /var/chroots/debian/lib/x86_64-linux-gnu/ld-2.33.so /lib64 printf '/var/chroots/debian/lib/x86_64-linux-gnu\n/var/chroots/debian/usr/lib/x86_64-linux-gnu\n' > /etc/ld.so.conf /var/chroots/debian/sbin/ldconfig

Gentoo Linux

此处 选择 stage3,并从 此处 的 gentoo/snapshots/portage-latest.tar.xz 获取最新的 portage。

首先,

doas apk add xz

进入 chroot

mkdir ~/chroot cd ~/chroot tar -xvf stage3-*.tar.xz tar -xvf portage-latest.tar.xz mv portage usr doas mount --bind /dev dev doas mount --bind /sys sys doas mount -t proc proc proc cp /etc/resolv.conf etc doas chroot . /bin/bash

瞧!您已经拥有可用的 Gentoo chroot!

您现在可以查看 Gentoo 手册,了解如何配置和安装您的系统,或者只是提取/复制您需要在 chroot 环境中运行的程序并执行它。

这是一个包装脚本,当您频繁重复使用此 chroot 时,它类似于 arch-chroot

此外,使用与主机当前用户相同的用户名在 chroot 中创建一个帐户,或更改 chroot 行的用户规范选项。

gentoo-chroot.sh 的内容

!/bin/bash CHROOT_PATH="/home/$USER/chroot" cd $CHROOT_PATH mount | grep $CHROOT_PATH/dev || doas mount --bind /dev dev mount | grep $CHROOT_PATH/sys || doas mount --bind /sys sys mount | grep $CHROOT_PATH/proc || doas mount -t proc proc proc cp /etc/resolv.conf etc doas chroot --userspec=$USER:users . /bin/bash echo "您必须手动卸载 $CHROOT_PATH/dev, $CHROOT_PATH/sys, $CHROOT_PATH/proc。"

执行 chmod +x gentoo-chroot.sh 使其工作。

Arch Linux

可以使用 pacstrap(包含在 arch-install-scripts 软件包中)或 Arch 引导镜像

doas apk add arch-install-scripts mkdir ~/chroot && cd ~/chroot curl -O https://mirrors.edge.kernel.org/archlinux/iso/latest/archlinux-bootstrap-x86_64.tar.gz doas tar xzf archlinux-bootstrap-x86_64.tar.gz && rm archlinux-bootstrap-x86_64.tar.gz doas sed -i '/evowise/s/^#//' root.x86_64/etc/pacman.d/mirrorlist doas sed -i '/CheckSpace/s/^/#/' root.x86_64/etc/pacman.conf doas arch-chroot root.x86_64 [chroot]# pacman-key --init [chroot]# pacman-key --populate archlinux

完成后,更新系统并安装所需的软件包(在本例中用 "foo" 表示)

[chroot]# pacman -Syu foo

Debian

待办事项:gresec 参考需要从此部分中干净地删除。


使用提供的 debootstrap 软件包创建 Debian chroot。--arch 是可选的,取决于您的需求。

linux-grsec 内核上,您需要放宽 chroot 限制

 sudo apk add debootstrap
 for i in /proc/sys/kernel/grsecurity/chroot_*; do echo 0 | sudo tee $i; done
 mkdir ~/chroot
 sudo debootstrap --arch=i386 wheezy ~/chroot https://deb.debian.org/debian/
 for i in /proc/sys/kernel/grsecurity/chroot_*; do echo 1 | sudo tee $i; done
 sudo chroot ~/chroot /bin/bash

您现在可以使用 apt-get 安装所需的软件包。

容器

也可以使用 Docker 或 Podman 容器以及 Distrobox 等助手。这允许轻松使用图形程序,并且一旦设置好,就不需要 root 权限。

# apk add distrobox

Distrobox + Podman

# apk add podman

然后按照这些步骤设置无根 Podman。您需要将您的根目录挂载为共享,Distrobox 才能正常工作。

像这样填写 /etc/local.d/mount-rshared.start

#!/bin/sh mount --make-rshared /

将其标记为可执行。

# chmod +x /etc/local.d/mount-rshared.start

然后自动启动其服务。

# rc-update add local default # rc-service local start

最后,您可以使用您选择的镜像创建容器。

$ distrobox create --image debian --name debian $ distrobox enter debian

也可能需要允许 X 授权才能使 GUI 程序工作。

$ xhost +si:localuser:$USER

Chroot + Bubblewrap

也可以将 Debian 系统 chroot 与 Bubblewrap 一起使用。这允许在没有 root 权限的情况下运行程序。

# apk add bubblewrap debootstrap # mkdir -p /var/chroots/debian # debootstrap --arch amd64 stable /var/chroots/debian/ https://deb.debian.org/debian

最后,我们可以为 bwrap 创建一个别名。

$ alias glibc="LANG=en_US.UTF-8 bwrap --bind /var/chroots/debian / --dev-bind /dev /dev --proc /proc --bind /sys /sys --bind /run /run --bind /home /home --ro-bind /etc/resolv.conf /etc/resolv.conf --ro-bind /etc/passwd /etc/passwd --ro-bind /etc/group /etc/group"

要运行使用 X11/Xorg 的程序,您可以使用

$ alias glibcX11="LANG=en_US.UTF-8 bwrap --bind /var/chroots/debian / --dev-bind /dev /dev --proc /proc --bind /sys /sys --bind /run /run --bind /home /home --ro-bind /etc/resolv.conf /etc/resolv.conf --ro-bind /etc/passwd /etc/passwd --ro-bind /etc/group /etc/group --bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 --setenv DISPLAY :0"

在这种情况下,您可能需要使用 xhost 来允许本地连接,例如

# xhost + local

现在我们可以像这样调用 glibc 构建的二进制文件

$ glibc ./binary

$ glibcX11 ./binary

为了更新 Chroot 或安装依赖项,我们可以挂载它,然后以 root 用户身份登录

# mount --bind /dev /var/chroots/debian/dev # mount --bind /proc /var/chroots/debian/proc # chroot /var/chroots/debian /bin/bash # apt update && apt upgrade

在安装您可能想要的内容后,卸载 dev 和 proc 的绑定以避免问题。

# umount /var/chroots/debian/dev

# umount /var/chroots/debian/proc