有人建议我使用 chroot 可能会解决我构建必须在嵌入式设备上运行的应用程序的问题。我从这个描述中推断出,这在某种程度上类似于在我的计算机上本地创建嵌入式环境,然后我可以使用该环境在我的桌面开发计算机上进行开发。这是看待功能的正确方式吗?还是我完全误解了?
为了了解它的工作原理,我读了这篇文章https://wiki.ubuntu.com/DebootstrapChroot我将尝试在我的计算机上为旧版 Ubuntu 创建一个 chroot。但是,由于我完全是 Linux 新手,我有点担心,因为我并不完全了解自己在做什么,最终是否会得到一个无法使用的系统??这是新手应该尝试的事情吗???
答案1
我觉得没有人给出完整的技术解释,所以这里就不再赘述了。
要理解 chroot,首先必须理解内核(GNU/Linux 中的 Linux)和用户空间(GNU/Linux 中的 GNU,或者可能是其他东西,如 busybox)之间的划分。
内核控制计算机中的所有硬件。它还提供文件访问、网络等 API,并控制正在运行的软件程序。所有这些都构成了计算机的抽象,通过应用程序编程接口 (API) 呈现。但它本身并不执行任何操作,除了可能启动到黑屏。甚至没有 shell 提示符。
用户空间是其他一切。您在计算机上运行的所有软件。实际上,内核只直接运行一个用户空间程序 init,然后负责启动其他所有程序,如 shell 和桌面环境。用户空间还包括库,这些库通常以 libc 开头,所有其他库都以此为基础构建。
因此,考虑到这一点,chroot 的概念很简单。它只是将 unix 文件系统的根目录更改为不同的目录,仅用于您选择在此上下文中运行的任何命令。这通常是一个 shell,您可以在其中启动其他软件,就像内核只直接启动单个命令一样。这个新上下文可以有一组不同的用户空间程序和库。同一个内核运行两组软件,因此两个系统都可以使用所有硬件资源,但(除非有安全漏洞)嵌套的 chroot 无法访问主文件系统中的任何内容。它有自己的 /etc 版本用于配置,有自己的 /lib 用于库,有自己的 /bin、/usr/bin 用于程序。
您应该知道硬件设备是共享的. 因此,与虚拟机不同,如果你从 chroot 内部格式化 /dev/sda,你将格式化你的真实硬盘这是因为 /dev 中的设备节点是直接内核接口,因此它们在 chroot 内部和外部含义相同。
还有一件事:可以使用以下命令授予 chroot 对外部文件系统的访问权限绑定坐骑。如果您使用 chroot 构建工具,它可能会“有帮助地”从 chroot 中的主系统挂载 /home。这不是副本,而是相同的文件系统,在这种情况下,您在 chroot 中所做的任何更改都将在原始文件系统上执行。因此,我建议您手动构建 chroot,直到您熟悉它们的工作原理为止。
除了这两个潜在问题之外,chroot 不会出现太多问题,因为它基本上是一个独立的系统,只有当您要求时才会启动。
答案2
非技术性解释
让我试着用 Windows 来解释 chroot。在 Windows 中,启动分区的“根”称为“C:\”,在 Linux 中称为“/”。choort(临时)允许您将其他文件夹/分区/设备设为根分区。如果 Windows 有 choot 命令,它可能会按如下方式工作。
假设您有一台带有两个分区或驱动器的计算机,其中安装了两个版本(或副本)的 Windows。我们将它们称为 WinA 和 WinB。当您启动 WinA 时,其根目录变为 C:\,而 WinB 可能显示为在 D:\。当您启动 WinB 时,C:\ 指的是安装 WinB 的分区,而 D:\ 是 WinA 所在的分区。现在假设您想通过运行程序 z 对 WinA 和 WinB 进行一些更改。当您运行 z 时,它会对具有根目录 C: 的系统执行您想要的所有更改。在 Windows 世界中,您必须启动 WinA 运行 z,然后启动 WinB 并运行 z。chroot 允许您将 D:\ 变成 C:\ 而无需重新启动。因此,您可以启动 WinA 并运行 chroot 以将 D: 变为新的 C:,然后运行程序 z,这样对位于 D:\ 中的 WinB 而不是位于原始 C: 中的 WinA 进行更改。
现在让我举一个我如何使用 chroot 的例子。有一次我的 Ubuntu 无法启动。原来是需要重新安装 grub。如果我可以启动 Ubuntu 并运行安装 grub 的命令,这很容易。但我需要从 USB 执行此操作。所以我从 USB 驱动器启动了 Ubuntu。如果我发出安装 grub 的命令,我会将 grub 安装到 USB。所以我需要在硬盘上安装安装了损坏 grub 的 Ubuntu 的分区,并使用 chroot 指向该已安装的分区。然后我重新安装了 grub,grub 安装在了硬盘上它应该在的位置。
答案3
chroot
与双重启动无关。其背后的想法chroot
是能够将一个程序或一个 shell 等切换到新的根目录,从而允许您同时拥有多个“系统”。之所以用引号引起“系统”,是因为仍然只有一Linux 内核正在运行。这个其他“系统”是一组额外的代码工具、主目录等。因此,如果您使用的是 x86 机器,并试图在您的机器上为 ARM 构建一些软件,您可以创建一个chroot
ed 环境,该环境/proc
会告诉软件它在 ARM 上,ARM GCC 工具链等。(有许多程序可以做到这一点)。chroot
可以做的另一件事是一些非常有限的沙盒,结合 SELinux 和基本 Linux 权限等,可以创建一个相对安全的沙盒,该应用程序认为它在另一个系统上。另一个用途chroot
是测试。如果您有一个基于某些系统目录执行不同操作的应用程序,您可以创建一个chroot
来测试它。
答案4
不是的,不是的。
启动操作系统涉及加载控制硬件的内核,然后运行许多其他程序。 chroot
在当前内核下运行程序(通常是 shell,您可以从中运行其他程序),只有内核会欺骗程序并假装根目录是其他目录,而不是它实际用作根目录的目录。因此,该命令的名称是因为它更改了根目录。
在您的例子中,debootstrap
设置一个适合用作根目录的目录树。您可以启动内核并告诉它使用该目录作为根目录而不是正常的根文件系统,这样您就可以启动该系统。通过使用,您可以chroot
运行程序仿佛它们在使用该目录作为根目录启动的内核下运行,但实际上无需这样做。