chroot

chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置。

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

增加了系统的安全性,限制了用户的权力:

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

建立一个与原系统隔离的系统目录结构,方便用户的开发:

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

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

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

语法

chroot(选项)(参数)

选项

--help:在线帮助;
--version:显示版本信息。

参数

  • 目录:指定新的根目录;
  • 指令:指定要执行的指令。

实例

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

chroot target /bin/sh

这里,target是busybox安装好的路径,类似一个文件系统包含了许多工具。这样,将会进入一个shell界面,这个shell以target为根。运行exit退出该shell又返回原来的本机环境了,也可以使用Ctrl+D。

注意:

  • 根用户才行
  • 如果直接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

输入之后,输出如下:

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就没有依赖其他库。

ipcs

ipcs命令用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表、共享内存和信号量的信息。

语法

ipcs(选项)

选项

-a:显示全部可显示的信息;
-q:显示活动的消息队列信息;
-m:显示活动的共享内存信息;
-s:显示活动的信号量信息。

实例

ipcs -a
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x7401833d 2654208    root      600        4          0                       
0x00000000 3145729    root      600        4194304    9          dest         
0x7401833c 2621442    root      600        4          0                       
0xd201012b 3080195    root      600        1720       2

logrotate

logrotate命令用于对系统日志进行轮转、压缩和删除,也可以将日志发送到指定邮箱。使用logrotate指令,可让你轻松管理系统所产生的记录文件。每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。您必须自行编辑,指定配置文件,预设的配置文件存放在/etc/logrotate.conf文件中。

语法

logrotate(选项)(参数)

选项

-?或--help:在线帮助;
-d或--debug:详细显示指令执行过程,便于排错或了解程序执行的情况;
-f或--force :强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然;
-s<状态文件>或--state=<状态文件>:使用指定的状态文件;
-v或--version:显示指令执行过程;
-usage:显示指令基本用法。

参数

配置文件:指定lograote指令的配置文件。

xlsclients

xlsclients命令用来列出显示器中的客户端应用程序。

语法

xlsclients(选项)

选项

-a:列出所有显示器的客户端应用程序信息;
-display<显示器编号>:指定X Server连接的显示器编号,该编号由"0"开始计算,依序递增;
-l:使用详细格式列表;
-m<最大指令长度>:设置显示指令信息的最大长度,单位以字符计算。

findfs

findfs命令依据卷标(Label)和UUID查找文件系统所对应的设备文件。findfs命令会搜索整个磁盘,看是否有匹配的标签或者UUID没有,如果有则打印到标注输出上。findfs命令也是e2fsprogs项目的一部分。

语法

findfs(参数)

参数

LABEL=<卷标>或者UUID=<UUID>:按照卷标或者UUID查询文件系统。

实例

通过卷标名查找对应的文件系统:

findfs LABEL=/boot
/dev/hda1

xauth

xauth命令用于显示和编辑被用于连接X服务器的认证信息。

语法

xauth(选项)(参数)

选项

-f:不使用默认的认证文件,而使用指定的认证文件;
-q:安静模式,不打印未请求的状态信息;
-v:详细模式,打印指定的各种操作信息;
-i:忽略认证文件锁定;
-b:执行任何操作,终端认证文件锁定。

参数

  • add:添加认证条目到认证文件中;
  • extract:将指定的设备内容加入到指定的密码文件中;
  • info:显示授权文件相关信息;
  • exit:退出交互模式;
  • list:列出给定的显示设备的内容;
  • merge:合并多个授权文件内容;
  • extract:将指定设备内容写入指定的授权文件;
  • nextrct:将指定设备内容写入指定的授权文件;
  • nmerge:合并多个授权文件内容;
  • remove:删除指定显示设备的授权条目;
  • source:从指定文件读取包含xauth的内容指令。

nohup

nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

语法

nohup(选项)(参数)

选项

--help:在线帮助;
--version:显示版本信息。

参数

程序及选项:要运行的程序及选项。

实例

使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。

renice

renice命令可以修改正在运行的进程的调度优先级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。

语法

renice(选项)(参数)

选项

-g:指定进程组id;
-p<程序识别码>:改变该程序的优先权等级,此参数为预设值。
-u:指定开启进程的用户名。

参数

进程号:指定要修改优先级的进程。

实例

将行程id为987及32的行程与行程拥有者为daemon及root的优先序号码加1:

renice 1 987 -u daemon root -p 32

注意:每一个行程都有一个唯一的id。

lastlog

lastlog命令用于显示系统中所有用户最近一次登录信息。

lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示**Never logged**。注意需要以root身份运行该命令。

语法

lastlog(选项)

选项

-b<天数>:显示指定天数前的登录信息;
-h:显示召集令的帮助信息;
-t<天数>:显示指定天数以来的登录信息;
-u<用户名>:显示指定用户的最近登录信息。

实例

lastlog
Username         Port     From             Latest
root             pts/0    221.6.45.34      Tue Dec 17 09:40:48 +0800 2013
bin                                        **Never logged in**
daemon                                     **Never logged in**
adm                                        **Never logged in**
lp                                         **Never logged in**
sync                                       **Never logged in**
shutdown                                   **Never logged in**
halt                                       **Never logged in**
mail                                       **Never logged in**
news                                       **Never logged in**
uucp                                       **Never logged in**
operator                                   **Never logged in**
games                                      **Never logged in**
gopher                                     **Never logged in**
ftp                                        **Never logged in**
nobody                                     **Never logged in**
vcsa                                       **Never logged in**
ntp                                        **Never logged in**
sshd                                       **Never logged in**
nscd                                       **Never logged in**
ldap                                       **Never logged in**
postfix                                    **Never logged in**
www                                        **Never logged in**
mysql                                      **Never logged in**

e2label

e2label命令用来设置第二扩展文件系统的卷标。

语法

e2label(参数)

参数

  • 文件系统:指定文件系统所对应的设备文件名;
  • 新卷标:为文件系统指定新卷标。

实例

许多用了多年Linux的人可能也没有用过e2label命令。但是这个命令相当有效。在介绍它之前,我们先看看/etc/fstab文件:

label=//ext3 defaults 1 1
/dev/hda7 /usr ext3 defaults 1 1

第二行的意思很容易懂,就是把/dev/hda7 mount/usr上。第一行没有指明分区,意思是把label(卷标)为/ 的分区mount到/上。这样写的好处在于即使如果把硬盘从主板上的ide0(hda) 换到ide2(hdc)上,系统仍然可以自动挂载正确的分区。通常Linux安装的时候已经自动指定了卷标。如果是手动增加的新分区,可以用下边的命令为 其指定卷标:

e2label /dev/hdax /new
mkdir /new

然后在/etc/fstab里加入:

label=/new  /new  ext3  defaults  1 1

下次重新起动机器的时候,就会把卷标为/new的分区挂接到/new上。