【linux命令讲解大全】193.Linux命令解析:chroot与clock的用途和实例

2024-03-02 14:39:39 浏览数 (2)

chroot

将根目录更改为指定的目标目录。

补充说明

chroot 命令用于在指定的根目录下运行指令。chroot 是 change root directory (更改根目录)的缩写。在 Linux 系统中,默认的目录结构是以 / 作为根目录的起点。而使用 chroot 后,系统的目录结构将会以指定的位置作为新的根目录。

通过 chroot 命令,系统将会读取指定位置的目录和文件,而不再是旧的根目录下的目录结构和文件。因此,chroot 命令带来的好处主要有以下三个方面:

  1. 增强系统安全性,限制用户权限: 在经过 chroot 后,在新的根目录下无法访问到旧的系统根目录结构和文件,从而提高了系统的安全性。通常情况下,可以在登录之前使用 chroot,使得用户无法访问特定文件。
  2. 建立与原系统隔离的目录结构,方便用户开发: 使用 chroot 后,系统将读取新的根目录下的目录和文件,这是一个与原系统根目录下文件无关的目录结构。可以在这个新环境中进行软件的静态编译和与系统无关的独立开发。
  3. 切换系统的根目录位置,引导 Linux 系统启动和救援系统等: chroot 的作用是切换系统的根位置,在系统初始化启动磁盘处理过程中使用最为明显。通过切换初始 RAM 磁盘 (initrd) 中的根位置,并执行真正的 init 进程。此外,在系统出现问题时,也可以使用 chroot 切换到临时系统进行救援操作。
语法
代码语言:javascript复制
chroot [选项] [参数]
选项
  • --help:显示在线帮助信息。
  • --version:显示版本信息。
参数
  • 目录:指定新的根目录。
  • 指令:指定要执行的指令。
实例

target 作为根目录(运行其中的 /bin/sh):

代码语言:javascript复制
chroot target /bin/sh

在这里,target 是已经安装好的 BusyBox 的路径,类似于一个包含许多工具的文件系统。通过该命令,将进入一个以 target 为根的 shell 界面。通过运行 exit 命令退出该 shell,即可返回到原来的本机环境。也可以使用 Ctrl D 快捷键。

注意:

  • 只有 root 用户才能执行该命令。
  • 如果直接使用 chroot target,默认将寻找 target 中的 /bin/bash。这将以 target 作为根目录。
  • target 作为根目录(运行其中的 /bin/ls):
代码语言:javascript复制
chroot target /bin/ls

在这里,target 是已经安装好的 BusyBox 的路径,类似于一个包含许多工具的文件系统。通过该命令,运行的是 target 中的 ls 命令(而不是本机的 /bin/ls),然后立即返回到原来的目录环境。

请注意,如果自己在本地编译一个程序生成 a.out,并将其复制到 target/bin/ 目录中,上述操作是行不通的。因为它包含了动态链接的库,需要使用 ldd 命令查看 a.out 需要哪些动态库,并将这些库复制到新根目录的对应路径下才能执行。

可以使用 chroot 运行自己编译的程序:

  • 准备 chroot 的根目录:
代码语言:javascript复制
mkdir newRoot
  • 编译自己的程序:
代码语言:javascript复制
gcc main.c

在这里,main.c 生成了 a.out,其功能是输出 “hello”。

  • 查看程序需要的库:
代码语言:javascript复制
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)
  • 将程序需要的库和程序复制到新根目录下:
代码语言:javascript复制
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 的内容将如下所示:

代码语言:javascript复制
a.out
lib/
  • 使用 chroot 运行自己编译的程序:
代码语言:javascript复制
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 时间

0 人点赞