chroot在Linux中发挥了根目录的切换工作linux chroot,同时带来了系统的安全性等益处。下边为严打分享一下linuxchroot的使用技巧。
chroot简介:为什么使用chroot
在经过chroot以后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因而它带来的益处大致有以下3个:
降低了系统的安全性,限制了用户的权利;
在经过chroot以后,在新根下将访问不到旧系统的根目录结构和文件,这样就提高了系统的安全性。这个通常是在登陆(login)前使用chroot,借此达到用户不能访问一些特定的文件。
构建一个与原系统隔离的系统目录结构嵌入式linux培训,便捷用户的开发;
使用chroot后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中redflag linux,可以拿来测试软件的静态编译以及一些与系统不相关的独立开发。
切换系统的根目录位置,引导Linux系统启动以及急救系统等。
chroot的作用就是切换系统的根位置,而这个作用最为显著的是在系统初始引导c盘的处理过程中使用,从初始RAMc盘(initrd)切换系统的根位置并执行真正的init。另外,当系统出现一些问题时,我们也可以使用chroot来切换到一个临时的系统。
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
这儿使用了静态编译后的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种使用方法
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。
清单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编辑:刘遄,审核员:暂无