chroot
将根目录更改为指定的目标目录。
补充说明
chroot
命令用于在指定的根目录下运行指令。chroot
是 change root directory (更改根目录)的缩写。在 Linux 系统中,默认的目录结构是以 /
作为根目录的起点。而使用 chroot
后,系统的目录结构将会以指定的位置作为新的根目录。
通过 chroot
命令,系统将会读取指定位置的目录和文件,而不再是旧的根目录下的目录结构和文件。因此,chroot
命令带来的好处主要有以下三个方面:
- 增强系统安全性,限制用户权限:
在经过
chroot
后,在新的根目录下无法访问到旧的系统根目录结构和文件,从而提高了系统的安全性。通常情况下,可以在登录之前使用chroot
,使得用户无法访问特定文件。 - 建立与原系统隔离的目录结构,方便用户开发:
使用
chroot
后,系统将读取新的根目录下的目录和文件,这是一个与原系统根目录下文件无关的目录结构。可以在这个新环境中进行软件的静态编译和与系统无关的独立开发。 - 切换系统的根目录位置,引导 Linux 系统启动和救援系统等:
chroot
的作用是切换系统的根位置,在系统初始化启动磁盘处理过程中使用最为明显。通过切换初始 RAM 磁盘 (initrd) 中的根位置,并执行真正的 init 进程。此外,在系统出现问题时,也可以使用chroot
切换到临时系统进行救援操作。
语法
代码语言:javascript复制chroot [选项] [参数]
选项
--help
:显示在线帮助信息。--version
:显示版本信息。
参数
- 目录:指定新的根目录。
- 指令:指定要执行的指令。
实例
将 target
作为根目录(运行其中的 /bin/sh
):
chroot target /bin/sh
在这里,target
是已经安装好的 BusyBox 的路径,类似于一个包含许多工具的文件系统。通过该命令,将进入一个以 target
为根的 shell 界面。通过运行 exit
命令退出该 shell,即可返回到原来的本机环境。也可以使用 Ctrl D 快捷键。
注意:
- 只有 root 用户才能执行该命令。
- 如果直接使用
chroot target
,默认将寻找target
中的/bin/bash
。这将以target
作为根目录。 - 将
target
作为根目录(运行其中的/bin/ls
):
chroot target /bin/ls
在这里,target
是已经安装好的 BusyBox 的路径,类似于一个包含许多工具的文件系统。通过该命令,运行的是 target
中的 ls
命令(而不是本机的 /bin/ls
),然后立即返回到原来的目录环境。
请注意,如果自己在本地编译一个程序生成 a.out
,并将其复制到 target/bin/
目录中,上述操作是行不通的。因为它包含了动态链接的库,需要使用 ldd
命令查看 a.out
需要哪些动态库,并将这些库复制到新根目录的对应路径下才能执行。
可以使用 chroot
运行自己编译的程序:
- 准备
chroot
的根目录:
mkdir newRoot
- 编译自己的程序:
gcc main.c
在这里,main.c
生成了 a.out
,其功能是输出 “hello”。
- 查看程序需要的库:
ldd a.out
输入该命令后,会输出如下内容:
代码语言:javascript复制linux-gate.so.1 => (0xb8034000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7eab000)
/lib/ld-linux.so.2 (0xb801a000)
- 将程序需要的库和程序复制到新根目录下:
cp a.out newRoot
mkdir newRoot/lib
cp /lib/tls/i686/cmov/libc.so.6 newRoot/lib
cp /lib/ld-linux.so.2 newRoot/lib
在这里,newRoot
的内容将如下所示:
a.out
lib/
- 使用
chroot
运行自己编译的程序:
su
chroot newRoot /a.out
这样就可以正确运行 a.out
了,因为 a.out
使用了其他动态链接库,所以需要将这些库复制到 newRoot
中。如果没有其他库的话,直接复制 a.out
即可运行。例如,静态编译后的 BusyBox,其安装目录中的 /bin/busybox
就没有依赖其他库。
clock
用于调整 RTC 时间。
补充说明
clock
命令用于调整 RTC 时间。RTC 是计算机内置的硬件时钟,执行该命令可以显示当前时间,调整硬件时钟的时间,将系统时间设置为与硬件时钟一致,或将系统时间回写到硬件时钟中。
语法
代码语言:javascript复制clock [选项]
选项
--adjust
:第一次使用--set
或--systohc
参数设置硬件时钟时,在/etc
目录下生成一个名为adjtime
的文件。当再次使用这两个参数调整硬件时钟时,该文件将记录两次调整之间的差异值。日后执行带有--adjust
参数的clock
命令时,程序会根据记录文件的差异值计算平均值,并自动调整硬件时钟的时间。--debug
:详细显示指令的执行过程,便于排错或了解程序的执行情况。--directisa
:告诉clock
命令不要通过/dev/rtc
设备文件,直接对硬件时钟进行读写。这个参数适用于只有 ISA 总线结构的老式计算机。--getepoch
:将系统核心内的硬件时钟新纪元数值显示在标准输出设备上。--hctosys
:将硬件时钟的时间设定为与系统时间一致。由于这个操作会导致系统全面更新文件的访问时间,因此最好在系统启动时执行。--set --date="<日期时间>"
:设置硬件时钟的日期和时间。--setepoch --epoch=<年份>
:设置系统核心的硬件时钟的新纪元数值,年份以四位数字表示。--show
:读取硬件时钟的时间,并将其显示在标准输出设备上。--systohc
:将系统时间存储到硬件时钟中。--test
:仅进行测试,不会真正将时间写入硬件时钟或系统时间。--utc
:将硬件时钟上的时间设置为 Coordinated Universal Time (CUT),有时也称为 UTC 或 UCT。--version
:显示版本信息。
实例
获取当前时间:
代码语言:javascript复制clock # 获取当前时间
显示 UTC 时间:
代码语言:javascript复制clock -utc # 显示 UTC 时间