chroot在Linux中发挥了根目录的切换工作linux chroot,同时带来了系统的安全性等益处。下边为严打分享一下linuxchroot的使用技巧。

chroot简介:为什么使用chroot

在经过chroot以后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因而它带来的益处大致有以下3个:

降低了系统的安全性,限制了用户的权利;

在经过chroot以后,在新根下将访问不到旧系统的根目录结构和文件,这样就提高了系统的安全性。这个通常是在登陆(login)前使用chroot,借此达到用户不能访问一些特定的文件。

linux chroot_linux chroot_linux chroot

构建一个与原系统隔离的系统目录结构嵌入式linux培训,便捷用户的开发;

使用chroot后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中redflag linux,可以拿来测试软件的静态编译以及一些与系统不相关的独立开发。

切换系统的根目录位置,引导Linux系统启动以及急救系统等。

chroot的作用就是切换系统的根位置,而这个作用最为显著的是在系统初始引导c盘的处理过程中使用,从初始RAMc盘(initrd)切换系统的根位置并执行真正的init。另外,当系统出现一些问题时,我们也可以使用chroot来切换到一个临时的系统。

chroot的使用

linux chroot_linux chroot_linux chroot

为了更好的理解chroot发挥的作用,我们将尝试指定一个特定的位置进行根目录切换。并且因为在经过chroot以后,系统读取到的bin/等与系统相关目录将不再是旧系统根目录下的,而是切换后新根下的目录结构和文件,因而我们有必要打算一些目录结构以及必要的文件。

清单1.打算切换的目录结构

busybox

Busybox被称为是嵌入式Linux中的德国军刀。Busybox包含了许多有用的,如cat、find等linux chroot,并且它的容积却十分的小。

 $ pwd
 /home/wstone/Build/work
 $ tree .
 .
 |-- bin
 | |-- ash -> busybox
 | |-- bash
 | `-- busybox
 |-- etc
 `-- newhome

linux chroot_linux chroot_linux chroot

这儿使用了静态编译后的busybox来提供必要的,使用静态编译仅是为了防止动态库文件的拷贝。其实我们也可以拷贝旧系统的下的命令到新的目录结构中使用,而且这些命令一般是动态编译的,这就意味着我们不得不拷贝相关的动态库文件到相应的目录结构中。同时这儿的bash也非真正的BourneAgain,而是一个执行ash的shell。在清单2中,展示了坐落旧系统中的chroot命令的使用。须要注意的是在使用chroot时,要求拥有相关的操作权限。

清单2.坐落系统中的chroot的使用

 mount /dev/hda1 /new-root
 cd /new-root
 pivot_root . old-root
 exec chroot . /sbin/init dev/console 2>&1
 umount /old-root

我们可以看见当前路径(/home/wstone/Build/work/),在经过chroot后转弄成了/目录,同时从新根下读取了与系统相关的目录结构。使用ls命令失败是因为我们创建的测试目录结构中并没有包含命令ls,并且我们成功的使用了busybox中的ls。以上见到的只是chroot的一种使用方法,虽然标准的chroot(Coreutils–GNUcoreutilities提供的chroot)使用方法有2种:

清单3.标准chroot的2种使用方法

linux chroot_linux chroot_linux chroot

 chroot NEWROOT [COMMAND...]
 
 chroot OPTION

刚刚我们使用的是形式[2]。这将在没有给定环境时,默认执行/bin/sh,并且当给定环境后,将运行${SHELL}–i,即与环境相同的可交互的shell。我们的目录结构中并没有包含sh,即便清单2中的chroot运行了${SHELL}–i。其实我们也可以在进行切换时指定须要的命令,即使用方法[1]。

清单4.chroot另一种形式的使用

 # chroot . /bin/ash
 #

在清单4中,尝试了在经过chroot后,执行新目录结构下的ashshell。不得不说的是,假如新根下的目录结构和文件打算的够充分,这么一个新的简单的Linux系统就可以使用了。虽然更为常见的是在初始RAMc盘(initrd)中使用chroot,借此来执行系统的init。清单5中,展示的是在Linux2.4内核initrd中使用chroot。

linux chroot_linux chroot_linux chroot

清单5.在Linux2.4内核initrd中使用chroot的示例

 mount /dev/hda1 /new-root
 cd /new-root
 pivot_root . old-root
 exec chroot . /sbin/init dev/console 2>&1
 umount /old-root

因为Linux内核的升级,initrd处理机制和格式发生了变化,在Linux2.6内核initrd中不能再使用pivot_root,因而通常也不再使用chroot,而是选择使用busybox提供的switch_root或则klibc提供的run-init进行根目录的切换。(这并不是说不能在Linux2.6内核initrd中使用chroot,选择switch_root或run-init仅是出于习惯和便捷的考虑。)并且实质上,它们仅是将chroot的功能进行了封装,借此愈发便捷简单的切换根目录。

清单6.在Linux2.6内核initrd中chroot的使用

 find -xdev / -exec rm '{}' ';
 cd /newmount; mount --move . /; chroot .

switch_root和run-init完成了类似清单6中的功能,删掉rootfs的全部内容以释放空间,以及挂载新的根文件系统并进行切换。在busybox和klibc中也有提供chroot命令,只是功能上与Coreutils(GNUcoreutilities)包含的chroot有稍稍差别。

本文原创地址://lrxjmw.cn/lxtgmlqhgzda.html编辑:刘遄,审核员:暂无