这个问题, ”找出哪个分区上有什么操作系统?”,让我思考是否可以从已安装的发行版运行可执行文件,而无需实际启动到该发行版。
这个问题的答案是“如何从 chmod -R 000 /bin 恢复?”,让我想到也许你可以从安装的发行版分区调用加载程序。
这可能吗?
例子
当我尝试时,它不起作用,但我想我可能会遗漏其他一些部分。
我尝试使用的命令是lsb_release
.我现在正在安装 64 位 Fedora 14,如果这很重要的话。
$ sudo /lib/ld-2.13.so /usr/bin/lsb_release
/usr/bin/lsb_release: error while loading shared libraries: /usr/bin/lsb_release: invalid ELF header
答案1
是的,前提是正在运行的内核能够运行已安装发行版中的二进制文件。
这要求安装的发行版适用于正在运行的处理器架构或兼容的处理器架构。例如,您将无法在 x86 处理器上运行 ARM 二进制文件。兼容性取决于CPU;例如,在 x86/amd64 上,64 位二进制文件仅在 64 位 CPU 上运行,而 32 位二进制文件则在 32 位和 64 位 CPU 上运行。兼容性还取决于操作系统;例如,在x86_64 CPU上,Solaris可以在32位和64位内核上无差别地运行64位和32位程序; Linux 64 位内核可以运行 32 位程序,但反之则不行;而OpenBSD 64位内核无法运行32位程序。
静态链接的可执行文件将毫不费力地就地运行,只要它们不在固定位置查找文件即可。如果安装的发行版具有更新版本的 C 库,或者正在使用不同的 C 库(例如 uClibc 与 Glibc),或者正在使用主机不支持用户空间的不同体系结构,则动态链接的可执行文件可能无法工作(例如 i386 与 amd64、armhf 与 armel)。
有时,为了使动态链接的可执行文件工作,您需要显式调用动态链接器,并将已安装系统的库目录放在库搜索路径的第一位。
LD_LIBRARY_PATH=/mnt/lib:/mnt/usr/lib /mnt/lib/ld-linux.so.2 /mnt/bin/foo
确保已安装系统中的程序能够在正确的位置找到所需的一切(加载程序、库、配置文件、数据文件等)的一个简单方法是在chroot。 chroot 将文件系统的视图限制为单个目录及其子目录。只有 root 可以调用该chroot
命令。
chroot /mnt /bin/foo
由于程序以其根目录运行/mnt
,因此它不会看到该层次结构之外的任何内容: no /home
(或者更确切地说,来自 的那个/mnt
), no /proc
,只有 的静态默认值/dev
等。特殊的文件系统/proc
可以安装在chroot,从外部 ( mount -t proc proc /mnt/proc
) 或从内部 ( mount -t proc proc /proc
)。在 Linux 下,可以使用 或 来将目录重新挂载到第二个位置(同时保留在原来的位置)mount --bind
,也mount --rbind
可以复制挂载在指定目录下的文件系统。
mount --rbind /dev /mnt/dev
mount --bind /home /mnt/home
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/foo
Debian 和其他一些发行版提供了一个名为施鲁特自动化此类安装并执行其他细节。对于一次性的事情来说这有点过分了,但如果你想的话也很方便维护多个分布。