chroot究竟是什么? 它是否类似于同步双启动?

有人建议我使用chroot可以解决我构建必须在嵌入式设备上运行的应用程序的问题。 我从这个描述中推断出它在某种程度上类似于在我的机器上本地创建嵌入式环境,然后我可以使用它从我的桌面开发机器开发。 这是查看function的正确方法还是我完全被误解了?

为了了解它是如何工作的,我读了这个https://wiki.ubuntu.com/DebootstrapChroot ,我将尝试在我的机器上为旧的Ubuntu版本制作一个chroot。 但是,因为我是一个完全的linux新手,我有点担心,因为我不完全知道我在做什么,无论如何,我最终会得到一个无法使用的系统? 这是新手应该尝试的东西吗???

chroot与双启动无关。 chroot背后的想法是能够将一个程序或一个shell等切换到新的根目录,从而允许您同时拥有多个“系统”。 “systems”在引号中,因为仍然只有一个 Linux内核在运行。 这个其他的“系统”是一组额外的代码工具,主目录等。所以,如果你在x86机器上,并且正在尝试在你的机器上为ARM构建一些软件,你可以创建一个chroot ed环境, /proc告诉软件它在ARM上,ARM GCC工具链等(有许多程序可以做到这一点)。 chroot可以做的另一件事是一些非常有限的沙盒,结合SELinux和基本Linux权限之类的东西,可以创建一个相对安全的沙箱,这个应用程序认为它位于不同的系统上。 chroot另一个用途是测试。 如果您的应用程序根据某个系统目录执行不同的操作,则可以创建一个chroot来测试它。

我觉得没有人给出完整的技术解释,所以这里有。

要了解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内的主系统安装/回家。 这不是副本,它是相同的文件系统,在这种情况下,您在chroot内所做的任何更改都将在原始文件上执行。 因此,我建议您手动构建chroot,直到您对它们的工作方式感到满意为止。

除了这两个潜在的问题之外,chroot可能出现的问题并不多,因为它主要是一个独立的系统,只有在你要求它时才会启动。

让我试着用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 run z然后启动WinB并运行z。 chroot允许您将D:\设置为C:\而无需重新启动。 所以你可以启动WinA run chroot来制作D:新的C:并运行程序z,以便对位于D:\而不是WinA的WinB进行更改,而WinA位于原始C:中。

现在让我举一个如何使用chroot的例子。 一旦我的Ubuntu无法启动。 事实certificate需要重新安装grub。 如果我可以启动Ubuntu并运行安装grub的命令,这很容易。 但我需要从USB上做到这一点。 所以我从USB驱动器启动了Ubuntu。 如果我发出安装grub的命令,我会安装grub到USB。 所以我需要将分区安装在安装了破坏grub的Ubuntu的硬盘驱动器中,并使用chroot指向安装的分区。 然后我重新安装grub和grub安装在硬盘驱动器应该是的位置。

Chroot允许您从另一个根目录运行命令或shell。 如果由于嵌入式设备而向您建议,则表示您将从该设备的根目录运行shell。

不是,不是。

引导操作系统涉及加载控制硬件的内核,然后运行许多其他程序。 chroot在你当前的内核下运行一个程序(通常是一个shell,你可以从那里运行其他程序),只有内核位于程序中,并假装根目录是一个其他目录,而不是它真正用作root的目录。 因此,命令的名称,因为它更改了根目录。

在您的情况下, debootstrap设置一个适合用作根目录的目录树。 您可以启动内核并告诉它使用该目录作为根而不是正常的根fs,并且您将启动该系统。 通过使用chroot您可以运行程序,就像它们在使用该目录作为其根目录启动的内核下运行一样,而不必实际执行。

当您从另一个系统(例如Live CD)启动时,您可以使用chroot进入文件系统(linux)。

有了这个,你可以修复GRUB(如果有错误)。 如果您无法启动并希望从特定分区下载重要文件,这也非常有用。