gdb的基本工作原理

还是面某M的时候,面试官问我:“用过gdb么?” 答:“用过,调了两年bug了”。“那好,给我解释下gdb是怎么工作的?或者说跟内核什么地方有关系?”。

是阿,gdb凭什么可以调试一个程序?凭什么能够接管一个程序的运行?我以前也想过这样的问题,但是后来居然忘记去查看了。我想到了我们的二进制翻译器,想到了intel的pin,Dynamo。这些都是将翻译后的代码放到codecache中去运行,然后接管整个程序的执行。gdb是不是也一样呢?

如果真是这样,为什么我记得用gdb跑一个程序,这个程序会有一个单独的进程?gdb的attach功能又是怎么实现的?

想了想,我还是没有答上来。面试就是由这么一个又一个细节的小杯具最后汇集成一个大杯具。

那么,gdb到底是凭什么接管的一个进程的执行呢?其实,很简单,通过一个系统调用:ptrace。ptrace系统调用的原型如下:

#include <sys/ptrace.h>
 
long ptrace(enum __ptrace_request request, pid_t pid,
                   void *addr, void *data);

说明:ptrace系统调用提供了一种方法来让父进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。 主要用来实现断点调试和系统调用跟踪。(man手册)

其实,说到这里,一切原理层面应该都比较明朗了(且先不去管内核中是怎么实现ptrace的)。gdb就是调用这个系统调用,然后通过一些参数来控制其他进程的执行的。

下面我们来看ptrace函数中request参数的一些主要选项:

PTRACE_TRACEME: 表示本进程将被其父进程跟踪,交付给这个进程的所有信号,即使信号是忽略处理的(除SIGKILL之外),都将使其停止,父进程将通过wait()获知这一情况。

这是什么意思呢?我们可以结合到gdb上来看。如果在gdb中run一个程序,首先gdb会fork一个子进程,然后该子进程调用ptrace系统 调用,参数就是PTRACE_TRACEME,然后调用一个exec执行程序。基本过程是这样,细节上可能会有出入。需要注意的是,这个选项PTRACE_TRACEME是由子进程调用的而不是父进程!

以下选项都是由父进程调用:

PTRACE_ATTACH:attach到一个指定的进程,使其成为当前进程跟踪的子进程,而子进程的行为等同于它进行了一次PTRACE_TRACEME操作。但是,需要注意的是,虽然当前进程成为被跟踪进程的父进程,但是子进程使用getppid()的到的仍将是其原始父进程的pid。

这下子gdb的attach功能也就明朗了。当你在gdb中使用attach命令来跟踪一个指定进程/线程的时候,gdb就自动成为改进程的父进程,而被跟踪的进程则使用了一次PTRACE_TRACEME,gdb也就顺理成章的接管了这个进程。

PTRACE_CONT:继续运行之前停止的子进程。可同时向子进程交付指定的信号。

这个选项呢,其实就相当于gdb中的continue命令。当你使用continue命令之后,一个被gdb停止的进程就能继续执行下去,如果有信号,信号也会被交付给子进程。

除了以上这几个选项,ptrace还有很多其他选项,可以在linux下阅读man手册:man ptrace

需要注意的另一点是,使用gdb调试过多线程/进程的人应该都知道,当子进程遇到一个信号的时候,gdb就会截获这个信号,并将子进程暂停下来。这是为什么呢?

实际上,在使用参数为PTRACE_TRACEME或PTRACE_ATTACH的ptrace系统调用建立调试关系之后,交付给目标程序的任何信 号(除SIGKILL之外)都将被gdb先行截获,或在远程调试中被gdbserver截获并通知gdb。gdb因此有机会对信号进行相应处理,并根据信 号的属性决定在继续目标程序运行时是否将之前截获的信号实际交付给目标程序。

参考资料:gdb的基本工作原理
《gdb pocket reference》

使用gdbserver远程调试

 

gdbserver工具

先确定默认crosstool交叉编译器是否有自带gdbserver,如果有就不需要自行编译。一般都会带有对应的gdbserver工具,可以通过find命令查找确定:

1
2
3
4
5
6
7
8
9
10
hong@ubuntu:~/work/system$ which arm-none-linux-gnueabi-gcc
/opt/arm-2009q3/bin/arm-none-linux-gnueabi-gcc
hong@ubuntu:~/work/emrock/emrock/system$ find /opt/arm-2009q3 -name gdbserver
/opt/arm-2009q3/arm-none-linux-gnueabi/libc/thumb2/usr/bin/gdbserver
/opt/arm-2009q3/arm-none-linux-gnueabi/libc/thumb2/usr/lib/bin/gdbserver
/opt/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/usr/bin/gdbserver
/opt/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/bin/gdbserver
/opt/arm-2009q3/arm-none-linux-gnueabi/libc/usr/bin/gdbserver
/opt/arm-2009q3/arm-none-linux-gnueabi/libc/usr/lib/bin/gdbserver
hong@ubuntu:~/work/system$

如果找到了就直接跳到步骤4,没有的话就需要自行编译了。

编译gdbserver

到GNU官方FTP下载, 下载地址:
http://ftp.gnu.org/gnu/gdb/

编译GDB源码时只需要编译出gdbserver就可以了

1
2
3
4
# cd gdb-6.7.1/gdb/gdbserver/
#./configure --host=arm-none-linux-gnueabi --prefix=/work/install/gdbserver
#make
#make install

这时会在/work/install/gdbserver目录下生成bin/gdbserver,将其拷贝到nfs文件系统

1
2
#cd /work/install/gdbserver
#cp bin/gdbserver /work/nfs/rootfs/bin

这里需要特别注意的是交叉编译的gdbserver和host调试用的gdb版本必须保证版本一致,否则会出现如下的问题:

1
2
3
4
5
hong@ubuntu:~/work/$ arm-none-linux-gnueabi-gdb ./ipcr002_debug
(gdb) target remote 192.168.0.178:1234
Remote debugging using 192.168.0.178:1234
Malformed packet(b) (missing colon): ore:0;
Packet: 'T050b:00000000;0d:80bdc3be;0f:b0070040;thread:5c21;core:0;'

产生这个问题时:编译gdbserver用的是gdb7.5,而arm-none-linux-gnueabi-gdb的版本是:

1
2
hong@ubuntu:~/work/system$ arm-none-linux-gnueabi-gdb --version
GNU gdb (Sourcery G++ Lite 2009q3-67) 6.8.50.20090630-cvs

而我使用交叉编译工具链自带的gdbserver就不会有这个问题。除了使用自带的gdbserver外,另一种解决办法就是重新从gdb源码编译arm-none-linux-gnueabi-gdb,这样也可以保证两者的版本一致。

库问题

这里需要注意的是运行gdbserver还需要libthread_db库,若你自己做的文件系统内没有这个库的话需要从交叉编译器内拷一个过去。

1
2
3
4
5
# gdbserver -h (target)
gdbserver: error while loading shared libraries: libthread_db.so.1: cannot open shared object file: No such file or directory
# cp -avf lib/libthread_db* /work/nfs/rootfs_bluetooth_omap/lib/
`/lib/libthread_db-1.0.so' -> `/work/nfs/rootfs/lib/libthread_db-1.0.so'
`/lib/libthread_db.so.1' -> `/work/nfs/rootfs/lib/libthread_db.so.1'

注:若不知道缺少什么库可以根据运行时错误提示拷贝或者用先用strace跟踪一下:
#strace -f -F -o strace.log gdbserver -h
#vi strace.log
发现如下字段:
872   writev(2, [{“gdbserver”, 9}, {“: “, 2}, {“error while loading shared libra”…, 36}, {“: “, 2}, {“libthread_db.so.1”, 17}, {“: “, 2}, {“cannot open shared object file”, 30}, {“: “, 2}, {“No such file or directory”, 25}, {“\n”, 1}], 10) = 126
872   exit_group(127)                   = ?
得知缺少libthread_db.so.1库(红色部分标出)。

调试过程

1)Target端建立远程调试服务
# gdbserver 192.168.0.29:1234 obexftp (target)
Process obexftp created; pid = 858
Listening on port 1234

其中IP地址为用来远程调试的上位机地址(现在直接被gdbserver忽略掉,所以可以不写),端口为target TCP 监听端口。目标程序不需要符号表,即可以是strip后的,这样可以节省存储空间,所有的符号信息处理都是在Host端的gdb处完成的。

2)Host端GDB加载要调试的程序
这里要调试的程序得是交叉编译过的,并且加了-g参数。不过大部分编译程序默认就是加了-g参数的,这点可以从编译时的log看出。

1
2
3
4
5
6
7
8
# arm-linux-gdb obexftp 
GNU gdb 6.6.50.20070301 (MontaVista 6.6.50-2.0.1.0702865 2007-03-26)
Copyright (C) 2007 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=armv5tl-montavista-linux-gnueabi"...

3)连接到目标板调试服务

1
2
3
4
5
(gdb) target remote 192.168.0.178:1234
Remote debugging using 192.168.0.178:1234
Error while reading shared library symbols:
Dwarf Error: Can't read DWARF data from '/opt/montavista/pro/devkit/arm/v5t_le/target/usr/lib/debug/lib/ld-2.5.90.so.debug' 
0x400007a0 in _start () from /opt/montavista/pro/devkit/arm/v5t_le/target/lib/ld-linux.so.3

注:上面两行错误信息暂时不用管,原因还不清楚,但是暂时发现不影响使用。
连接成功后ARM板上的信息应该是这样的:

1
2
3
# ./gdbserver 192.168.0.29:1234 obexftp 
Process obexftp  created; pid = 858
Remote debugging from host 192.168.0.29   # 这个ip地址是上位机的IP地址

上面这行表示宿主机和开发板连接成功。现在我们就可以在Host端像调试本地程序一样调试ARM板上程序。不过,需要注意的是这里执行程序要用“c”,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。
调试过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(gdb) b main
Breakpoint 1 at 0x9870: file obexftp.c, line 376.
(gdb) info b
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x00009870 in main at obexftp.c:376
(gdb) c
Continuing.
Error while mapping shared library sections:
/work/install/bluetooth//lib/libobexftp.so.0: No such file or directory.
Error while mapping shared library sections:
/work/install/bluetooth//lib/libc.so.6: No such file or directory.
Breakpoint 1, main (argc=1, argv=0xbed0dec4) at obexftp.c:384
384             if (strstr(argv[0], "ls") != NULL)      most_recent_cmd = 'l';
(gdb)

若产生这个错误主要是由于该调试的应用程序使用到了额外的库,而这个库在gdb默认的搜索路径内没有
(相对与远程调试,gdb默认搜索的路径即为交叉编译器的库路径,下面我会介绍到)
因此,这里我们需要修改一下gdb默认的共享库搜索路径。
修改的办法是设置GDB的环境变量:

1
2
3
4
5
6
7
8
9
10
11
hong@ubuntu:~/work/system$ arm-none-linux-gnueabi-gdb -q ipcr002_debug_gdb
(gdb) show solib-absolute-prefix
The current system root is "".
(gdb) show solib-search-path
The search path for loading non-absolute shared library symbol files is .
(gdb) set solib-absolute-prefix /opt/arm-2009q3/arm-none-linux-gnueabi/libc
(gdb) set solib-search-path /tftpboot/ak_ipc
(gdb) show solib-absolute-prefix
The current system root is "/opt/arm-2009q3/arm-none-linux-gnueabi/libc".
(gdb) show solib-search-path
The search path for loading non-absolute shared library symbol files is /tftpboot/ak_ipc.

solib-absolute-prefix设置的是被搜索文件路径的前缀,一般设置为交叉编译工具链的库路径前缀,即不包括lib目录,lib目录的父目录,solib-search-path设置的是被搜索库文件的路径。solib-search-path可以有多个路径,中间按用:隔开, solib-absolute-prefix的值只能有一个。若在solib-absolute-prefix指定的路径内没有搜索到库,则再继续尝试从solib-search-path指定的路径进行搜索。

1
2
3
4
5
6
7
8
hong@ubuntu:~$ ls -l /opt/arm-2009q3/arm-none-linux-gnueabi/libc
total 24
drwxr-xr-x  6 wenju wenju 4096 Oct 17  2009 armv4t
drwxr-xr-x  2 wenju wenju 4096 Oct 17  2009 etc
drwxr-xr-x  2 wenju wenju 4096 Oct 17  2009 lib  # 前缀为父目录,/lib/ld-linux.so .etc.
drwxr-xr-x  2 wenju wenju 4096 Oct 17  2009 sbin
drwxr-xr-x  6 wenju wenju 4096 Oct 17  2009 thumb2
drwxr-xr-x 10 wenju wenju 4096 Oct 17  2009 usr

这点倒有点类似于系统默认库搜索路径与LD_LIBRARY_PATH的关系。
详细参考GDB手册中相关部分:
http://wiki.chinaunix.net/index.php/GDB_Manual_15_1
设置好solib-search-path后再运行程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(gdb) set solib-search-path /work/install/bluetooth/lib/
(gdb) c
Continuing.
Error while reading shared library symbols:
Dwarf Error: Can't read DWARF data from '/opt/montavista/pro/devkit/arm/v5t_le/target/usr/lib/debug/lib/ld-2.5.90.so.debug'
Breakpoint 1, main (argc=1, argv=0xbe896eb4) at obexftp.c:384
384             if (strstr(argv[0], "ls") != NULL)      most_recent_cmd = 'l';
(gdb) l
379             char *output_file = NULL;
380             char *move_src = NULL;
381             /* char *inbox; */
382
383             /* preset mode of operation depending on our name */
384             if (strstr(argv[0], "ls") != NULL)      most_recent_cmd = 'l';
385             if (strstr(argv[0], "get") != NULL)     most_recent_cmd = 'g';
386             if (strstr(argv[0], "put") != NULL)     most_recent_cmd = 'p';
387             if (strstr(argv[0], "rm") != NULL)      most_recent_cmd = 'k';
388
(gdb)

运行成功

注:使用GDB调试时查看代码不是很方便。CLWEN使用VIM作为GDB前端界面,结合gdb的远程调试功能,动态的将程序当前运行的代码显示在VIM上,查看起来十分方便。其远程调试方法和GDB+GDB Server一样,但是多了一个GUI界面(VIM)。

根据红帽RHEL7官方文档对centos7进行技术剖析(三)

Author by :xxbAndy
Blog:http://my.oschina.net/xxbAndy/blog
QQ:371990778
第一章:高级网络配置
1.虚拟网卡的添加
ifconfig eth0:1 10.0.0.2 netmask 255.255.255.0 临时添加虚拟网卡
永久保存虚拟网卡,必须在配置文件中写ifcfg-eth0/1
//注意:NetworkManager 是不支持桥接和虚拟接口。但是在centos7中NetworkManager工具完美的兼容了/etc/sysconfig/network-scripts/下的网络配置文件,并且支持了bond和桥接网络。

2.网络接口的配置-bonding
使用bonding 内核模块和成为通道绑定接口的特殊网络接口将多个网络接口绑定到一个通道
主动备份配置
模式0平衡轮循:将两块网卡合为一起,在所有slave中传输包,端口为之和
模式1主动备份:一次只能使用一个slave接口,如果接口出现故障,另外一个接管
模式2容错模式:可以防止局域网的网络风暴
(1)建立绑定接口bond
vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.0.57
NETMASK=255.255.25.0
GATEWAY=192.168.0.253
BONDING_OPTS=”mode=1 miimon=50″   模式1 50毫秒换接口
vim /etc/sysconfig/network-scripts/ifcfg-eth0/1
DEVICE=eth0/1
ONBOOT=yes
SLAVE=yes
BOOTPROTO=none
MASTER=bond0
USERCTL=no

//配置系统加载bonding模块
vim /etc/modprobe.d/bonding.conf
alias bond0 bonging
//附加slave接口到bond0
vim /etc/rc.d/rc.local
ifenslave bond0 eth0 eth1

重启网卡(service network restart /systemctl restart network)

修改内核参数
watch /proc/net/bonding/bond0

测试:使用ifdown/up eth0/1 查看bond0使用的网卡接口

3. 网络接口禁止ping(内核中的文件,但是开启后就会失效—修改sysctl)
内核功能参数(内核启动参数在/boot)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all    //只是暂时生效
sysctl -p 查看已经生效的配置,让配置文件中的配置立即生效
sysctl -a 查看可以修改的配置
sysctl -w  修改立即生效  ,让配置中没有的配置立即生效
sysctl -e 让
添加到/etc/sysctl.conf  sysctl -p 立即生效
4.静态路由的配置
ip route show 显示系统路由表
启用内核路由功能:sysctl -e net.ipv4.ip_forward=1
//临时修改静态路由配置
ip route add 10.0.0.0/24 via 192.168.0.22
ip route add 192.168.0.0/24 dev eth0
ip route add default via 192.168.0.253 dev eth0 (给本机添加默认路由)

[root@desktop Desktop]# ip route show
10.0.0.0/24 via 192.168.0.22 dev eth0
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.22
169.254.0.0/16 dev eth0  scope link  metric 1002

//永久静态路由修改配置
vim /etc/sysconfig/network-scripts/route-eth0
ADDRESS0=10.0.0.0               因为可以添加多条路由,因此从0开始
NETMASK0=255.255.255.0
GATEWAY0=192.168.0.22
ip route del 10.0.0.0/24 via 192.168.0.22   //删除静态路由
注意; 还必须得删除配置文件哦
第二章:红帽虚拟化的使用
virt-manager
虚拟机的远程安装 可以用ssh -X 192.168.0.22
virt-install –vnc –vncport=7000 –vnclisten=192.168.0.22(宿主机) –prompt
远程交互式安装虚拟机

然后可以使用其他主机vncviewer 192.168.0.22:7000 远程安装!

第三章:squid代理服务器

简介:流行的代理服务器和Web缓存服务器,从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度,到为一组人共享网络资源而缓存万维网,域名系统和其他网络搜索,到通过过滤流量帮助网络安全,到局域网通过代理上网。
优点:
对于Web用户来说,Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Internet的速度,提高客户机的访问命中率。Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
Squid的另一个优越性在于它使用访问控制清单(ACL)和访问权限清单(ARL)。访问控制清单和访问权限清单通过阻止特定的网络连接来减少潜在的Internet非法连接,可以使用这些清单来确保内部网的主机无法访问有威胁的或不适宜的站点

都是作为缓冲服务器,但是有两种,并且几种方式
正向代理
a.标准的代理缓冲服务器
一个标准的代理缓冲服务被用于缓存静态的网页(例如:html文件和图片文件等)到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访 问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实 现这种方式,必须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号。客户端上网时,每次都把请求送给代理服务器处理,代理服务器根据请求 确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然 后将文件发给客户端浏览器。
b.  透明代理缓冲服务器
透明代理缓冲服务和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览 器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地 有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于Linux操作系统来 说,透明代理使用Iptables或者Ipchains实现。因为不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商) 特别有用。
反向代理:
a.  反向代理缓冲服务器
反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防 止原始服务器过载。它位于本地WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如 果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后 再发送给用户。这种方式通过降低了向WEB服务器的请求数从而降低了WEB服务器的负载。

正向代理加速(一个可以访问外网,一个属于局域网)
squid的功能:在企业中减少网络压力,直接从缓存中提取你所要访问的内容

标准的代理缓冲服务器:
配置网络环境:
1.添加新网卡,在udev中删除相关的网卡设备标识,然后重新启动主机。
添加网卡成功!
[root@localhost network-scripts]# cat ifcfg-eth1  (内网私有)
DEVICE=eth1
IPADDR=20.0.0.1                                   内网访问外网的网关
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=none

[root@localhost network-scripts]# cat ifcfg-eth0    真实网卡(通向外网)
DEVICE=eth0
IPADDR=192.168.0.75
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=none
GATEWAY=192.168.0.253
DNS1=192.168.0.253

2.编写网卡配置文件
安装squid软件:
配置squid服务
squid配置文件,从上到下读取,匹配则通过,
所以,先允许后拒绝。
acl okclient src 20.0.0.0/24
http_access allow okclient
打开缓存目录
cache_dir ufs /var/spool/squid 100 16 256
把外网的文件放在squid的缓存目录,内网主机借助缓存文件访问外网256个缓存子目录,最大100M

启动squid服务,查看端口
查看缓存目录的以及目录和二级目录
3.修改内网使用praxy代理
在代理设置代理网关和端口。20.0.0.1
设置内网IP:               不需用网关
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=20.0.0.88
NETMASK=255.255.255.0

4.拒绝访问特定站点:

修改配置squid配置文件
acl badnet dstdomain www.qq.com
http_access deny badnet  最好放在刚才的allow前面,自己理解去
注意:squid重启比较慢,可以直接reload加载配置文件

注意:localnet后面包含了很多ip,所以啊,deny必须放在合适的位置才能生效

在squid的文档中查找其他的应用:禁止http访问。。。。。
/usr/share/doc/squid-3.1.10/squid.conf.documented
注意:使用了代理服务器后,使用那个关闭后只能关闭internet选项才能上网

 

5.CDN反向代理加速
curl -I www.qq.com  查看自己访问的额是那个服务器
使用ssh不快的时候可以加/etc/hosts
假使一个是本地缓存,另外一个是真正的服务器
思考:反响代理和正向代理的区别(好像是加速的人不一样啊)
重新安装squid
配置文件,允许所有人访问;修改端口为80.

解决硬盘读取速度的瓶颈:
要使系统当中读取速度不受硬盘的影响,可以将文件挂载在内存当中
一般在/dev/shm都是挂载在内存上的目录
可以分别在/dev/shm和/mnt下截取大文件,查看速度
继续安装配置squid
http_access allow all
http_port 80 vhost
cache_peer 192.168.0.57 parent 80 0 no-query originserver

其中57主机作为web服务器,squid服务器只作为一个缓存服务器
icp端口,用来通知备用squid的
在squid中需要在端口加vhost
Memcached(缓存系统)自动推送,主服务器自动向squid缓存推送更新文件。

6.squid 负载均衡(基于域名的负载均衡)
squid’代理主机一定注意自己的解析
客户端必须得有域名的解析
两个web后端,提供服务
用squid做负载
http_port 80 vhost vport
cache_peer 192.168.0.57 parent 80 0 no-query originserver name=a round-robin
cache_peer 192.168.0.73 parent 80 0 no-query originserver name=b round-robin
cache_peer_domain a b www.xxb.com
在客户端要能够解析到www.xxb.com
感悟:淘宝和新浪的薪资标准,从访问的速度上就可以看出,理解到

 
第四章:DNS环境的搭建
[root@master125 ~]# yum install bind -y    安装DNS环境。
1.构建缓存DNS

options {
//      listen-on port 53 { 127.0.0.1; };
//      listen-on-v6 port 53 { ::1; };
directory       “/var/named”;
dump-file       “/var/named/data/cache_dump.db”;
statistics-file “/var/named/data/named_stats.txt”;
memstatistics-file “/var/named/data/named_mem_stats.txt”;
//      allow-query     { localhost; };
forwarders      { 172.25.254.250; }; 反转DNS(真实)
dnssec-validation no;

[root@master125 ~]# systemctl restart named
重启服务。
在客户端设置DNS,使用域名
访 问主机,首先,主机会从本地/etc/hosts文件查询,如果有记录就会返回,没有记录就会像125的DNS主机(缓存DNS)上查询,如果125主机 没有记录,就会去250(下一个DNS)上面查询,并且将查询结果缓存到125主机上。这样就实现了125下的所有主机通过125上网了。。。

 

2.简单DNS正向解析的环境搭建
(主配置文件/etc/resov.conf中需要可以取消掉forwarders)
[root@master125 ~]# vim /etc/named.rfc1912.zones   配置需要维护的域
zone “xxbandy.com” IN {
type master;
file “xxbandy.com”;
allow-update { none; };
};

[root@master125 named]# cp -p /var/named/named.localhost /var/named/xxbandy.com

[root@master125 named]# vim /var/named/xxbandy.com
$TTL 1D
@       IN SOA  dns.xxbandy.com. echo.xxbandy.com. (
0       ; serial
1D      ; refresh
1H      ; retry
1W      ; expire
3H )    ; minimum
NS      dns.xxbandy.com.
dns     A       172.25.254.125
bbs     A       172.25.254.126
news    A       172.25.254.127
www     A       172.25.254.128
hello   A       172.25.254.129

[root@master125 named]# systemctl restart named
[root@master125 named]# ping www.xxbandy.com
PING www.xxbandy.com (172.25.254.128) 56(84) bytes of data.
64 bytes from 172.25.254.128: icmp_seq=1 ttl=64 time=2.24 ms

[root@master125 named]# dig www.xxbandy.com

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> www.xxbandy.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56091
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.xxbandy.com.  IN A

;; ANSWER SECTION:
www.xxbandy.com. 86400 IN A 172.25.254.128

;; AUTHORITY SECTION:
xxbandy.com.  86400 IN NS dns.xxbandy.com.

;; ADDITIONAL SECTION:
dns.xxbandy.com. 86400 IN A 172.25.254.125

;; Query time: 3 msec
;; SERVER: 172.25.254.125#53(172.25.254.125)
;; WHEN: Mon Jan 26 11:32:52 CST 2015
;; MSG SIZE  rcvd: 94
注意:防火墙(iptables)的影响是灰常重要滴呦,否则客户端是不能访问到你所搭建的DNS服务的。
3.简单反向解析(PTR记录)的环境搭建

[root@master125 named]# vim /etc/named.rfc1912.zones
zone “254.25.172.in-addr.arpa” IN {
type master;
file “xxbandy.ptr”;
allow-update { none; };
};
[root@master125 named]# cp -p /var/named/named.loopback /var/named/xxbandy.ptr

[root@master125 named]# vim /var/named/xxbandy.ptr
$TTL 1D
@       IN SOA  dns.xxbandy.com echo.xxbandy.com. (
0       ; serial
1D      ; refresh
1H      ; retry
1W      ; expire
3H )    ; minimum
NS      dns.xxbandy.com.
A       172.25.254.125
124     PTR     dns.xxbandy.com.
125     PTR     dns.xxbanwwdy.com.
126     PTR     dns.xxb123.com.
127     PTR     dns.xxb.com.
128     PTR     dns.andy.com.
129     PTR     dns.hello.com.
[root@master125 named]# systemctl restart named
[root@master125 named]# dig -x 172.25.254.126

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> -x 172.25.254.126
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9124
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;126.254.25.172.in-addr.arpa. IN PTR

;; ANSWER SECTION:
126.254.25.172.in-addr.arpa. 86400 IN PTR dns.xxb123.com.

;; AUTHORITY SECTION:
254.25.172.in-addr.arpa. 86400 IN NS dns.xxbandy.com.

;; ADDITIONAL SECTION:
dns.xxbandy.com. 86400 IN A 172.25.254.125

;; Query time: 0 msec
;; SERVER: 172.25.254.125#53(172.25.254.125)
;; WHEN: Mon Jan 26 11:47:34 CST 2015
;; MSG SIZE  rcvd: 126
4.DNS双向解析

 

5.辅助DNS搭建
辅助的添加指定:
zone “xxbandy.com” IN {
type slave;
masters { 172.25.254.125; };
file “slaves/xxbandy.com”;
allow-update { none; };
};

 

主DNS的修改:
zone “xxbandy.com” IN {
type master;
file “xxbandy.com”;
allow-update { none; };
allow-transfer { 172.25.254.196; };
also-notify { 172.25.254.196; };
};
重启两个DNS的named服务,此时发现辅助196主机中的/var/named/slaves中生成域文件.
(注意:selinux的影响是很大很大滴)

6.客户端更新DNS
首先在DNS服务器端进行修改参数
# vim /etc/named.rfc1912.zones
modify:
allow-update { 172.25.254.254;};
重启服务

#nsupdate
>server 172.25.254.125
>update add lala.xxbandy.com 86400 A 172.25.254.244
>send
>quit

注意;master中的防火墙,selinux以及权限的影响
第一次更新可能会出现问题,因为要在DNS主机生成一个xxbandy.com.jnl的文件,但是/var/named 默认对named用户不可写。(修改权限后进行重启服务)

客户端更新成功后会在DNS主机里的xxbandy.com.jnl文件写进更新的信息。服务重启后会加载到xxbandy.com里面。

7.使用key更新DNS
仅允许有KEY文件的主机进行更新。
7.1key的制作
# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST xxb
Kxxb.+157+57928   生成的key

#cat  Kxxb.+157+57928.key 查看key秘钥

#cp /etc/rndc.key -p /etc/xxb.key
#vim /etc/xxb.key
key xxb {  指定key的名字
algorithm hmac-md5;
secret “Jq8ndMbhTPa2Ecz6P4u4GA==”; 修改key
};

//将key文件导入dns配置文件
修改域文件
vim named.rfc1912.zones
allow-update { key xxb ;};
修改主配置文件,导入key
vim named.conf
include “/etc/xxb.key”;
重启dns服务器   成功则配置完毕
//注意:只要是dns下的配置文件,大多都是要以named身份运行的,勤看日志哦
然后将生成的key文件远程拷贝到客户端。

注意:dns的key更新在6里面对时间的问题要求是很严格滴
(需要更新时间哦)
客户端key更新:
##nsupdate -k Kxxb.+157+39653.private
>server 192.168.0.75  //DNS服务器
>update  add xue.example.com 86400 A 192.168.0.22
>send
>quit
注意:若果更新出现问题,注意查看dns主机的日志信息。
DDNS
ddns(dhcp+dns)  花生壳,动态域名解析
DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负、责提供DNS服务并实现动态域名解析
1.前提:先配置基本的dncp和bind服务,然后
修改两方的配置文件,整合dns和dncp
echo > /var/tail/message 清空日志
2. dns的key更新
create key:
dnssec-keygen -a HMAC-md5 -b 128 -n HOST  key-name
cat %^&%^&.private/.key
cp -p rndc.key key-name.key
vim key-name.key 修改名字和加密字符串
配置named.conf
vim named.conf //include “/etc/xxb.key”
vim named.rfrc1217.zones // allow-update { key xxb;};
//注意:一定让named目录可写
测试dns的key更新,拷贝钥匙文件
##nsupdate -k 私钥

3.将key整合到dhcp
man 5 dhcpd.conf 查看添加dhcp 到zones
允许dns更新dncp
修改dhcp配置:
vim dhcpd.conf
ddns-update-style interim;   // tail /var/lib/dhcpd/dhcpd.leases 查看dhcp租用
key xxb {                   //xxb 为dns验证文件
algorithm hmac-md5;
secret UESJCvqtWk/tEdfGZz865A==;  //生成的验证
};

zone xxbandy.com {
primary 192.168.2.22;
key xxb;
}

4.客户端修改(客户端有固定的主机名,比如cacti.example.com)
删除dhcp里的eth-0文件
vim /etc/dhcp/dhcpd.conf
send fqdn.fqdn “cacti.example.com.”;
send fqdn.encoded on;
send fqdn.server-update on;
测试:重启dns和dhcp服务器
在客户端一直dig cacti.example.com 会发现,ip不固定,但是主机名cacti.example.com是固定的

 

ddns组网原理
C/S结构:
DDNS 客户端:需要动态更新域名和IP地址对应关系的设备。Internet用户通常通过域名访问提供应用层服务的服务器,如HTTP、FTP服务器。为了保证 IP地址变化时,仍然可以通过域名访问这些服务器,当服务器的IP地址发生变化时,它们将作为DDNS客户端,向DDNS服务器发送更新域名和IP地址对 应关系的DDNS更新请求。
DDNS服务器:负责通知DNS服务器动态更新域名和IP地址之间的对应关系。接收到DDNS客户端的更新请求 后,DDNS服务器通知DNS服务器重新建立域名和IP地址之间的对应关系。从而保证即使DDNS客户端的IP地址改变,Internet用户仍然可以通 过同样的域名访问DDNS客户端。
“好像是后端有个ddns,然后让web服务器放在(所谓的客户端)而其他用户访问这个客户端域名是固定的”

第五章:GPG文件加密
//一:使用DnuPG加密文件:
加密是一种可保护在系统上存储或者通过网络传输的数据免受损坏的技术,用来验证来自特定人员的数据是否经过修改,可以维护数据的机密性。
几种加密方式:kerbers(使用对称加密【基于作为共享密钥的密码】验证用户身份)
TLS/SSL(保护网络服务)或LUKS(保护块设备上的文件系统)
GPG用于文件的加密(原理类似银行用的优盾)
原理:服务端生成公/私钥,将死公钥到给客户端,客户端将文件加密导入服务端
gpg选项:
删除密钥:gpg –delete-secret-keys keyname
生成密钥对:gpg –gen-key
列出公钥:gpg –list-keys
[root@desktop .ssh]# gpg –list-keys
/root/.gnupg/pubring.gpg
————————
pub   2048R/E2E76909 2014-03-22
uid                  westos (hello) <weichuangxxb@sina.cn>
sub   2048R/FC052B9F 2014-03-22
导出公钥:
[root@desktop .ssh]# gpg -a -o pub.key –export E2E76909
将公钥传到客户端
[root@desktop .ssh]# scp pub.key 192.168.0.24:/mnt/

在客户端导出公钥
[root@www mnt]# gpg –import pub.key
gpg: key E2E76909: public key “westos (hello) <weichuangxxb@sina.cn>” imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
查看下公钥id
[root@www mnt]# gpg –list-keys
[root@www mnt]# gpg –encrypt –armor -r E2E76909 hello  //对文件hello进行加密生成.asc文件
上传到服务器端:
[root@www mnt]# scp hello.asc 192.168.0.132:/mnt

在服务器端进行解密查看文件内容
[root@desktop mnt]# gpg –decrypt hello.asc

//二:yum插件管理
1:软件插件管理
yum install yum-plugin-verify
rpm -K 软件包  用来校验软件包是否被人修改

屏蔽软件包
yum install  yum-plugin-versionlock -y
vim /etc/yum/pluginconf.d/versionlock.list
epoch:httpd-2.2.15-15.el6_2.1.x86_64
vim yum.conf   屏蔽某一类软件
exclude=*.i686

2: 软件包构建
2.1.构建rpm包
若要构建RPM包,首先必须确定内部版本规则文件或spec文件,spec文件是包含关于如何构建可安装的RPM软件包的信息的文本文件。
rpm -qlp 软件包  查看软件包安装的目录文件。。。
(软件安装的路径,以及各种安装参数)
软件安装rpm-build -y
简单构建一个命令脚本,执行系统命令hello
首先创建一个脚本,然后做成一个压缩包
编写.spec文件,来修改声明包的各种属性以及安装!
最后,构建rpm包
rpmbuild -ba filename.spec  (可能会出现报错哦)
//将软件压缩包和spec文件放到SOURCES和SPECS里面
2.2.发布rpm软件包
创建yum存储库
yum install createrepo -y
cp *.rpm /mnt
cd /mnt
createrepo .

mkdir -p /var/ftp/pub/repo/Packages
cp *.rpm /var/ftp/pub/repo/Packages
createrepo -v /var/ftp/pub/repo/
配置yum
baseurl=file:///var/ftp/pub/repo

//三: 网络端口检测
netstat -antlp  本机监控

nmap 远程监控
-sP  ping响应
-sT tcp
-sU udp

tcpdump软件
tcpdump
wireshark抓包工具
检测网络端口
netstat -tulnp
-t – tcp 协议或开放 TCP 端口
-u – udp 协议或开放 UDP 端口
-l – 仅侦听端口,而非活动、已建立的连接
-n – 按编号而非名称显示主机和端口
-p – 显示控制端口的本地进程

检测远程服务
A 表示检测os
nmap 实用程序是一个端口扫描器,可探测远程系统并显示关于哪些端口处于开放状态的信息。这可帮助您
确定是否有意外服务正在运行或您管理的系统上是否有可用端口。
[root@server1 ~]# nmap -A -sT server1
系统
nmap 选项:
-sP – 执行 ping 扫描,以确定响应 ICMP ping 请求的主机
-sT – 执行 TCP 连接扫描
-sU – 执行 UDP 扫描(可能需要很长时间)
-p – 限制到特定端口,这对于 UDP 扫描尤其有用
-A – 启用 OS 检测和版本检测、脚本扫描和跟踪路由
-v – 详细(使用多个 -v 使其更加详细

Avahi服务,零配置网络(不通过网卡),Avahi 可实施 Zeroconf (零配置网络)服务。 Zeroconf 允许位于同一广播域中的计算机进行通信和发现
彼此的服务,而无需静态联网、 DHCP 或其他明确配置。
一般不安全,把它禁掉
[root@server55 ~]# chkconfig avahi-daemon –list
avahi-daemon    0:off 1:off 2:off 3:on 4:on 5:on 6:off
[root@server55 ~]# chkconfig avahi-daemon off

捕获和分析网络通信
一个是简单有强大的 tcpdump (只捕获封包),另一个是 Wireshark 实用程序(可
捕获并解析网络通信,以进行更深入的分析)
列出所有可用捕获接口:
# tcpdump -D
捕获所有 SSH 网络通信:
# tcpdump -nn -l -s 2000 -w packets -i eth0 ‘port 22’
1. -nn = 显示为数值的所有内容(包括端口和协议)
2. -l = 对文件执行行缓冲
3. -s snap_len = 要输出的每个封包的最大字节数
4. -w filename = 要写入输出的文件
5. -i interface = 要捕获的接口
6. filter = 用于过滤封包的关键字和逻辑运算符(如‘ host desktopX.example.com and port 25’

注意:wireshark 必须在dvd.repo下载
通过 wireshark 分析网络封包
启动 httpd 服务
# service httpd start

确定端口 80 的状态:
# netstat -tulnp |grep ‘:80’

扫描特定端口 80 :
# nmap -sT serverX

使用 tcpdump 捕获 HTTP 封包:
# tcpdump -nn -l -s 2048 -w /tmp/http.dump -i eth0 ‘port 80’ &

打开浏览器访问 http 服务:
# firefox http://serverX.example.com &

停止 tcpdump :
# killall tcpdump

安装 wireshark-gnome 软件包,并分析 tcpdump 捕获文件:
# yum install -y wireshark-gnome
# wireshark /tmp/http.dump

 

 

 
//四: NTP服务
修改ntp.conf
server 127.127.1.0
/etc/init.d/ntpd restart
ntpq -p      查看系统主板时间(前面有*就可以了)
然后ntp服务器就搭建好了
测试:
在客户端ntp.conf 中编写
server 192.168.0.22 ibrust (上面ntp服务的主机)
/etc/init.d/ntpd restart
/etc/init.d/ntpdate restart
ntpq -p 查看当前的ntp服务器是谁
date 发现时间同步了

//五章:日志同步服务
问题:在企业中管理其他服务器,可以直接将日志自动推送到一个日志服务器上面
服务器修改:
修改/etc/rsyslog.conf文件
$ModLoad imudp    //取消注释,使用udp协议传输日志
$UDPServerRun 514
/etc/init.d/rsyslog  restart

客户端修改:
修改/etc/rsyslog.conf文件
*.*                                     @192.168.0.22
udp一个@
tcp两个@
重启日志服务

测试:logger xxb
在服务器端发现日志

//五:网络存储iscsi存储
数据库的备份(可以对一个目录进行备份,使用bacula备份软件
)
mysqldump -u root -pwestos emial > /mnt/email.sql
数据恢复 mysql emial < email.sql
数据库中的文件一般是存在/var/lib/mysql
问题:当企业集群到一定程度的时候会将数据专门存放在固定的存储上,以实现共享
因而保证数据的安全可靠性。

解决办法:iscsi网络存储的搭建
服务器端软件:scsi-target
客户端软件:iscsi-initartor-utils
主配置文件:/etc/tgt/targets.conf
/etc/init.d/tgtd restart

客户端访问:
iscsiadm -m discovery -t st -p 192.168.0.22
iscsiadm -m mode -T target-name -p 192.168.0.22 -l(-u) 登录(推出)

//无密码访问
主机之间无密码访问
ssh-keygen 生成密钥对,一致enter
ssh-copy-id -i &&&.pub root@192.168.0.24
实现访问无密码
必要时需要修改(/etc/ssh/sshd_config)
第六章:samba服务共享
//selinx 开启
软件安装:samba-common samba-client samba
samba用户必须是系统用户哦
给系统用户samba的权限以及密码:smbpasswd -a username  增加samba用户
登录:smbclient //IP/dir -U username
-L 显示当前共享的信息

修改selinux值(selinux如果是enforcing不能查看家目录和上传)
samba文件上传
[root@www xxb]# getsebool -a | grep samba
[root@www xxb]# setsebool -P samba_enable_home_dirs on
上传只能用!s显示的文件以及目录
主配置文件/etc/samba/smb.conf
安全级别=share/user

pdbedit -L 查看当前samba用户
selinux对samba的影响
注意://
//新建的共享目录必须修selinux的samba_share的属性
[root@www samba]# yum whatprovides */semanage
semanage 命令用来永久修改sebool值
chcon -R 用来短时间修改sebool值
semanage fcontext -l  显示安全上下文
semanage fcontext -a -t samba_share_t ‘/share(/.*)?’
restorecon -RvvF /share/

仍然上传不了,目录权限的问题
[root@www company]# ll -d /company/
drwxr-xr-x. 5 root root 4096 Mar 19 07:47 /company/
方式1.将目录权限改为775
方式2.
samba用户上传默认使用nobody,因此可以只用nobody或者相关的用户访问就行
可以使用acl,限制特定用户访问
setfacl -m u:nobody:rwx /company
setfacl -m u:hello:rwx /company
对共享目录使用acl权限
acl的线性比较好,也就是说比较连续,稳定。

主配置文件中的public选项用来指定用户是否可以直接访问
注意:安全级别share和user的区别
browseable = no 可以对用户隐藏部分文件。14257571

write list =@westos

admin users =  xxb   设置管理账户,将此用户在samba中提升为root用户
smbpasswd -a username
案例:
用samba管理一个集团
将各个部分的信息共享出来,
但是总部可以看到所有的信息,而其他部分只能看到并且修改自己的目录browseable
可以互相浏览其他人的文件
mkdir /company
mkdir /company/caiwu
mkdir /company/xiaoshou
mkdir /company/hello
在共享的时候可以将第一个目录设置browserable=no
然后可以给后面的每个共享目录增加用户设置
valid user = CW
valid user = XS
valid user = HE
第七章:nfs网络共享服务
# yum install nfs-utils -y
# /etc/init.d/nfs restart
不能重启服务,必须先安装rpcbind并且开启(因为nfs服务是需用rpc远程调用来启动的)

# yum install rpcbind -y
# /etc/init.d/rpcbind restart   RPC服务必须先启动
# /etc/init.d/nfs restart

NFS服务器端配置:
# vim /etc/exports (/mnt  *(rw,no_root_squash))
# exportfs -rv
exporting *:/mnt

# showmount -e 192.168.0.11
Export list for 192.168.0.11:
/mnt *
# iptables -F  当共享机链接不上关掉防火墙
注意:selinux以及iptables都会影响服务的正常使用
客户端:
# showmount -e 192.168.0.11
Export list for 192.168.0.11:
/mnt 192.168.0.0/24
# mount 192.168.0.11:/mnt /mnt
# touch /mnt/xxb
touch: cannot touch `xxb’: Read-only file system     加rw权限(在服务机的/etc/exports上增加)
touch: cannot touch `xxb’: Permission denied         修改nfs-server上/mnt的可写权限
# touch xxb
# ll
-rw-r–r– 1 nfsnobody nfsnobody     0 Dec 23 01:53 xxb      (用户是其他所以777)
怎样让共享机的用户不改仍然是root
首先增加(no_root_aquash)
如果还不行
在共享机上添加,因为默认是版本4,有的是3
[root@server73 ~]# mount -o vers=3 192.168.0.11:/mnt /mnt/
[root@server73 ~]# cd /mnt/
[root@server73 mnt]# touch xub

怎样绑定端口,让防火墙更好的监控
# rpcinfo -p   查看nfs的网络端口
# /etc/init.d/nfs restart     都成功重启
# rpcinfo -p                     发现端口都是动态的

# vim /etc/sysconfig/nfs    修改tcp,udp,和mount端口
[root@server73 ~]# rpcinfo -p
100021    1   udp   3500  nlockmgr
100021    3   udp   3500  nlockmgr
100021    4   udp   3500  nlockmgr
100021    1   tcp   3000  nlockmgr
100021    3   tcp   3000  nlockmgr
100021    4   tcp   3000  nlockmgr
100005    1   udp   4000  mountd
100005    1   tcp   4000  mountd
100005    2   udp   4000  mountd
100005    2   tcp   4000  mountd
100005    3   udp   4000  mountd
100005    3   tcp   4000  mountd
#yum install autofs -y
安装自动挂载文件系统:
# vim /etc/auto.master   增加/mnt   /etc/auto.mnt
# vim /etc/auto.mnt         pub   192.168.0.11:/mnt
# /etc/init.d/autofs restart
挂载的真实文件就是#mount 192.168.0.11:/mnt /mnt/pub
查看某个服务的配置文件
/etc/sysconfig/autofs  //修改默认自动挂载时间

第八章:网络知识以及磁盘加密
1.网络知识
使用nat方式上网,当上网数据大时候,会造成一定的堵塞(因为nat的方式会使网络造成多个路由)
因此一般使用的是桥接方式上网
snat
dnat
ip addr show eth0 显示当前设备信息
ip -s link show eth0
vim  /etc/hosts  编写本地解析文件,类似于DNS
vim /etc/resolv.conf  添加DNS服务器地址
注意:DNS服务器的原理,默认先从本地hosts文件检测域名解析,如果没有在去DNS主机寻找。(可以修改/etc/nsswitch.conf文件来改变优先顺序)
nameserver   要查询名称服务器的IP,可以最多指定三个(192.168.0.254)
search      尝试使用较短的主机名的域名列表(example.com)
注意:网络配置工具和文件配置网络是冲突的,两者不能同时启用
tracroute 查看路由状态

网络桥接模式
首先必须得会配置网卡文件
vim /etc/sysconfig/network-scripts/ifcfg-interface
两种分配模式:
1.dhcp   自动获取IP和DNS
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
2.static
DEVICE=eth0
BOOTPROTO=none | static
ONBOOT=yes
IPADDR=192.168.0.X
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
DNS1=192.168.0.254
配置桥接端口:
编写vim /etc/sysconfig/network-scripts/ifcfg-br0
可以复制修改哦
DEVICE=eth0
BRIDGE=br0
BOOTPROTO=none
ONBOOT=YES
编写br0
DEVICE=br0
BOOTPROTO=none | static
TYPE=Bridge
ONBOOT=yes
IPADDR=192.168.0.X
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
DNS1=192.168.0.254
注意:brctl show 的命令使用啊
当重新添加网卡,但是不识别的时候可以修改:/etc/udev/rules.d/70-present-net.rules
2.对分区进行加密
文件系统一下的加密很难破解
加密分区当分区破解后,数据也会破坏的(加密在文件系统底层)
1.新建一个分区,先不要格式化,使用crypt加密,并且设置密码
cryptsetup luksFormat /dev/vdsX
使用大写YES
添加密码后加密成功,但是这个时候会枷锁,不能读写
2.打开设备
cryptsetup luksOpen /dev/vdsX disk    会将加密卷解锁为/dev/mapper/disk
ll /dev/mapper/disk   查看设备的信息

注意:现在进行格式化必须格式化加密底层的东西
3.格式化加密设备
mkfs.ext4 /dev/mapper/disk    在解密的卷上创建ext4文件系统
mount /dev/mapper/disk /xxb
现在可以进行读写设备
umount /dev/mapper/disk
4.关闭锁子
cryptsetup luksClose disk
完成整个加密解密过程

注意:当lucks加密,但是没开锁的时候,你不知的是否加密了
可以使用直接挂载尝试一下
最好不要直接格式化分区啊,否则很么都没有了啊(安全性就达到了,试问谁会为了数据去把东西格式化 啊)
应用实例:(比如U盾,就是用来加密的,因为银行的服务器是安全的,只有用户的东西需要)

不想加密了,就直接删除分区吧

5.永久挂载加密分区
1>编写/etc/fstab文件
/dev/mapper/name(disk)   /xxb   ext4  defaults 1 2
2>编写加密文件/etc/crypttab
name(disk)   /dev/sdbN(/dev/sdb1)   none(/etc/cryptpasswd)
注意,解锁密码文件如果不写,开机会提示输入密码
3>创建秘密文件(注意:确保文件归root所有,并且模式为600)
echo westos > /etc/cryptpasswd
chown root /etc/cryptpasswd
chmod 600 /etc/cryptpasswd
cryptsetup luksAddKey /dev/sdb1 /etc/cryptpasswd   输入密码

6.管理swap分区以及逻辑分区的建立与管理(LVM是在执行init初始化的时候激活的)
1>创建lvm
/dev/sda5
pv : pvcreate /dev/sdbN
vg : vgcreate  vgxxb /dev/sdbN
lv : lvcreate  -L 500M -n lvxxb vgxxb
mkfs.ext4 /dev/vgxxb/lvxxb
使用lvm装虚拟机,做一个base主机
使用快照备份虚拟机,lvcreate -L 500M -n vm1 -s /dev/vgxxb/lvxxb
mount /dev/vgxxb/lvxxb /mnt
2>拉伸lvxxb(拉伸后文件系统不会立即识别,需要通知)
lvextend -L 1024M /dev/vgxxb/lvxxb 扩展到10024m
resize2fs /dev/vgxxb/lvxxb     扩展文件系统
3>拼接vg
fdisk -cul /dev/sdb
vgextend vg0 /dev/sdbN+1
lvextend -L 1536M /dev/vg0/lv0(/dev/vgxxb/lvxxb)
resize2fs /dev/vg0/lv0

4>缩减文件系统(先缩减文件系统–缩减lv)
resize2fs /dev/vg0/lv0 30M  缩减到30M
(e2fsck -f /dev/vg0/lv0   检测缩减)
lvreduce -L 30M /dev/vg0/lv0   缩减lv
pvmove /dev/sdb5 /dev/sdb6   把5的东西移到6上
删除5
vgreduce vg0 /dev/sdb5   缩减vg
vgremove vg0
pvremove /dev/sdb5       删除设备

7.建立快照
7.1把lvm挂载到一个目录,写自己的东西
然后卸载,准备做一个快照、
做快照的大小是依照需要改动的大小而设置的
lvcreate -L 10M -n /dev/vg0/lv0-bak -s /dev/vg0
lvdisplay /dev/vg0/lv0 (/dev/vg0/lv0-backup) 查看快照与之前的关系
修改原先的lvm,其实修改的是你的快照
快照是有生命周期的
先挂载一下原始设备,
先网原始设备里面dd if=/dev/vda of=/xxb/bigfile bs=1M count=5
无论修改的是原始的文件还是快照,都会写在快照里面,如果快照撑爆以后,会将修改内容
保存在原始文件里面
7.2使用快照建立虚拟机
删除lvm快照
使用一个大的lvm新建虚拟机
第九章:linux下的iptables以及xinetd超级守护进程
1. xinetd 超级守护进程访问
telnet访问只能限制为普通用户访问(一般只用来做测试)
vim /etc/xinetd.conf   主配置文件
no_access  不允许访问
only_from    只允许访问
cps  = 2 5      防止DDOS攻击(同时间2个,5秒后继续访问)
instances   =10   最大链接数
per_source  = 2   每个地址限制链接访问

//思考,文件的权限是拒绝大于允许,所以一般允许放在前面啊(没有守护进程和子进程的权限大小)

2. tcpwraper
ldd /usr/sbin/sshd  查看是否支持tcpwraper模块
libwrap.so.0 => /lib64/libwrap.so.0
支持这个模块的sshd in.telnetd
由两个文件控制    //权限貌似是先允许后拒绝
vi /etc/host.allow
in.telnetd,sshd:192.168.0. :spawn echo `date` from %c to %s >> /var/log/warn
vi /etc/hosts.deny
sshd:192.168.0.   EXCEPT 192.168.0.11  //拒绝当前网段访问sshd,只允许11

//一般在deny里 ALL:ALL
// access 允许个别,并且做一个记录
man 5 hosts.allow

//服务一般要考率的权限问题:selinux iptables xinetd tcpwraper

 

3.iptables火墙策略
iptables的策略是保存在内存的,因开机就会失效,因此,写好策略必须将之保存
// service iptables save
iptables -F   清空iptables策略
iptables -nL  查看策略(可以查看对端口和地址的限制)
iptables-L    查看策略(显示的是对服务的策略)
iptables 是在内核上面保存的
filter 表  (inout  forward  output )
nat 表  (output  postrouting//snat  prerouting//dnat) nat表不经过内核(完全由farword转发)
在filter链中内网访问路由的output是经过内核的,而访问外网时的output是不经过内核的,只是起到传输数据的作用
snat是在内网通过路由访问外网的时候在外网卡做的一个改变源地址的POSTROUTING
dnat实在外网通过路由访问内网的时候在外网卡做的改变目标目标地址的PREROUTING

火墙策略默认是写在filter表中的,-t指定策略表
#iptables (-t filter) -A INPUT -s 192.168.0.75 -p tcp –dport 22 -j REJECT
# iptables -A INPUT -i lo -j ACCEPT  通过回还进入本机
# iptables -A INPUT -p tcp –dport 22 -j ACCEPT
# iptables -A INPUT -p tcp –dport 53 -j ACCEPT
# iptables -A INPUT -j REJECT

iptables -D INPUT 1  删除input链的第一条规则
iptables -R INPUT ……修改策略
iptables  -I   INPUT n(数字)  插入规则
iptables -N 添加一个表
iptables -E 修改表的名称
iptables -X 删除一个表
iptables -P INPUT DROP/ACCEPT   对整个链进行操作

//几个常用的iptables实例:
1.将本地80端口的请求转发到8080端口:
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
2.如果需要本机也能访问,则需要配置OUTPUT链;
iptables -t nat -A OUTPUT  -p tcp -d 127.0.0.1 –dport 80 -j REDIRECT –to-ports 8080
3.将本地80端口的请求全部转发到10.0.0.22:80
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp –dport 80 -j DNAT –to 10.0.0.22:80
iptables -t nat -A POSTROUTING -j MASQUERADE
4.禁止ping入,允许ping 10.0.0.0/24网段ping入
iptables -A INPUT -p icmp –icmp-type 8 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p icmp –icmp-type 8 -j REJECT
//问题
当访问次数多了,就会出现瓶颈,怎样减少读取火墙呢?
将iptables策略写成当已经是链接过的直接accept
部分没有链接过的accept
//但是换一角度思考,如果这个策略保存了,可能开机的时候某些服务将不能启动
//将脚本直接写在/etc/rc.local  开机自动执行   (不影响开机)
//加载ftp的跟踪链接

//系统的优化,iptables在开机的启动顺序。决定了它的加载位置
modprobe -r nf_nat_ftp  删除内核模块
modprobe  nf_nat_ftp     加载内核模块
lsmod | grep nf_nat_ftp   查看加载的模块

vim /mnt/firewall
#!/bin/bash
modprobe -a nf_nat_ftp
iptables -F
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state –state NEW -p tcp –dport 21 -j ACCEPT
iptables -A INPUT -m state –state NEW -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -m state –state NEW -p tcp –dport 53 -j ACCEPT
iptables -A INPUT -m state –state NEW -p tcp –dport 80 -j ACCEPT
iptables -A INPUT -m state –state NEW -j REJECT
chmod u+x /mnt/firewall
vim /etc/rc.local
/mnt/firewall  开机后执行脚本

注意:在防火墙策略中,DNAT和SNAT的重要性在互联网中是经常需要使用到的。。。相当滴重要啊
//企业实现访问
5.路由转发功能
5.1 内网访问外网(在路由器后端配置postrouting SNAT)
路由器(双网卡,eth0192.168.0.57 eth1 10.0.0.22)//注意,其实内网是可以和57通信的
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p  立即生效   //-o 表示从eth0出去
iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source 192.168.0.57
内网以10.0.0.22为网关的主机就可以通过路由器主机上网了(网关设置为10.0.0.22)

5.2 外网访问内网资源(在路由器前端配置prerouting DNAT)
同样,必须开启内核的转发功能   //-i 表示从eth0进来
iptables -t nat -A prerouting -i eth0 -j DNAT –to-dest 10.0.0.2
开启内网(10.0.0.2)主机的httpd服务
用户访问192.168.0.57主机,会访问到内网的服务主机(10.0.0.2)
第十章:邮件系统的搭建
邮件服务是Internet上最常用的服务,它占据了Internet90%的流量,可见它的普遍性和重要性。

我们常见的相关邮件服务的协议有:
1. smtp
工 作在tcp的25号端口,主要用于发送和接收邮件,有smtp和smtpd进程之分。smtp用于发送邮件,smtpd用于接受邮件。而通常情况下,无论 是microsoft的系统还是linux系统,系统本身自带的有smtp服务,故我们可以在pc上通过outlookexpress和web发送邮件。
2,IMAP,POP3
IMAP工作在tcp的143端口,pop3工作在tcp的110端口,用于用户查看和下载邮件
3,S/MIME
多用途互联网邮件扩展,是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件

而邮件服务又是比较复杂的一份服务,下面我们先了解一下邮件服务的几个名词:
//1,MUA:邮件用户代理
功能:用户编写邮件,然后自动发送给smtp服务器和查看邮件。
我们通常用这些软件来实现此功能mutt,OE(microsoft),Foxmail(国人开发),Thunderbird(雷鸟),evalution
// 2,MTA:邮件传输代理
功能:用于接收邮件(作为smtpd服务器使用)
我 们通常用这些软件来实现此功能:sendmail(最古老,在软件设计上有缺陷;仍然用的比较多),qmail,postfix(功能强大,主要用于替代 sendmail),exim,exchange(依赖于AD,这个只能用于windows平台),Lotus Notes Domono(价格昂贵)
3,MDA:邮件投递协议
功能:将MTA接收到的邮件,投递到对应的用户的邮箱。
我们通常用这些软件来实现此功能procmail,maildrop
4,MRA:邮件检索代理
功能:用户下载查看邮件(pop3或是IMAP服务)
我们通常用这些软件来实现此功能:cyrus-imap,courier-imap,dovecot

通常我们使用发邮件和收邮件,是要输入用户名和密码的,而认证通过什么实现呢?
cyrus-sasl:简单认证安全层,依赖courier-authlib这个库可以实现msyql和LDAP的认证

而邮件服务的工作过程简单阐述为:
用 户使用用户名和密码通过认证之后,通过MUA写好邮件,然后通过本机的smtp客户端发送给本地域指定的邮件服务器,管理本地域的邮件服务器通过运行的 MTA来接收邮件;如果是发往本域的邮件,则通过MDA投递到对应用户的邮箱中,如果是发往其它的域,则进行中继,通过管理本地域的邮件服务器的smtp 客户端发给管理目标域的邮件服务器,管理目标域的邮件服务器执行相同的操作。而当邮件到达目的地点,接收邮件的用户通过通过认证之后,就可以利用MRA在 邮件服务器上查看和下载邮件,整个过程结束。

//第一节:mysql的安装域配置
1. mysql的安装管理
flush privileges   刷新数据库

备份与还原数据库文件
mysqldump -u root -pwestos westos > /mnt/westos.sql
mysql -u root -pwestos westos < /mnt/westos.sql
给数据库远程授权:
grant select on westos.* to username@IP/域名 identified by ‘passwd’
@’%’  //表示所有远程
mysqladmin -u root -pwestos password xxxx

mysq忘记密码修改,首先关闭服务,
mysqld_safe –skip-grant-table&  进入mysqld的单用户,打入后台
mysql直接进入,修改mysql库中的user表。
update user set Password=password(‘westos’) where User=’root’;
注意:和数据库相关的程序呢一般会在mysql数据库中的user表中。
fg 查看单用户进程,然后将所有进程kill -9

2. 使用php-myadmin管理mysql
需要web界面显示(你懂得哦?!)//目录的位置要放在正确的位置哦

php和mysql的链接问题php-mysql
安装好后将目录的文件修改
cp -p config.sample.ini.php config.ini.php
service httpd  restart
service mysqld restart
测试管理:
http://IP/phpMyAdmin

第二节:搭建简单邮件服务(发邮件)
3.邮件smtp(postfix服务)    //MTA 邮件传输代理
默认postfix客户端是可以发邮件的!
发送邮件:mail mail-address
查看邮件队列:mailq
postqueue -f/-p    查看刷新
邮件投递端口:25
MTA种类:sendmail qmail postfix
查看mta:alternatives –display mta
切换mta:alternatives –config mta
//注意啊,时刻注意自己的端口冲突
修改postfix配置,让能收发邮件
主配置文件:main.cf
(邮件转达,弄成自己的哦???)
//测试发邮件(利用外地主机测试 )
ehlo hello 和telnet打招呼
mail from:westo@xxb。com
rcpt to:root@xxb.com
data (输入正文).结尾
//
使用postfix收发信息完成!

4邮件辅助功能(别名,地址伪装。。。)
vim /etc/aliases(虚拟: 真实用户)  //给虚拟用户发实际到了真实用户
admin:    :include:/etc/postfix/users   //群发邮件
vim /etc/postfix/users
westos@example.com
xxb@example.com

postalias /etc/aliases 加载别名文件
mail -u username  //虚拟邮件用户

5.访问控制限制:
postconf -d 查看邮件所有默认配置
postconf -d | grep smtpd_client
//拒绝客户端1.
postconf -e “smtpd_client_restrictions = check_client_access hash:/etc/postfix/access”
postmap /etc/postfix/access
vi access  (192.168.0.22 REJECT)    //拒绝22主机登录(telnet模拟的客户端)
postmap access   //必须生成access.bd 否则不生效的
service postfix restart
//拒绝个别邮箱发送2.
postconf -d | grep sender
postconf -e “smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender”
vim sender  (xxb@example.com REJECT)
postmap sender
service postfix restart
//注意 啊,只是拒绝xxb发信,但是收新还是正常的
//拒绝接受3.
postconf -e “smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/bad, permit_mynetworks, reject_unauth_destination”
vim bad  (xxb@example.com)
postmap bad
//现在发现xxb也不能接受了
本地邮件用命令测试接受邮件

第三节:安装邮件接收服务110(pop3) 和143(imap)
5.邮件查看下载 dovecot  //MUA邮件用户代理
mutt 邮件客户端
yum install dovecot mutt -y
vim dovecot.conf
disable_plaintext_auth = no
protocols = imap pop3 lmtp
vim 10-mail.conf
mail_location = mbox:~/mail:INBOX=/var/mail/%u

测试:mutt -f pop://xue@192.168.0.57  第一次申请邮箱需要生成邮箱目录
tail -f /var/log/maillog    邮件日志
//可能是 /var/mail/xue的权限不一样
//红帽6.4 在做mutt的 时候用户权限需要手动修改。
第四节:企业邮箱原理:
邮箱服务器:用户注册邮箱,会在邮件服务器上生成一个用户名和密码,存在数据库中,当用户激活后,将在服务器端生生成自己的邮箱。而每次登录用户就是通过在mysql后端查找相应信息的。
然而每个邮箱都是有固定大小的,这就是固定的磁盘配额。
//其实,当用户申请邮箱的时候是没有存放邮件地址的,登验证后会自动生成
6. mysql的链接(postfix 和mysql构建基本m邮件框架)
postconf -a 支持认证
postconf -m 支持插件

//完整搭建邮件系统
postfix 的完整安装配置
useradd -u 777 email
postconf -d | grep virtual
postconf -e “virtual_mailbox_base = /home/email”
postconf -e “virtual_gid_maps = static:777”
postconf -e “virtual_uid_maps = static:777”

开启数据库mysql
使用phpMyAdmin创建一个一个邮件数据库文件:
emial数据库中创建一个email表,用来存放邮箱信息的(用户密码和邮箱),并且授权
grant all on email.postfix to postfix@localhost identified by “postfix”
用postfix用户测试,没问题

添加相关的邮箱信息:
[root@cacti mail]# postconf -e “virtual_alias_maps = mysql:/etc/postfix/mailuser.cf”
[root@cacti mail]# postconf -e “virtual_mailbox_domains = mysql:/etc/postfix/maildomain.cf”
[root@cacti mail]# postconf -e “virtual_mailbox_maps = mysql:/etc/postfix/mailbox.cf”
//编写三个文件/etc/postfix/mailuser.cf  /etc/postfix/maildomain.cf /etc/postfix/mailbox.cf
host = localhost
user = postfix
password = postfix                               //##数据库的授权用户以及密码
dbname = email
table = postfix
select_field = username//domain//mailbox        ##注意:必须和数据库中的一样
where_field = username//domain//username

[root@cacti mail]# postmap -q “xxb@westos.com” mysql:/etc/postfix/mailuser.cf
xxb@westos.com
[root@cacti mail]# postmap -q “xxb@westos.com” mysql:/etc/postfix/mailbox.cf
wetos.com/xxb/
[root@cacti mail]# postmap -q “westos.com” mysql:/etc/postfix/maildomain.cf
westos.com
基本框架搭建成功:
测试:mail xxb@westos.com
邮件地址在/home/email/westos.com/xxb

//自己新加的:在数据库中新加邮件用户,修改远程授权,修改邮箱信息文件
至此,构建了mysql+dovecot+httpd的邮件体系

7.使用devocot创建相关的邮件管理、认证
管理邮件:
//vim 10-mail.conf
mail_location = maildir:/home/email/%d/%n   管理所有的邮件用户
first_valid_uid = 777
//vim 10-auth.conf
!include auth-sql.conf.ext    打开认证
//cat auth-sql.conf.ext   需要下面这个文件
//find / -name dovecot-sql.conf.ext
//cp /usr/share/doc/dovecot-2.0.9/example-config/dovecot-sql.conf.ext /etc/dovecot/
//vim dovecot-sql.conf.ext  修改5个
driver = mysql
connect = host=localhost dbname=email user=postfix password=postfix
default_pass_scheme = PLAIN
password_query = \
SELECT username, domain, password \   //注意,数据库这块必须得是(usernamedomanpassword)
FROM postfix WHERE username = ‘%u’ AND domain = ‘%d’
user_query = SELECT mailbox, 777 AS uid, 777 AS gid FROM postfix WHERE username = ‘%u’
//service dovecot restart

模拟客户端测试:
telnet 192.168.0.57 110 发现登不上去
思考,将dovecot 与mysql链接之后出现问题的
//yum install dovecot-mysql -y
[oot@www home]# telnet 192.168.0.57 110   测试成功
Trying 192.168.0.57…
Connected to 192.168.0.57.
Escape character is ‘^]’.
+OK Dovecot ready.
user xxb@westos.com   //使用用户登录
+OK
pass westos           //登录密码验证
+OK Logged in.
list
+OK 0 messages:
.
quit
+OK Logging out.
Connection closed by foreign host.

待续:;;

使用雷鸟客户端进行测试:

 
1.将本地邮件域名加入DNS的MX记录文件
维护一个邮件域(优先级越小首先执行)
dig -t mx westos.com
vim /var/named/chroot/etc/named.rfc1912.zones
zone “westos.com” IN {
type master;
file “westos.com”;
allow-update { none; };
};
vim /var/named/westos.com
$TTL 1D
@       IN SOA  cacti.westos.com. rname.invalid. (
0       ; serial
1D      ; refresh
1H      ; retry
1W      ; expire
3H )    ; minimum
NS      cacti.westos.com.
cacti   A       192.168.0.57
westos.com.     MX  5   192.168.1.57.      编写一个mx邮件域

作用:就是将之前搭建的邮件服务器mta绑定一个特定的邮件域,所有人发的信息都在这个域里面

//搭建一个邮件服务器,并且维护一个邮件域

 

第十一章:mysql数据库的基本操作
mysql(mariadb)
==========
注意:在Centos7中,默认使用的是mariadb数据库,但是内核其实还是mysql的内核。。
yum install mysql mysql-server

mysqladmin -uroot -predhat password westos   修改本地mysql root密码
mysqladmin -uroot -predhat -h 192.168.0.188 password westos 修改远程192.168.0.188 mysql服务器 root密码

mysql_secure_installation     第一次安装mysql以后通过这条命令可以对mysql进行设置

mysql -uroot -predhat      从本机登录mysql数据库

show databases;       显示数据库
use mysql;       进入数据库
show tables;       显示数据库中的表
desc user;       查看user表的数据结构

select host.user,password from user;    查询user表中的host,user,password字段
create database westos;      创建westos数据库
use westos;
create table linux(      创建表,username,password字段
username varchar(15) not null,
password varchar(15) not null
);
select * from mysql.user;     查询mysql库下的user表中的所以

show tables;
desc linux;

insert into linux values (‘user1′,’passwd1’);    在linux表中插入值为username = user1,password = password1
update linux set password=password(‘passwd2’) where username=user1; 更新linux表中user1 的密码为password2
delete from linux where username=user1;     删除linux表中user1的所以内容
grant select on  *.* to user1@localhost identified by ‘passwd1’; 授权user1 密码为passwd1  并且只能在本地 查询数据库的所以内容
grant all on mysql.* to user2@’%’ identified by ‘passwd2’;  授权user2 密码为passwd2  可以从远程任意主机登录mysql 并且可以对mysql数据库任意操作
备份
/var/lib/mysql
mysqldump -uroot -predhat mysql > mysql.bak 备份mysql库到mysql.bak

mysql -uroot -predhat westos < mysql.bak 恢复mysql.bak 到westos库

mysql 密码恢复
/etc/init.d/mysqld stop

mysqld_safe –skip-grant-tables &     跳过grant-tables授权表  不需要认证登录本地mysql数据库

update mysql.user set password=password(‘westos’) where user=’root’; 更新mysql.user 表中条件为root用户的密码为加密westos

/etc/init.d/mysql restart
centos7中(systemctl restart mariadb)
phpmyadmin
yum install php php-mysql httpd mysql mysql-server

tar jxf phpmyadmin-*.tar.bz2 -C /var/www/html
mv phpmyadmin phpadmin
cp config.sample.inc.php config.inc.php
vim config.inc.php
add
$cfg[‘blowfish_secret’] = ‘test’;

/etc/init.d/httpd start
http://192.168.0.188/phpadmin

根据红帽RHEL7官方文档对centos7进行技术剖析(二)

第一章
使用红帽kickstart,自动化安装rhel。

http://pan.baidu.com/s/1qWqfXlq    文档下载地址。

第二章:
控制对文件的访问
在第一本书中,曾讲到文件权限的设置以及规划对系统的安全是极其重要的,那么这一章将重点学习文件权限的进一步设置,设定权限列表(acl)等等。

注意:在生产环境中经常出于安全的考虑需要对文件目录和用户给予很严格的权限设计,从文件系统的基本权限到特殊权限,到acl控制都是企业权限控制的有效途径。因此在面试笔试中,权限的设置也是极其重要的针对某些特定人对特定文件目录的访问权限设计是必须掌握的内容。
1.权限列表的读取
[root@xxb1 ~]# getfacl file1  读取权限列表
# file: file1  文件名称
# owner: root  文件属主
# group: root  文件属组
user::rw-  用户权限
group::r–  组权限
other::r–  其他权限

[root@xxb1 ~]# setfacl -m xxb:rwx file1 使用acl设定特定权限,给xxb用户rwx权限
[root@xxb1 ~]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:xxb:rwx 特殊指派用户以及权限
group::r–
mask::rwx 可指派最大权限
other::r–
注意:setfacl 用于设置或者修改文件的acl

2.ACL权限的设置以及umask设置
#setfacl -m u:xxb:rw filename 设定用户xxb读写权限
#setfacl -m g:xxb:rw filename 设定组xxb读写
#setfacl -x u:xxb filename     删除用户xxb的acl

ACL掩码以及继承:
(1)具有ACL的文件拥有mask,能够限制拥有该文件的组的最大权限,有能够限制ACL中的补充用户和用户组的最大权限.#setfacl -m m:rwx filename
例子:
# setfacl -m m:rw file1      设定umask为rw
# getfacl file1   注意到生效的是rw
file: file1
owner: root
group: root
user::rw-
user:xxb:rwx                    #effective:rw-
group::r–
mask::rw-
other::r–

(2)目录可以有默认ACL条目,系统自动针对在该目录创建的新文件设置这些目录,类似于setgid权限。使得在该目录中创建的新文件拥有该目录的权限
#setfacl -m d:u:bob:rw directory
这样目录下的文件等继承此目录的用户权限

3.设备权限列表加载
挂载文件系统之后 ,必须启用对 POSIX ACL 条目的支持
安装程序会配置它创建的所有ext4 文件系统,以自动启用 ACL 支持
# tune2fs -l /dev/sda1 | grep “Default mount” 查看支持,(user_xattr acl)

如果手动格式化文件系统 ,则需要使用 acl 挂载
选项挂载该系统
#tune2fs -o user_xattr,acl /dev/sda1

tune2fs  -l /dev/sda5          查看设备是否支持acl
tune2fs -o acl /dev/sda5       -o指定新的功能(增加acl权限)

 

tune2fs -L data /dev/sda3     -L指定磁盘设备的标签为data
e2label /dev/sda3             显示设备的标签啊
挂载的时候可以挂载标签哦
mount -L data /xxb           使用标签挂载设备哦
tune2fs -L “” /dev/sda3      将标签打成空

 
第三章:
系统延迟以及定时机制
1.计划定期任务:
at命令:
at 命令可以指定某一任务在将来的特定时间运行。该作业可能是一次备份、对您系统的检查或者特定时间发送的通知。那些需要花费很长时间才可完成的作业正适合 at 命令。仅需使用 at 命令将任务设置为在一分钟或两分钟之后运行。然后您便可以安全注销,因为该任务会在与 shell 会话断开连接的情况下运行延迟任务;
at 命令必须指定任务应运行的时间。该指定可以是具体时间和 / 或日期 (例如星期一 , 10:00pm 或 7 月 15 日 )。也可以是当前时间的相对时间 (现在时间加上 5 分钟 ,现在时间加上 3 天或 4:00pm 加上1 周)通过添加其他选项,您可以在任务完成是发送邮件( -m ),或者从文件中读取任务( -f 文件),而无需通过标准输入进行。
在键入 at 命令行之后 ,按 Enter 并继续键入作业中包含的其他命令。任务可由多个命令组成。在完成键入要运行的命令时,在单独出现的一行中按 Ctrl+d 完成任务。

例子:
[root@xxb1 ~]# at now+1min
at> touch /root/test/file123
at> <EOT>   ctrl+d退出
job 2 at Tue Jan  6 20:59:00 2015
注意:在每次at进行定时任务之后,可以通过输入atq列出作业编号和次数。输入Atrm#(表示作业编号)删除指定作业
[root@xxb1 ~]# atq
8       Tue Jan  6 21:02:00 2015 a root
可以使用监控:
[root@xxb1 ~]# watch -n 2 ls -l test/  会自动创建file123

2.管理定期任务:
 注意:crontab定时机制在linux管理中也是极其重要的,作为一个想偷懒的,或者有先见之明的linux运维人员来说,此项技能是必须掌握,而且善于使用的,否则你就只能苦逼的半夜去进行维护服务器了。重点掌握定期任务的时间设置。

cron 设备管理必须按计划定期重复运行的程序。后台程序crond 每分钟唤醒一次 ,以运行计划的任何任务用户使用
crontab 命令计划个人任务。系统管理员可以在系统范围配置文件中设置任务。
单个用户使用称为 crontab ( cron 表 )的文本文件登记任务

#crontab -l 列出文件内容
#crontab -r     删除文件
#crontab -e  编辑文件(和vim编辑器一样)(crontab -u xxb -e 指定用户运行定时任务)
2 * * * * ls -l /root/test/ 每两分钟执行
min hour day month week command
时间表示示例:
05 * * * *  每小时整点过5分钟运行
05 02 * * *  每天2:50执行
30 08 01 * *  每月第一天8:30
00 07 20 12 *   每12月20日七点整运行
30 16 * * 5 每周五16:30
*/5 * * * * 每五分钟执行
*/10 9-17 1,15 * *   面试题

crontab注意事项:
属 于系统的任务通常保存在 /etc/crontab 文件中而不是使用 crontab -e 编辑保存在个人文件中。更好的做法是用文本编辑器创建crontab 文件并保存到 /etc/cron.d 中 (避免更新系统软件包 cronie 时出现问题 )。/etc/cron.d/crontab 文件在日期说明后另加一个字段,表示将运行作业的用户。
对于需要每天、每周或每月运 行一次的脚本,可以直接将其设置为可执行文件 ,并保存在 /etc/cron.{daily,weekly,monthly}中相应目录下。这些任务由/etc/anacrontab 配置的系统 anacron 服务运行 anacron是 cron 的集成组件 ,用于更好地管理作业 ,并确保在作业因计算机关闭而未运行的情况下,在系统引导后运行作业。

cron权限设定:
用户黑名单:/etc/cron.deny
用户白名单:/etc/cron.allow
?????
系统中的临时文件:

控制系统中的临时文件:
systemd-tmpfiles
– –create /usr/lib/tmpfiles.d/test.conf
– –clean /usr/lib/tmpfiles.d/test.conf
#################################################
第四章:管理系统中的简单分区和文件系统
1.添加文件系统空间
2.添加swap交换分区
3.对系统分区进行加密
介绍:
fdisk是用于管理磁盘分区的使用程序。可以通过-l参数查看磁盘以及相应分区。也可使用-cu参数进行更改分区信息。(-c禁用旧的DOS兼容模式,-u以扇区的格式显示输出)

[root@xxb1 ~]# fdisk -l          查看系统中可用磁盘信息(磁盘的构造以及大小)
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors 设备名,大小,扇区
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000d4605

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux                第一块磁盘的第一分区
/dev/sda2         1026048    41943039    20458496   8e  Linux LVM   第一块磁盘的第二分区

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors        第二块磁盘
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 byte
由以上信息可知,有两块磁盘可用。

[root@xxb1 ~]# blkid                                                                    查看设备ID(可管理的设备)
/dev/sda1: UUID=”c9e59a31-69b3-4241-87d5-d5b82073c91b” TYPE=”xfs”
/dev/sda2: UUID=”XuBZVU-srAs-mfXn-IvQS-DGSw-Wq4e-21AUl0″ TYPE=”LVM2_member”
/dev/mapper/centos-swap: UUID=”f88801ef-594e-40cf-b3d6-e232b01e183f” TYPE=”swap”
/dev/mapper/centos-root: UUID=”ca7bf22c-8874-4c7c-b8a3-7ce189298bd3″ TYPE=”xfs
[root@xxb1 ~]# fdisk /dev/sdb                                                 对磁盘进行分区操作
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xf73a3cfb.

Command (m for help): n                                                        新建分区
Partition type:
p   primary (0 primary, 0 extended, 4 free)
e   extended
Select (default p): p                                                                   分区类型,主分区/扩展分区
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +1G    1G大小
Partition 1 of type Linux and of size 1 GiB is set

Command (m for help): p                                                        显示分区信息

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xf73a3cfb

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux

Command (m for help): wq                                                    保存退出磁盘分区
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

格式化磁盘分区为xfs格式
[root@xxb1 ~]# mkfs.xfs /dev/sdb1 (mkfs -t ext4|xfs /dev/sdb1)    格式化分区(sdb1 第二块磁盘的第一分区)
meta-data=/dev/sdb1              isize=256    agcount=4, agsize=65536 blks
=                       sectsz=512   attr=2, projid32bit=1
=                       crc=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=2560, version=2
=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
注意:
分区成功,但是发现不能格式化,因为系统没有识别(/proc/partition会存放分区信息)。如果没有识别到可以执行partprobe 进行分区识别,继续进行格式化(红帽6系列一般会出现这样的问题)

挂载使用:
[root@xxb1 ~]# mount /dev/sdb1  /mnt
[root@xxb1 mnt]# touch file{1..2}
卸载设备:
[root@xxb1 ~]# umount /mnt/(/dev/sdb1)
文件系统比较:
• ext4 是 Red Hat Enterprise Linux 6 的标准文件系统。它非常强大可靠,具有多项可以提高现代工作量处理性能的功能
• ext2 是常用于 Linux 中的较旧的文件系统。它简单可靠 ,非常适合小型存储设备 ,但是效率低于 ext4
• vfat 支持包括一系列相关文件系统 ( VFAT/FAT16 和FAT32 ),这些文件系统针对较旧版本的 Microsoft Windows开发,在大量的系统和设备上受支持
• xfs在Red Hat Enterprise Linux 7 的标准文件系统其具备数据完全性 、性能稳定、扩展性强( 18eb)、传输速率高( 7G/s)
开机自动加载设备:
[root@xxb1 ~]# blkid /dev/sdb1  查看设备ID
/dev/sdb1: UUID=”801c32d3-978b-45bd-a1af-0dd9a8a8b262″ [root@xxb1 ~]# mkdir xxb 创建挂载点
[root@xxb1 xxb]# cat /etc/fstab
UUID=”801c32d3-978b-45bd-a1af-0dd9a8a8b262″ /root/xxb xfs defaults 1 2
注意:第一列可以写设备名,但是这样如果在设备不断更换,位置变化会造成变化,因此使用ID还是比较靠谱滴
[root@xxb1 xxb]# mount -a  加载/etc/fstab文件
swap交换分区的介绍和建立:
换空间或交换区是磁盘驱动器上的空间,用作当前未使用部分内存的溢出。这样,系统就能在主内存中留出空间用于存当前正在处理的数据,并在系统面临主内存空间不足的风险时提供应急溢出。

新建分区,t修改分区ID。然后l显示ID,82是默认使用的swap分区。

[root@xxb1 ~]# fdisk /dev/sdb
。。。。。。。
Command (m for help): t                                             修改分区ID
Partition number (1,2, default 2): 2                                选择分区
Hex code (type L to list all codes): l                              显示分区ID
Hex code (type L to list all codes): 82                            选择swap类型
Command (m for help): p
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         307     1048576   83  Linux
/dev/sdb2             307         337      102400   82  Linux swap / Solaris

[root@xxb1 ~]# mkswap /dev/sdb2                          格式化swap
Setting up swapspace version 1, size = 102396 KiB
no label, UUID=c5d7d5c2-d40b-43f8-af5c-4f41b4839403

自动挂载swap分区:
[root@xxb1 ~]# vim /etc/fstab
UUID=”c5d7d5c2-d40b-43f8-af5c-4f41b4839403″ swap swap defaults 0 0
[root@xxb1 ~]# swapon -a                                 加载配置,识别swap
[root@xxb1 ~]# swapon -s                                 查看swap分区状态
Filename                                Type            Size    Used    Priority
/dev/dm-0                               partition       2097148 0       -1
/dev/sdb2                               partition       102396  0       -2

[root@xxb1 ~]# swapoff /dev/sdb2                      停用指定的交换分区

注意:swap交换分区的设定是有一定艺术的,合理的空间,会给系统造成性能上的提升,因此给予一下建议。
系统内存4G swap给2G
系统内存4-16G swap给4G
系统内存16-64G  swap给8G
系统内存64-256 swap给16G

 
磁盘加密技术:
LUKS(linux统一密钥设置)是标准的设备加密格式
LUKS可以对分区或卷进行加密
必须首先对加密的卷进行解密,才能进行挂载文件系统
(1)使用fdisk新建新分区
(2)# cryptsetup luksFormat /dev/vdc1  格式化加密层(提示输入密码)
(3)# cryptsetup open /dev/vdc1 xxb    开启加密层(设置虚拟设备名)
(4)# ll /dev/mapper/xxb        查看加密的虚拟设备
lrwxrwxrwx. 1 root root 7 Jan 14 12:33 /dev/mapper/xxb -> ../dm-1
(5)# mkfs.xfs /dev/mapper/xxb         格式化虚拟设备
(6)# mount /dev/mapper/xxb /root/hello/  挂载虚拟加密设备
(7)# touch file{1..10} /root/hello/   使用加密设备
(8)# umount /root/hello/  卸载设备
(9)# cryptsetup close xxb       关闭加密虚拟设备(/dev/mapper/下不会查看到xxb虚拟设备)
(10)
注意:以后使用就需要进行open打开进行读写操作,结束之后使用close进行关闭。

自动挂载加密设备:
# vim /root/passwd
westos1234
# vim /etc/crypttab
xxb /dev/vdc1 /root/passwd
# vim /etc/fstab
/dev/mapper/xxb /root/hello xfs defaults 0 0
#chmod 600 /root/passwd
#cryptsetup AddKey /dev/vdc1 /root/passwd
#reboot
第五章:使用逻辑卷管理器管理存储
查看LVM组件;(lvm介绍)
实施LVM存储;(system-config-lvm)
增加文件系统;
添加磁盘;
创建快照作为备份;

LVM模块介绍:
• 物理分区或磁盘是 LVM 的第一构建块。这些可以是分区、完整磁盘、 RAID 集或 SAN磁盘
• 物理卷是 LVM 所使用的基础“物理”存储。这通常是块设备 ,例如分区或完整磁盘。设备必须初始化为 LVM 物理卷 ,才能与 LVM 结合使用
• 卷组是存储池,由一个或多个物理卷组成
• 物理区块是物理卷中存储的小型数据区块 ,用作 LVM 存储的后端
• 逻辑区块映射到物理区块 ,构成 LVM 存储的前端。默认情况下,每个逻辑区块映射到一个物理区块。启用某些选项将更改此映射。例如,镜像会导致每个逻辑区块映射到两个物理区块
• 逻辑卷是逻辑区块组。逻辑卷可以像硬盘驱动器分区一样使用
通过使用lvm,主机可以在存储不够的时候随时热拉伸磁盘大小,而不需用进行更换设备,等等。。可以灵活的管理设备的大小。

使用命令行工具实施LVM存储:
1.创建LVM格式的新分区(8e格式)
2.创建物理卷PV(pvcreate /dev/sdbN)用于初始化分区,使其作为物理卷与LVM结合使用。
3.创建卷组VG(vgcreate vgname /dev/sdbN)自定义卷组。(可以使用vgextend添加新物理卷)
4.创建和使用新逻辑卷(
lvcreate -n lvname -L 2G vgname从vg上创建容量为2G大小的逻辑卷
mkfs -t ext4|xfs /dev/vgname/lvname 格式化逻辑卷
mkdir /data创建挂载点
echo “/dev/vgname/lvname /data ext4|xfs defaults 1 2” > /etc/fstab 自动挂载逻辑卷
mount -a  自动加载文件系统)

#pvdisplay  /dev/sda1 显示有关特定物理卷信息
#vgdisplay  vgname 显示有关卷组
#lvdisplay  /dev/vgname/lvname   显示有关特定逻辑卷的信息
扩展逻辑卷和xfs文件系统:
#df -h 查看大小
#vgdisplay vgname 查看可以分期
#lvextend -l 1G /dev/vgname/lvname  拉伸lvname
#xfs_growfs  /dev/vgname/lvname     刷新文件系统文件(ext文件系统使用的是resizee2fs)
#df -H  查看拉伸后的大小

注意:ext系列文件系统支持拉伸和缩减空间(必须查看文件大小)

创建快照以便进行数据备份:
LVM除过可以对磁盘存储进行灵活管理外,还可以进行对逻辑卷进行快照(临时保留所更改的逻辑卷的原始数据)。快照提供原始卷的静态视图,从而能够以一致状态备份其数据。
注意:快照卷大小只足以存储在它存在期间更改的数据大小即可。
创建快照和备份:
[root@xxb1 ~]# lvcreate -s -n snaptest -L 1G /dev/vgname/lvname
[root@xxb1 ~]# mkdir /root/mon 创建挂载点
[root@xxb1 ~]# mount -o ro /dev/vgname/snaptest /root/mon 将存储挂载
验证快照逻辑卷的状态
[root@xxb1 ~]#lvs /dev/vgname/snaptest
卸载,删除快照
[root@xxb1 ~]#umount /root/mon
[root@xxb1 ~]#lvremove /dev/vgname/snaptest
第六章:文本处理工具

http://my.oschina.net/xxbAndy/blog/370806   对于文本的处理我们经常需要用到正则表达式,以上链接帮助大家理解。 
diff工具:查看文本区别,可以用来创建补丁文件(用于在多台主机之间对相似文件进行修改)
[root@xxb1 test]# diff passwd passwd+
40a41
> xxbandy:x:1992:q2u9ednaskcnkdsjhqwiodzbn

#diff -b package-old package-new > package.patch   制作软件补丁
patch命令:
#patch package-old package.patch -b 打补丁,并保存旧包

grep命令:grep可以过滤模式匹配行。(-i不区分大小写;-n前置返回行的行号;-r对文件执行递归式搜索,从命名目录开始;-c显示具有匹配模式的行的计数;-v返回不包含模式的行;^匹配行首;$匹配行尾)

cut命令:截取文件中的文本字段或列并显示输出(-d指定分隔符,-f指定每行中提取的字段,-c指定要从每行中提取的文本列)

sort命令:排序文本数据,通常与管道一起使用(-n按数值排序,-k设置排序字段,-t指定其他字段分隔符)
uniq命令:过滤文件中重复的相邻行(想要打印文件唯一行,首先对uniq的输入进行排序) -u仅显示唯一行,-d显示重复行,-c每行显示一次(包含出现计数)
tr命令:用于转字符(tr ‘A-Z’ ‘a-z’ <file)

sed命令:流编辑器,对文本数据流执行编辑。假定要处理一个文件名,sed将对文件中的所有行执行搜索和替换,将修改后的数据发送到标准输出。
sed格式化使用:s/old/new/  执行字符串替换
d 删除匹配的行
注意:重点掌握grep,sort,sed
第七章:访问网络文件共享服务NFS
挂载网络共享。自动挂载网络文件系统
网络文件系统是由网络附加存储NAS通过网络向多个主机提供的一种文件系统,而不是由块设备提供的,客户端通过特殊的文件系统协议和格式访问远程存储。
linux中有两种主要协议可用访问网络文件系统:NFS,CIFS(samba针对windows的标准网络文件系统).

访问网络共享的三个步骤:
1.识别访问的远程共享
2.确定挂载点,创建挂载点的目录
3.通过相应的名字或配置更改挂载网络文件系统。
这里主要介绍NFS:
NFS ( Network File System )是由 Linux 、 UNIX 及其他类似操
作系统使用的互联网标准协议,可作为它们的本地网络文件系统。
它是一种活动扩展之下的开放标准 ,可支持本地 Linux 权限和文件
系统功能
• Red Hat Enterprise Linux 7 在默认情况下支持 NFSv4 (该协议的
版本 4 ),并在该版本不可用的情况下自动回退到 NFSv3 和
NFSv2 。对于在客户端上运行的所有版本的NFS ,均应启用两种
服务 : rpcbind 和 nfslock 。 NFSv4 使用 TCP 协议与服务器进
行通信 ,而较早版本的 NFS 则可能使用 TCP 或 UDP
• 有两种方法用来确定由服务器提供的 NFS 导出 ,或叫做文件共享。
如果服务器支持 NFSv3 或 NFSv2 ,您可以使用 showmount -e
server 命令来获取导出项列表。如果服务器支持 NFSv4 ,则可以
将 / 导出项挂载到一个空目录并浏览所有导出文件系统的内容。

#showmount -e remote-IP  查看可用NFS
#mkdir /xxb   确定挂载点
#mount remote-IP:/var/ftp/pub /xxb
第八章:LDAP网络用户账户
第九章:部署ftp文件共享服务
• FTP (文件传输协议 )是 INTERNET 上仍常用的最老的网络协议之一,它为系统提供了通过网络与远程服务器进行传输的简单方法.
• 在 RED HAT ENTREPRISE LINUX 6 中。 FTP 服务器包的名称为VSFTPD ,它代表Very Secure FileTransfer
Protocol Damon 服务器名称也叫做 vsftpd
• 默认配置文件让 ANONYMOUS 用户只能下载位于CHROOT 目录中的内容。 /var/ftp/ 这意味着远程 FTP客户端能以用户 anonymous 或 ftp 身份连接到服务器(无需密码 ),并从 ftp 服务器上的 /var/ftp/目录下文件(其本地 ftp 用户可以读取这些文件)
配置FTP服务步骤:
1.#yum install vsftpd -y
2.#systemctl restart vsftpd
3.#systemctl enable vsftpd
4.#lftp ftp-server 测试服务(进入的是ftp默认发布目录/var/ftp/)

FTP服务的更多配置选项:
默认配置为匿名 FTP 服务器 ,仅允许匿名客户端下载并且禁用所有本地用户 ,禁止上传。
vsftpd 配置件: /etc/vsftpd/vsftpd.conf,
document root 位于 /var/ftp/ 中 ,配置修改后,需重新启动服务
• 选项示例:
– anonymous_enable=YES  允许匿名用户访问
– local_enable=NO  本地用户不可访问
– write_enable=NO  可写
– anon_upload_enable=YES 匿名用户可上传

#chown_uploads=YES  上传用户登录
#chown_username=whoever  上传文件为指定用户身份
#chroot_local_user=YES  本地用户不可以切换根/目录 (NO为本地用户可以切到/环境)
#chroot_list_enable=YES  打开本地列表
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list(与上面的切根作用相反)

例子;
chroot_local_user=YES(NO)
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list(hello)
所有本地用户不可以切根,但是只有hello用户可以。
(所有本地用户可以切根,唯独hello用户不可以)
注意:ftp服务的默认发布目录一定不能给登录用户读(w)权限。匿名用户登录(o-w),本地用户登录(u-w)

[root@xxb1 vsftpd]# lftp -u xxb localhost
lftp xxb@localhost:~> ls
ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
说明本地用户xxb的家目录用户有写(w)权限

/etc/vsftpd/ftpusers 存放着黑名单(用户不能登录)
/etc/vsftpd/user_list (
userlist_enable=YES
userlist_deny=NO 如果deny为no则仅允许user_list用户登录。参数默认为YES,user_list用户都不能登录)

项目1:虚拟用户登录ftp服务器
[root@xxb1 vsftpd]#vim /etc/vsftpd/users (存放虚拟用户)
world 虚拟用户
westos 密码
echoxu 虚拟用户
westos 密码

[root@xxb1 vsftpd]# db_load -T -t hash -f users login.db  (每次修改虚拟用户文件必须加载pam模块,必须指定用户密码文件)
[root@xxb1 pam.d]# cat /etc/pam.d/virtual
auth required pam_userdb.so db=/etc/vsftpd/login
account required pam_userdb.so db=/etc/vsftpd/login

##vim /etc/vsftpd/vsftpd.conf
pam_service_name=virtual 修改密码认证文件(默认是使用vsftpd认证的)
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES  打开客户连接
guest_username=ftp  默认身份是ftp
#local_root=/var/xxb  指定用家目录
尝试使用虚拟用户登录:
[root@xxb1 vsftpd]# lftp -u world localhost
Password:
lftp world@localhost:~> ls
drwxr-xr-x    3 0        50             30 Jan 15 06:15 pub
[root@xxb1 vsftpd]# lftp -u echoxu localhost
Password:
lftp echoxu@localhost:~> ls
drwxr-xr-x    3 0        50             30 Jan 15 06:15 pub
这样默认是以虚拟用户登录默认发布目录。(普通用户登录一般登录的是自己的家目录)

项目2:ftp用户家目录(给上面虚拟用户自己的家目录)
#mkdir -p /var/ftpuserdir/xxb123(echoxu)
#touch /var/ftpuserdir/xxb123/myxxb
#touch /var/ftpuserdir/echoxu/my-echo
#chown ftp.ftp /var/ftpuserdir/*

[root@xxb1 xxb123]# vim /etc/vsftpd/vsftpd.conf
pam_service_name=virtual
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=ftp
local_root=/var/ftpuserdir/$USER
user_sub_token=$USER

测试:
#lftp -u xxb123 localhost 登录虚拟用户,进入的是自己的家目录
项目3:自定义虚拟用户权限
#vim /etc/vsftpd/vsftpd.conf
增加:
user_config_dir=/etc/vsftpd/configdir

#chmod u-w /var/ftpuserdir/*
#mkdir -p /var/ftpuserdir/exhoxu/pub
#mkdir -p /var/ftpuserdir/xxb123/pub
#chown ftp.ftp /var/ftpuserdir/exhoxu(xxb123)/pub
#vim /etc/vsftpd/configdir/echoxu
anon_upload_enable=YES
#systemctl restart vsftpd

使用虚拟用户echoxu可以进行上传文件,使用xxb123不可以上传。

 

第十章:selinux的管理
selinux概念:
SELINUX (安全增强型 Linux )是可保护你系统安
全性的额外机制。
• 在某种程度上,它可以被看作是与标准权限系统并行的权限系统。在常规模式中,以用户身份运行进程,并且系统上的文件和其他资源都设置了权限(控制哪些用户 对哪些文件具有哪些访问权SELINUX 的另一个不同之处在于,若要访问文件,你必须具有普通访问权限SELINUX 访问权限。因此 ,即使以超级用户身份 root 运行进程 ,根据进程以及文件或资源的 SELinux 安全性上下文可能拒绝访问文件或资源限)标签

Selinux安全上下文访问规则:
WEB 服务器的 HTTPD 进程设置了 SELINUX 上下文system_u:system_r:httpd_t 标签。该上下文的重要部分是第三个用冒号分隔的字段 SELINUX 类型 : httpd_t
• 系统上的文件和资源也设置了 SELINUX 上下文标签 ,并且重要的部分是SELINUX 类型。例如, /var/www/html 中的文件具有类型 httpd_sys_content_t 。 /tmp 和/var/tmp 中的文件通常具有类型 tmp_t
• Seliux 策略具有允许以 httpd_t 身份运行的进程访问标记为httpd_sys_content_t 的文件的规则。没有规则允许这些进程访问标记有tmp_t 的文件,因此将拒绝这些访问,即使常规文件权限指出应该允许这些访问。

Selinux模式:
强制模式(Enforcing):Selinux主动拒绝访问,尝试读取类型上下文为tmp_t的web服务器。在强制模式中,Selinux既记录冲突,也强制执行规则。
许 可模式(Permissive):通常对于问题进行故障排除。在许可模式下,即使没有明确规则,Selinux也允许所有交互,并且记录所有被拒绝的交 互。此模式可以用于确定是否存在Selinux问题。无需重新引导即可从强制模式转为许可模式,或从许可模式到强制模式。

Selinux模式的修改:
#getenforce  查看selinux模式
#setenforce 0|1  0表示许可模式,1表示强制

[root@xxb1 ftp]# vim /etc/sysconfig/selinux
SELINUX=disabled (enforcing|permissive)
注意:括号里面的两种模式转换立即生效,如果括号里面的模式需要转换为disabled需要重启主机。

Selinux安全上下文的显示:
文件处理命令一般具有一个用于显示或设置Selinux上下文的选项(通常是-Z)。例如:ps,ls,cp,mkdir都可以使用-Z选项显示或设置selinux上下文。
#ps auxZ
#ps -ZC
#ls -Z
# ls -Zd hello/  查看目录的安全上下文
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 hello/
# ls -Z hello/  查看目录文件的安全上下文
-rw-r–r–. root root unconfined_u:object_r:admin_home_t:s0 one

SElinux对vsftpd的影响:
1.selinux=permissive(selinux=diabled)
[root@xxb1 hello]# ll -ld  /var/ftp/pub/
drwxr-xr-x. 3 root ftp 30 Jan 15 14:15 /var/ftp/pub/
[root@xxb1 hello]# ll -ld ../hello/
drwxr-xr-x. 2 root ftp 4096 Jan 15 14:15 ../hello/
anon_upload_enable=YES
[root@xxb1 hello]# lftp localhost
lftp localhost:~> cd pub/hello/
lftp localhost:/pub/hello> put /etc/fstab
put: Access failed: 553 Could not create file. (fstab)
[root@xxb1 pub]# lftp localhost
lftp localhost:~> cd pub/hello/
lftp localhost:/pub/hello> put /etc/fstab
put: Access failed: 553 Could not create file. (fstab)
[root@xxb1 pub]# setenforce 0
[root@xxb1 pub]# lftp localhost
lftp localhost:~> cd pub/hello/
lftp localhost:/pub/hello> put /etc/fstab
465 bytes transferred

注意:也就是说,vsftpd服务允许匿名用户上传文件,但是上传的目录必须有写(w)权限,这样整个服务对于匿名用户才是可以上传文件的。但是selinux会影响目录的权限。

2.selinux开启状态下的vsftpd的上传:
[root@xxb1 pub]# setenforce 1
[root@xxb1 pub]# ls -Z
drwxrwxr-x. root ftp unconfined_u:object_r:public_content_t:s0 hello
默认selinux对目录没有写权限,因此使用chcon -t暂时修改目录的安全上下文,允许目录可写。
[root@xxb1 pub]# chcon -t public_content_rw_t hello/
[root@xxb1 pub]# lftp localhost
lftp localhost:~> cd pub/hello/
lftp localhost:/pub/hello> put /etc/passwd
put: Access failed: 553 Could not create file. (passwd)
对上传目录增加写权限会发现仍然不能上传,这是因为sebool布尔值会对selinux控制的服务进行制约。
[root@xxb1 pub]# getsebool -a | grep ftp
ftp_home_dir –> off
ftpd_anon_write –> off
。。。。。。。。。。。。
查看布尔值,发现selinux默认不允许ftp匿名写。
修改sebool的值.
[root@xxb1 pub]# setsebool -P ftpd_anon_write on

[root@xxb1 pub]# getenforce
Enforcing
[root@xxb1 pub]# lftp localhost
lftp localhost:~> cd pub/hello/
lftp localhost:/pub/hello> put /etc/passwd
2004 bytes transferred

3.使用自定义默认发布目录
[root@xxb1 hello]# vim /etc/vsftpd/vsftpd.conf
local_root=/mnt/hello
[root@xxb1 hello]# systemctl restart vsftpd
将selinux设置为permissive(0)可以访问。使用本地用户登录(lftp -u xxb localhost)可以看到/mnt/hello下面的内容。

将selinux设置成enforcing或者disabled,需要设置安全上下文的列表。才能查看发布目录的内容
[root@xxb1 hello]# ls -Z /mnt/hello/
drwxr-xr-x. root root unconfined_u:object_r:mnt_t:s0   pub
[root@xxb1 hello]# ls -Z /var/ftp/
drwxr-xr-x. root ftp system_u:object_r:public_content_t:s0 pub
[root@xxb1 hello]# chcon -t public_content_rw_t pub/ -R

临时修改安全上下文
[root@xxb1 /]# chcon -t public_content_t /data
[root@xxb1 /]# restorecon /data/ 刷新安全上下文
[root@xxb1 /]# ls -Zd /data/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /data/
[root@xxb1 /]# semanage fcontext -l | grep /var/ftp
/var/ftp(/.*)?                                     all files          system_u:object_r:public_content_t:s0
/var/ftp/bin(/.*)?                                 all files          system_u:object_r:bin_t:s0

使用semanage命令进行永久更改安全上下文
[root@xxb1 /]# semanage fcontext -a -t public_content_t “/data(/.*)?”
[root@xxb1 /]# semanage fcontext -l | grep /data
/data(/.*)?
查看内核中selinux状态(默认的安全上下文)
[root@xxb1 /]# restorecon -RvvF /data   刷新内核中的安全上下文参数
参数修改后,使用本地用户登录就可以访问/data/pub里面的内容了。要想上传必须ftp服务允许(本地)用户上传,默认家目录可写,sebool值允许写。

 
(用semanage fcontext 会将其写入内和内核)
semanage fcontext -l(查看)
getsebool -a
setsebool -P ftpd_anon_write on

暂时修改selinux安全上下文:
#chcon -t   一次性定制安全上下文,执行restorecon刷新后还原
#semanage fcontext -l(查看) 永久更改安全上下文

注意:有的系统默认没有安装此软件,使用(yum whatprovides */semanage)查看此软件包。
semanage fcontext使用正则表达式来指定路径和文件名。fcontext规则中最常营的扩展正则表达式是(/.*)?,表示随意地匹配/后跟任何数量的字符。
#semanage fcontext将递归地与在表达式前面列出的目录以及该目录中的所有内容相互匹配。
管理selinux布尔值:
Selinux布尔值是更改selinux策略行为的开关。
selinux布尔值是可以启用或禁用的规则。
#getsebool   用于显示布尔值
#setsebool -P 修改SElinux策略,永久保留修改。
#semanage boollean  -l  显示布尔值是否永久

监控SElinux冲突:
必须安装setroubleshoot-server 软件,可以将selinux消息发送至/var/log/messages
#sealert -I UUID用于生成特定事件的报告
#sealert -a /var/log/audit/audit.log 用于在该文件中生成所有事件的报告。

 

 
第十一章:系统恢复技术
MBR的446字节存放了系统的引导信息,如果引导毁坏了,可以进入挽救模式进行修复。
1.模拟主引导损坏:
#dd if=/dev/zero of=/dev/sda bs=446 count=1
进入挽救模式:
sh-4-2#chroot /mnt/sysimage
bash-4.2#grub2-install /dev/sda
2.不小心删除linux启动文件/boot/grub2/grub.cfg
默认开机手动启动:
grub>set root=’hd0,msdos1′
grub>linux16 /boot/vmlinuz-3……. ro root=/dev/mapper/centos-root
grub>initrd /boot/initafs-32….img
grub>boot

手动生成grub.cfg:
#grub2-mkconfig > /boot/grub2/grub.cfg
3.修改密码
启动时修改kernel引导项”rw rd.break”
ctrl +x  进入单用户
#chroot /sysroot 进入单用户模式
#passwd   修改密码
#touch /.autorelabel
ctrl +d    退出
4./boot/grub2/文件损坏异常(其实是缺少kernel包)
进入挽救模式,配置ip进行下载相应的kernel软件包,安装(rpm -ivh kernel**.rpm –force)并且重新生成grub.cfg文件,并且进行重启。

根据红帽RHEL7官方文档对centos7进行技术剖析(一)

序言:红帽7教学环境介绍
rht-vmctl命令介绍;
$ rht-vmctl start desktop     启动desktop虚拟机

$ rht-vmctl view desktop            显示(查看)desktop虚拟机
$ rht-vmctl stop desktop            停止(关闭)desktop虚拟机
$ rht-vmctl reset desktop     重置desktop虚拟机(恢复到全新状态)
第一章:访问命令行
目标:用户bash shell在linux控制台进入命令
在GNOME桌面环境启用应用
使用bash功能运行命令

Bash(Bourne-Again shell)的介绍:一个命令行就是一个可以被用来想OS输入的文本接口。
# cat /etc/shells        RHEL6的默认支持的shell(前两种可登陆)
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/dash
用户环境说明:(注意:#表示超级用户 $普通用户)
[root@instructor ~]# su – xxb
[xxb@instructor ~]$
[当前用户身份@主机名称 当前所在目录]用户身份
$su – username      切换用户身份

虚拟控制台:
用户可以通过一个终端(terminal)访问shell
ctrl+alt+F(1|7)    从任何一个终端回到前一个
ctrl+alt+F(2~6)   六个虚拟控制台

Shell基础:
1.命令输入模式
输入命令必须在shell提示符之后(也就是必须在#和$之后)
格式:命令 选项 目标
ctrl+c 终止当前shell提示符的操作
选项格式:-表示选项的简称 –表示选项的全称(command -h/–help)
2.获取帮助
命令的帮助模式中[options]是选加的,<options>是必须加
如果一个命令没有–help,那就使用man(manual)进行查看帮助
manual命令格式: man+[command]
man 5 +[filename]
/string 查找字符串
q退出

GNOME 桌面:
怎样登陆,工作区,开启一个terminal,锁屏(ctrl+alt+L)
关机(poweroff/shutdown -h now/init 0)
重启(reboot/shutdown -r now /init 6)

简单命令实例:
#date                 显示日期(详细使用帮助看参数)
#date +%F             显示数字年月日
#date +%Y-%m-%d       显示年-月-日
#date -d +1365day     计算1365天之后的日期

#passwd               用来修改密码(后面加用户,默认为当前用户)
#passwd -l username   锁定用户不能登录(-u解锁)
#file /etc/passwd     查看文件类型
#head  -n /etc/passwd    查看文件的前多少行
#tail -n /etc/passwd  查看文件的后多少行

#wc /etc/passwd        统计文件的行数,单词数和字符数
#wc -l(行数) -c(字符数) -w(单词数)
注意:一个中文占三个字节数

#touch filename       新建文件
#mkdir dirname        新建目录
#vim  filename        编辑文件

合理使用Tab键,可以自动补齐系统中存在的文件盒命令

命令行中的快捷键:
ctrl+a   #从光标跳到行首
ctrl+e   #跳到行尾
ctrl+u   #删除光标之前的所有
cctrl+k   #删除光标所在字符到行尾
ctrl+l   #清屏
ctrl+shift+t  #增加一个终端
ctrl+d   #关闭终端(退出用户)

历史命令:
#history   #查看历史命令
#!number  #执行第number次执行的命令
#!string  #执行string命令开头的命令
#ctrl+r   #查找曾经执行的命令
第二章:从命令行访问文件
熟悉linux下的目录信息
使用绝对路径和相对路径确定文件
创建,复制,移动和删除文件目录
使用shell快速查找多个文件
linux下的文件系统结构:倒树状的结构,以/统领所有目录
/usr:存放已安装的软件,共享库文件,头文件以及程序数据
/usr/bin表示用户命令
/usr/sbin系统管理员命令脚本
/usr/local自定义软件路径
/etc:系统的配置文件所存放的位置
/var:系统数据存放位置
/run:存放进程的运行数据,包括进程ID文件,和锁文件。存放在内存中,重启后数据会重新创建。
/mnt:设备的挂载点
/home:普通用户的家目录,用来存放个人数据和配置文件
/root:超级用户的家目录
/tmp:临时文件的存放点,超过10天的文件会被删除
/var/tmp:在30天内不能被访问,修改
/boot:系统启动文件,存放引导信息
/dev:存放系统设备文件,用来访问硬件

绝对路径:在系统文件的真实路径
相对路径:文件名是相对于当前目录的
[root@instructor ~]# pwd //显示当前工作环境
/root
[root@instructor ~]# ls         //列出当前包含的文件目录
hello  lvsRS.sh  lvsstop.sh  one  rpmbuild  tlz
[root@instructor ~]# cd rpmbuild/   //切换到下一个目录
[root@instructor rpmbuild]# pwd
/root/rpmbuild

总结:在/root下,使用(cd rpmbuild)就是相对路径切换目录;使用(cd /root/rpmbuild)就是使用绝对路径进行切换目录

[root@instructor rpmbuild]# ls -l //长列表显示
drwxr-xr-x 2 root root 4096 Jun  4  2014 BUILD
drwxr-xr-x 2 root root 4096 Jun  4  2014 BUILDROOT
文件属性 权限 用户 组 文件大小 文件更新时间 文件名
[root@instructor rpmbuild]# ls -a
.  ..  BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS
//ls -a 显示所有文件,包括隐藏文件。其中.代表当前目录 ..代表上一层目录
//ls -R  显示当前目录下的目录以及子目录文件

[root@instructor ~]# cd –  //cd -用来切换当上一个工作目录
/root/rpmbuild
[root@instructor rpmbuild]# cd ~  //切换到当前用户家目录

创建目录,文件:
#mkdir dirname   新建目录
#mkdir -p /hello/xxb  递归创建目录(-p参数的作用)
#touch filename   新建文件
#touch file{1..5}  批量创建文件

#cp filename(-r dirname) dirname
//拷贝文件到指定目录(拷贝目录需要指定-r参数,其他命令一样)

#mv filename dirname  移动文件(可以重命名)
#rm -r dir   删除目录
//-r参数删除目录;-f参数强制删除;-i删除时提示(alias=’rm -i’)
模式匹配:(shell重点)
* 匹配一个或多个字符
?匹配任意单个字符
– 当前用户的家目录
~username 用户的家目录
[abc..] 匹配括号中的任意字符
[!abc…] 匹配任意非括号的字符
[^abc…] 作用同上
注意:命令行可以同时执行多个命令,使用;隔开
[xxb@instructor ~]$ mkdir test;cd test
[xxb@instructor test]$ ls a* 列出以a开头的文件
[xxb@instructor test]$ ls *a*   列出中间有a的文件
[xxb@instructor test]$ ls [ac]* 列出a或c开头的文件

输出命令
echo    输出命令,类似c中的print
echo $env 输出变量值
[xxb@instructor ~]$ echo $HOSTNAME
instructor.example.com
$ rm -f [[:alpha:]]*###字母
$ rm -f [[:punct:]]*###符号
$ rm -f [[:lower:]]*###小写
$ rm -f [[:lower:]]*###小写
$ rm -f [[:upper:]]*###大写
$ rm -f [[:alnum:]]*###字母和数字
$ rm -f [[:digit:]]*###数字
$ rm -f [[:space:]]*###空格

 

第三章:获取RHEL7帮助信息
1.使用man(manual)命令进行手册查看
2.使用pinfo 查看文档
3.使用RPM包的文档(说明性文档,软件安装包文档在/usr/share/doc)

man帮助
space/pagedown  ###往下翻一页
pageup   ###往上翻一页
上键   ###往上一行
下键   ###往下一行
d   ###往下半页
u   ###往上半页
n   ###往上匹配的关键字
N   ###往下匹配的关键字
g   ###返回开头
G   ###回到结尾
/string   ###高亮显示关键字

#cat -n filename ###显示文件内容,并且显示行数
#cat -b filename  ###显示有内容的行数

 

第四章:创建、查看、编辑文件
重定向文件内容到另外一个文件或者命令
标准输入(0);标准输出(1);标准错误输出(2)
用<来改变读进的数据信道(stdin),使之从指定的档案读出
用>来改变送出的数据信道(stdout,stderr),使之输出到指定档案
管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin
tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去

cmd (1)> file  把stdout重定向到file文件中(覆盖)
cmd >> file 把stdout重定向到file文件中(追加);
cmd > file 2>&1 把stdout和stderr一起重定向到file文件中
cmd &> file  作用同上
cmd 2> file  把stderr重定向到 file文件中(覆盖);
cmd 2>> file 把 stderr 重定向到 file 文件中(追加);
cmd >> file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中(追加);
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;
cat <>file 以读写的方式打开 file;
cmd 2>/dev/null 把stderr输出到垃圾箱中

例子:
$ find /etc -name passwd   查找文件
$ find /etc -name passwd >file1    将stdout输出到file
$ find /etc -name passwd 2>file2   把stderr输出到file2
$ find /etc -name passwd &>file3   把全部的输出放入file3

$ find /etc -name passwd 2>>file2  把stderr追加到file2
$ find /etc -name passwd &>>file3 把全部输出追加到file3
$ find /etc -name passwd >>file4 2>&1把全部输出追加到file4

$ ping -c1 -w1172.25.254.250 &> /dev/null && echo yes || echo no
//将测试网络连通的结果全部房间/dev/null。
&&表示前一个命令成功则执行下一个命令
||表示前一个命令不成功则执行下一个命令

$ find /etc -name passwd 2>&1 |wc -l
//统计全部输出结果的行数

$ find /etc  -name passwd 2>&1 | tee text|wc -l
//将所有输出保存到text文件,并且统计行数

重点:统计错误行的行数
$ find /etc -name passwd 2>&1 > /dev/null | tee text|wc -l
//(注意:|管道只接受正确的输出)将所有内容的正确内容输出/dev/null,将错误信息tee到text里面

 

$ find /etc  -name passwd >file6 >>file7 2>&
#####命令后的所有符号都是一起执行的
$ stat file6###查看file6的时间戳
Access: 2014-12-14 13:31:24.936367308 +0800
Modify: 2014-12-14 13:32:00.878908269 +0800
Change: 2014-12-14 13:32:00.878908269 +0800

在shell模式下编辑文件:VIM编辑器
vim 模式(用法查看vimtutor)
vim编辑器的三种模式:命令模式,插入模式,退出模式
用法:(命令模式下)
ctrl+v  ###高量选择模式
u  ###恢复
ctrl+r  ###撤销恢复
统一添加:ctrl+v选择第一行,shift+i(大写I)进入编辑模式,输入后按esc键
set nu  ###添加数字
:help  ###帮助
:wq  ###保存退出
:q  ###退出
:q!  ##强制退出不保存
:wq!  ##强制退出并保存
c  ###剪切
dd  ###删除光标所在行(dnd删除n行,dw删除单词必须把光标放到最前面,dl删除字母同x相同)
yy  ###复制(yny复制n行,ywy复制单词,yly复制字母)
p  ###粘贴
i  ###输入
x  ###删除光标所在字母
delete  键###删除
ctrl+w+s ###上下分页
ctrl+w+v ###左右分页
ctrl+w+c ###删除分页
:/s/hello/wes/g ###用wes替换hello(批量替换)
I  ###行首插入
A  ###行尾插入
a  ###光标所在的下一个
O  ###光标所在行的上一行插入
o  ###光标所在行的下一行插入
s  ###删除光标所在位置再插入
S  ###删除光标所在行在插入
vim+已有文件名/vim+想要新建的文件名/vim进入,但在“:wq”退出时需要在后面加上文件名,例如(:wq file)
由插入模式转换到命令模式或者退出模式,使用Esc键

gedit(用法查看yelp help:gedit)
ctrl+o###打开文本
ctrl+n###建立新的文本
ctrl+s###保存
ctrl+w###关闭
ctrl+f###打开查询窗口
第五章;管理本地linux用户和用户组

用户:在系统中的每一个进程都以一个特殊用户身份运行。每一个文件都属于一个特殊的用户。
命令id被用来显示当前用户信息。
每一个文件和进程都拥有自己的用户和用户组。

/etc/passwd :有关用户的信息文件
#cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
用户:密码:UID:GID:content:家目录:shell

组:每一个用户都一个初始组,同时用户可以有附加组。在一个组里的用户拥有相同的权限。
/etc/group :有关组的信息文件
#cat /etc/group
root:x:0:
组名:密码:GID:相应组里的用户
su – student  ###切换的是用户身份及其用户环境
su student  ###切换的是用户身份
低级用户切换到高级用户需要密码

useradd(添加),userdel(删除+-r),usermod(修改)
-d  ###指定家目录
-c  ###描述
-g  ###指定初始组ID
-G  ###指定附加组(useradd -G 1000 xxb)
-s  ###分配shell
-u  ###指定初始uid

usermod
-aG  ###表添加附加组
-L  ###表锁定
-U  ###表解锁
-md  ###表示家目录的信息及passwd下的家目录名称

权限的使用:
使用visudo去编辑/etc/sudo
#visudo
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
test   localhost=(root)NOPASSWD:/usr/sbin/usermod

#####test为用户,localhost为主机名,root为身份,NOPASSWD:/usr/sbin/usermod为动作,必须用绝对路径

#sudo /usr/sbin/usermod -G 0 student
kill -9   #强行结束进程

/etc/shadow :用户认证信息
密码:
# watch -n 1 tail -2 /etc/shadow
Every 1.0s:tail -2 /etc/shadow                     时间
gnome-initial-setup:!!:16261::::::
tcpdump(用户名):!!(加密):16261(使用天数):(最短有效期):(最长有效期):(警告期):(过期后可再用几天):(活跃期):

chage -m 1 test 最短有效期,0 表示无限
chage -M 10 test 最长有效期
chage -I 1 test  过期后可再用几天
chage -d 0 test 使用天数
chage -W 7 test 警告期
第六单元:管理文件和目录权限
Linux文件系统权限:
文件必须被拥有文件权限的用户访问
文件和目录中权限的作用:
r(read)    文件内容可读  目录的内容可被显示
w(write)   文件内容可改(rw同时) 可切换目录并且可创建或删除文件
x(exec)    文件可被用作命令执行   目录中的内容能被访问(依赖文件权限)

一般而言,对于目录的权限w和x是同时具备才有意义的。
对于文件而言,x权限配合r权限使用。

查看文件/目录的权限以及属主
#ls -l filename
-rw-r–r–. 1 kiosk kiosk 14924 Dec 19 22:45 unit3—
-表示文件标识 ugo权限
#ls -ld /home

管理文件系统权限:
修改文件/目录权限
#chmod [who][what][which] file/directory
u/g/o/a +/-/= r/w/x

#chmod ### file/filename
r=4,w=2,x=1

管理文件/目录的用户和用户组:
#chown username directory
#chgroup -R groupname directory

特殊权限:
SUID;SGID;StickyID
u+s(suid) :只针对可执行文件来说,拥有s权限的文件,任何用户可以以该文件的属主权限来运行
g+s(sgid):拥有此权限的文件,用户可以以属组的身份运行。拥有此权限的目录下创建的文件拥有组的权限
o+t(sticky):只针对目录来说。任何用户可以在目录里写,但是只能删除自己的文件;不能删除或保存其他用户的文件。

特殊权限的设置:
setuid=u+s;setgid=g+s;sticky=o+t
setuid=4;setgid=2;sticky=1

文件的默认权限,umask值的设置:
umask值:文件或目录在创建时减去的权限值
为什么要设置umask?
怎样设置umask?
umask权限的数字更改;vim /etc/bashrc (/etc/profile)

 

注意:在实际生产和应用中, 权限的设计以及使用时很有技巧的,包括同一个目录对于不同用户,不同用户组的权限设置都是需要一定艺术思考的。因此在面试过程中偶尔也会对相关权限知识进 行提问解答,对于权限的设置,希望读者能够更加深入了解权限对于用户,组,以及文件目录的相关作用,以及常用特殊权限的使用。
第七章:监视和管理linux进程
列出和解释系统运行进程的基本信息
使用任务控制,控制进程
使用信号终止(terminate)和控制进程(kill -9)
监控资源使用率,系统负载。
何为进程:一个运行实例(可执行程序)的过程
进程包含:被分配的内存地址空间;
安全性能,包括属主,凭证和权限。
一个或多个可执行的程序代码
进程状态
进程状态:running;sleeping;stopped;zombie

列出进程信息:
#ps
-a    列出所有虚拟终端(除过终端用户)
-l 长列表显示
-e 所有进程
-f
-u 按有效用户ID(用户名)排列
-x

任务控制:
#bg  显示当前后台运行的进程
#fg  掉用当前后台执行的进程
#jobs  查看任务列表
#ctrl+z 将当前任务暂时放到后台执行(释放当前终端)
#&  将任务放到后台执行

终止进程:
#kill 信号 pid
#killall 信号 command
信号种类以及作用:
1   HUP     终端断线
2   INT    中断(同ctrl+c)
3   QUIT    退出(同ctrl+\)
9   KILL          强制终止
15  TERM    终止
18  CONT    继续(与STOP相反,fg/bg命令)
19  STOP    暂停(同ctrl+z)
20  TSTP
INT—- 是当用户键入时由终端驱动程序发送的信号.这是一个终止当前操作的请求.如果捕获了这个信号,一些简单的程序应该退出,或者允许自给被终止,这也是程序没 有捕获到这个信号时的默认处理方法.拥有命令行或者输入模式的那些程序应该停止它们在做的事情,清除状态,并等待用户的再次输入.
TERM—-是请求彻底终止某项执行操作.它期望接收进程清除自给的状态并退出

登录用户管理:
#w 显示当前登录的用户信息以及用户进程信息

实时进程监控:
#top
top前五行统计信息:
第一行是任务队列信息(当前时间;系统运行时间;用户数;;系统负载,即任务队列的平均长度1min,5min,15min前到现在的平均值)
第二行和第三行是进程和CPU的信息
Cpu(s):  0.3%us,  0.7%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
us表示用户空间占用CPU;sy表示内核空间占用百分比;ni用户进程空间内改变过优先级的进程占用CPU;id表示空闲CPU百分比;wa表示等待输入输出的cpu时间百分比;
第五行为内存信息

 第八章:控制服务和后台进程
列出系统进程和通过系统服务启动的网络服务以及套接字单元
控制系统后台进程,使用systemctl控制网络服务
systemd是一个init进程
systemctl命令可以控制服务
格式:systemctl  start|stop|restart|status services
服务的状态:
loaded  配置文件已经被加载
active(running)进程正在运行
active(exited) 成功完成了一次配置
active(waiting)运行等待
inactive 没有运行
enabled 将在启动时运行
disabled 启动时不运行
static  可以被enabled,但是可以被自动start

控制系统服务:
在开机时启动或关闭系统进程服务
格式:systemctl enable service
system disable service
在系统运行时停止或启动系统进程服务
格式:systemctl start service
systemctl stop service

 第九单元:管理和配置OpenSSH服务
使用ssh从一个shell登录到远程的系统
设置ssh允许安全验证(无密码访问,通过私有认证文件)
自定义sshd文件,限制以root用户直接登录,关闭密码认证
ssh(secure shell):在远端运行安全的shell,远程登录服务器(必须安装ssh服务),然后执行本机命令。
#yum groupinstall openssh* -y

ssh用法:
#ssh username@domainname(IP)  需要输入密码
默认只输入域名或者IP登录的是root用户
#ssh -X username@IP         登录图形

SSH主机认证:
#ssh-keygen          产生秘钥文件(生成密码)
#ssh-copy-id serverX(remote-IP)    拷贝公钥到远程主机(-i 密钥文件)
#ssh serverX             第一次需要密码验证(以后免密码)
公钥用于加密,私钥用于解密

[root@localhost ~]# cat .ssh/known_hosts
192.168.2.234 ecdsa-sha2-nistp256      认证记录文件
远程主机,远程主机IP,验证密码
[root@localhost ~]# ls /etc/ssh/*key* 认证文件(公私钥)
/etc/ssh/ssh_host_ecdsa_key      /etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_ecdsa_key.pub  /etc/ssh/ssh_host_rsa_key.pub

自定义ssh服务:
配置文件:/etc/ssh/sshd_config
#PermitRootLogin yes|no     允许root用户运城登录
#PasswordAuthentication yes|no  选择密码认证
systemctl restart sshd.service  重启ssh服务

第十章:分析和存储日志
描述RHEL7基本的日志体系结构;
理解(interpret)有关日志文件记录(entries),去排查问题或者查看系统状态;
在系统日志(journal)中查找和理解日志文件记录,排查问题,监控系统状态;
配置systemd-journald,在磁盘上存储日志;
维护时间同步,配置时区确认当前系统日志的时间戳

系统日志:
/var/log/messages 大部分的系统日志信息
/var/log/secure  安全认证相关日志相关错误
/var/log/maillog 邮件服务相关日志信息
/var/log/cron  自动任务相关日志
/var/log/boot.log 系统启动相关日志

/etc/rsyslog.conf  系统日志定义文件
#### RULES ####
#kern.*                      /dev/console
authpriv.*                  /var/log/secure
mail.*                     -/var/log/maillog
日志类别,等级   日志存储文件

同步系统文件:
1.关闭防火墙
2.开启服务 vim /etc/rsyslog.conf
3.15,16行开启UDP,19/20行开启TCP。
*.*    @/@@172.25.254.189(前UDP,后是TCP,都加接受端的ip地址)仅发送端修改
4.man 5 rsyslog.conf##查看用法,vim /etc/rsyslog.conf###接受端修改
5.logger test###产生日志,仅发送端
6.watch -n 1 tail /var/log/messages###仅接受端

使用journalctl查看日志:
注意:journalctl服务是红帽7专门查看日志的特殊工具,将系统化的系统日志保存下来,并在关机后默认清除。
#journalctl -n 5 查看最后5条日志
#journalctl -f   在线动态查看日志(tail)
#journalctl –since today –until “y-m-d h:m:s”
#journalctl -p err 查看错误日志

永久存储系统日志(permanently):
#mkdir /var/log/journal/
#chown root:systemd-journal /var/log/journal/
#chmod 2755 /var/log/journal/
#killall -1 systemd-journald
一般的会在/var/log/journal/下生成一个目录,同时目录下会生成system以及用户文件

设置本地时钟和时区:
# timedatectl   显示当前时间时区等信息
Local time: Fri 2014-12-19 22:28:14 CST
Universal time: Fri 2014-12-19 14:28:14 UTC
RTC time: Fri 2014-12-19 22:28:14
Timezone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
# timedatectl list-timezones 列出时区
# timedatectl set-timezone 时区  设置时区
# timedatectl set-time 22:31:21  设置时间
# timedatectl set-ntp true/flase  开启NTP(注意,有个bug好像,第一次执行报错)

配置和监控chronyd:(维护系统时间的精准度?)
背景程序,可以在启动的时候开启(类似于ntpd服务?)
-n and -d
#vim /etc/chrony.conf  修改配置立即同步
server ntp.server.example.com iburst
# systemctl restart chronyd.service
# chronyc sources -v  同步配置显示
第十一章:管理RHEL7系统网络
1.了解计算机网络的基本概念
2.使用基本工具测试查看当前网络配置
3.使用nmcli(network manager contral list)管理网络设置和设备以及NetworkManager
4.通过编辑配置文件修改网络设置
5.配置和测试系统主机名以及名字解析

计算机网络基本要素:
IPaddress:ip地址,用来唯一确定一台主机的位置信息N(一般使用八位2进制来识别,使用点分十进制表示)
DNS:域名解析系统(domain name system)用来记录IP地址和域名的对应信息的,方便用户使用域名信息访问特定的服务。
GATEWAY:网关,又称网间连接器,在网络层实现互联,用来将不同网络间的报文信息进行翻译。

IP地址的划分:
172.17.5.3=10101100.00010001.00000101.00000011
NETMASK的表示:
255.255.0.0=11111111.11111111.00000000.0000000
注意:掩码部分全为1的表示为网络位,全为0的表示主机位

网络配置查看的相关命令:
# ifconfig  查看当前网络接口信息
# ip addr show DEVICE 查看某个网络接口信息
#ping -c -w   测试网络的连通性(c表示连接数,-w代表时间)
#ip route  查看当前路由表信息
#route -n  查看网关信息
#traceroute  查看网络数据包经过路由(数据走向)

查看网络端口信息:
#ss -n  查看接口和端口信息,使用数字表示
#ss -t  查看TCP链接
#ss -u  查看UDP链接
#ss -l  只显示监听的链接
#ss -a  显示所有链接
#ss -p  显示正在使用socket链接的进程

红帽7特有的配置网络工具:
nmcli(network manager contral list):命令配置
nm-connection-editor:      图形界面配置
nmtui:   终端界面配置

nmcli命令详解:
# nmcli connection show 显示网络链接
# nmcli device show  显示设备信息
注意:nmcli 命令下的参数和目标都是可以tab出来的。
nmcli
connection (对连接的网络进行增、删、改、查)
device(对设备进行操作网卡的状态显示、链接)
general(通用设置)
neworking (网络开关)
radio(radio信息)
使用配置文件进行网络参数修改:
/etc/sysconfig/network-scripts/
网络配置文件都会以ifcfg-开头
红帽7默认使用ens33设备。

网络配置的两种模式:
#cat ifcfg-ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.2.234
NETMASK=255.255.255.0
GATEWAY=192.168.2.1
BOOTPROTO=none|static (网络配置模式,静态)
DNS=192.168.2.254

#cat ifcfg-ens33 动态网络配置
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=dhcp (动态主机配置,需要开启服务)

#systemctl restart network 重启网络加载网络配置参数

修改系统主机名称:
#hostname 显示当前主机名
#hostnamectl set-hostname  设置主机名
#hostnamectl status  查看主机名信息
#vim /etc/hostname  手动查看主机名信息

配置名称解析:
/etc/hosts
/etc/resolv.conf
# nmcli connection modify ens33 ipv4.dns IP 修改dns
# vim /etc/nsswitch.conf 修改检索顺序

 

 

补充知识:
在实际中安装双系统时发现安装Centos7后发现之前的windows系统不见了。此时,读者千万不要慌张,如果在安装 linux时选择的是自动分区,那么就不会损坏之前磁盘的信息(如果自己手动分区,并可能损坏了就不要继续看了)。为什么呢?因为CentOS7跟随 RHEL7的脚步,grub已经升级到v2版本了,因此不会自动加载到其他磁盘的系统引导信息,因此,如果你装完双系统重启后发现不能正常启动 windows,接下来就教你怎样手动把windows启动信息加入grub2,让grub共同管理windows和linux的启动信息。
编辑grub文件;
#vim /boot/grub2/grub.cfg
找到menuentry 信息,在之前添加以下信息
menuentry ‘Windows 7′{
set root=’hd0,msdos1’
chainloader +1
}
重启linux系统就可以发现启动信息有windows了。
第十二章:在系统间存档和拷贝文件
1.使用tar工具从现有的目录文件中提取新建一个归档文件
2.使用sshd把文件从远程系统拷贝本地或者到远程(安全的)
3.使用远程拷贝安全的同步本地文件或者内容

tar工具,是linux系统中备份文件的可靠方法,几乎可以工作在任何环境中,使用权限时所有用户。
使用方法:
#tar 选项  filename.tar  file|directory
选项列表:
-c 创建一个归档文件
-x 从档案中释放文件
-f 使用档案文件或设备

-v 详细显示tar处理的信息
-t 列出档案文件内容
-r 把要存档的文件追加到归档文件末尾
–get
–delete
-j 使用bzip2格式进行压缩
-J
-z 使用gzip来压缩和解压缩文件
example:
# tar -zcf hel.tar.gz hel/ 压缩目录
# tar zxf hel.tar.gz  解压gz文件
# tar jcf hel.tar.bzip hel/ bzip格式
# tar jxf hel.tar.bzip

#tar Jcf hel.tar.xz hel/  压缩xz格式

其他压缩工具:gzip,bzip2,xz
#gzip filename(-r directory) 压缩成gz格式
#gunzip filename.gz        解压gz文件
# bzip2 file1
# bunzip2 file1.bz2
# xz file1
# unxz file1.xz
更多参数请自行查看帮助

拷贝文件到远程主机或者从远程主机拷贝文件(scp)
上传:
# scp -r /root/hello/ root@192.168.2.254:/root/xxb  将本地hello目录上传到远程主机xxb下
下载:
# scp -r root@192.168.2.254:/root/rpmbuild /root/hello/  将远程主机目录拷贝到本地hello下
注意:-r参数表示同步的是目录(默认不加参数表示普通文件)

 

使用sftp转移远程文件:
# sftp root@192.168.2.254 登录远程主机
此时需要提供远程主机密码,默认登录用户家目录
sftp> ls   本地操作远程主机
sftp> put /etc/hosts  把本地文件上传到远程主机
sftp> get /etc/hosts.allow 把远程主机文件下载到本地目录(当前登录目录)

使用rsync同步文件和目录
rsync也是文件传输程序,和scp用法相似。区别是rsync具有增量备份的功能。scp只是简单的拷贝,使用ssh协议
#rsync [options] source destination
参数选项:
-r 同步整个文件目录
-l 同步连接
-p 保留权限
-t 保留时间戳
-g 保留文件的用户组
-o 保留文件的所有者
-D 同步设备文件

examples:
#rsync -r test/ 192.168.2.234:/root/hello
将本地目录中文件同步到远程,同步后会自动识别到远程的文件目录和权限
# rsync -g(u) filename1 192.168.2.234:/root/hello
同步文件,到hello目录,保证文件的属组是本地权限
注意:默认普通用户传到超级用户-u选项是不生效的;同时,同步后会发现两个主机的权限是不一样的(自行查看)
# rsync -p filename1 192.168.2.234:/root/hello
-p选项可以使文件权限不变
经常使用的参数就是pug

第十三章:安装和更新软件包
1.解释一下,什么是RPM包,怎样在CentOS上使用rpm管理软件
2.使用yum工具进行发现,安装和更新软件包
3.启用CentOS/RHEL或者第三方yum仓库
4.测试并且安装下载的软件包
一个RPM包的名称架构信息:
yum-utils-1.1.31-24.el7.noarch.rpm
软件名字-软件版本.发布行.架构.rpm
其中架构一般分为noarch和x86_64和i686。noarch为软件的通用架构,也就是适用于32位和64位。后两个架构分别为64和32位设计。

使用yum管理软件:
yum配置文件:/etc/yum.conf
将配置中的keepcache改为1则可以将安装的软件下载
yum源文件目录:/etc/yum.repos.d/

yum源的创建和指定:
注意:yum源的文件必须以.repo文件结尾,并且必须存放在/etc/yum.repos.d/目录中
实例:
# vim /etc/yum.repos.d/base.repo
[base]   yum源名字(全局唯一)
name=xxb  yum源描述
baseurl=file:///mnt/centos7
yum源地址(可使用file|http|nfs|ftp)
gpgcheck=0(1) (不)检查软件包的gpgkey
gpgkey=file gpgkey的地址
enable=0|1 (不)启用yum源
注 意:一般创建yum源前四个信息是必须的。那么我自己的yum源是前四条,[base]是源的名字,给系统识别的;name=xxb是源的描述,方便自己 知道源的用途;baseurl=file:///mnt/centos7是我自己指定的源,因为我用的是自己本地创建的yum源,/mnt /centos7目录下存放着我解压后的镜像文件(即系统自带软件);gpgcheck=0不检查软件包的许可(因为我自己知道来源,可放心使用的)
如果使用的是互联网上的yum源,一般的第三条应该这样写
baseurl=ftp(http)://www.xxx.xxx/   写上网址就行

#yum clean all  配置完成yum源之后进行清除

yum命令详解:
yum list name  按名字列出安装和可用软件
yum grouplist  列出安装和可用的组
yum search KEYWORD 按关键字查找软件
yum info PACKAGENAME 查看软件包的信息
yum install PACKAGENAME 安装软件包
yum groupinstall “GROUPNAME”安装一个软件包组
yum update  更新所有包
yum remove PACKAGENAME 删除一个软件
yum history  显示历史

使用rpm检查下载的rpm包:
#rpm -q -i openssh 显示包的信息
#rpm -q -l openssh 列出ssh软件包含全部文件
#rpm -q -c openssh 列出配置文件
#rpm -q -d openssh 列出软件的文档(doc)
#rpm -q –scripts openssh 列出shell脚本
使用yum安装本地rpm软件包:
#rpm -ivh PACKAGEFILE.rpm
#yum localinstall PACKAGEFILE.rpm

从rpm包中提取文件:
#rpm2cpio zziplib-0.13.62-5.el7.x86_64.rpm |cpio -id
使用此命令可以将包解压开来查看内容

 第十四章:访问CentOS7文件系统
1.识别文件系统层次
2.访问文件系统的内容
3.使用硬链接和符号链接去做多路径名称
4.在挂载的文件系统上查找文件

存储管理概念介绍:
/dev/xdx 磁盘设备(第一个x代表磁盘类型,s代表sata盘,v代表虚拟磁盘。第二个x代表设备的位置,a代表第一块设备)
/dev/cdrom CD/DVD设备
/dev/mapper lvm设备映像

检查文件系统:
#df -H|h 显示文件系统的格式和大小(H是1000,h是1024,单位为k,M,G)
#du -sh|H 显示文件大小

手动挂载文件系统:
#blkid  查看当前设备的UUID
/dev/sda1: UUID=”c9e59a31-69b3-4241-87d5-d5b82073c91b” TYPE=”xfs”
/dev/sda2: UUID=”XuBZVU-srAs-mfXn-IvQS-DGSw-Wq4e-21AUl0″ TYPE=”LVM2_member”
/dev/mapper/centos-swap: UUID=”f88801ef-594e-40cf-b3d6-e232b01e183f” TYPE=”swap”
/dev/mapper/centos-root: UUID=”ca7bf22c-8874-4c7c-b8a3-7ce189298bd3″ TYPE=”xfs”

#mount -o [options] device mountpoint 挂载设备
#umount device/mountpoint  卸载设备
#fuser -kvm device/mountpoint    强制删除设备占用程序
#lsof device|mountpoint

创建连接文件:
#ls -i filename  查看文件的inode
硬链接 #ln file file
软链接 #ln -s file file(相当于windows下的快捷方式)
软链接和硬链接的区别:
区别:硬链接原文件和链接文件公用一个inode号,说明他 们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件;
在文件属性上软链接明确写出了是链接文件,而硬链接没有写 出来,因为在本质上硬链接文件和原文件是完全平等关系;
链接数目是不一样的,软链接的链接数目不会增加;
文 件大小是不一样的,硬链接文件显示的大小是跟原 文件是一样的(这用强调,因为是等同的嘛),而这里软链接显示的大小与原文件就不同了,file1大小是48B,而file1soft是5B,这里面的5 实 际上就是“file1”的大小。(软链接文件的大小就是原文件的名字长度)
硬链接不支持目录,软连接支持哦
总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。

使用locate通过名字定位文件:
# locate passwd  查找和passwd相关的文件
# locate -c passwd 统计和passwd相关文件个数
# updatedb  更新locate数据库

使用find查找文件:
find -name 按名字查找
find -user 按用户查找
find -group 按组查找
find -o
find -size 按大小查找()
find -perm 按权限查找
find -exec 对匹配的文件执行该参数所给出的shell命令。形式:command {} \;
find -m
find -type 按类型查找(f/d/b/l )
find -print 将匹配的文件输出到标准输出
example:
#find /etc -name passwd -exec grep xxb {} \;
查找/etc/下的passwd文件,对文件进行过滤xxb
#find / -type -name andy* -exec rename andy ANDY {} \;
按文件查找andy*文件,并批量替换名称
#find / -size +1000000c -print
 第十五章:使用虚拟化系统
1.安装一个CentOS运行虚拟机(KVM)
2.在虚拟机上perform an interactive install RHEL

系统虚拟化和RHEL:

安装虚拟化:
#grep –color -E “vmx|svm” /proc/cpuinfo
查看cpu是否支持虚拟化
#yum install qemu-kvm qemu-img -y
#yum install virt-manager libvirt libvirt-python python-virtnst libvirt-client
管理虚拟机:
# virsh list  查看运行的主机
# virsh destroy server 摧毁server主机
# virsh list –all 查看所有主机
# virsh start|stop  server

 

补充:

rpm -qp packagename –script  查看包在安装过程的作
rpm -qf /usr/bin/ls 查看文件所在的包
yum whatprovides */usr/bin/ls  查看所以有包信息(查找包)
rpm -qa | grep name   查看包名
rpm -e 包名 –nodeps 删除rpm包(不检查依赖性)
rpm -V vsftpd  查看软件包是否修改了
rpm -k vsftpd  查看包是否修改

 

bootup 中文手册

版权声明

本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。

  • 无担保:本文译者不保证译文内容准确无误,亦不承担任何由于使用此文档所导致的损失。
  • 自由使用:任何人都可以自由的阅读/链接/打印此文档,无需任何附加条件。
  • 名誉权:任何人都可以自由的转载/引用/再创作此文档,但必须保留译者署名并注明出处。

其他作品

本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:

联系方式

由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。

  • Email(QQ):70171448在QQ邮箱

bootup(7)                          systemd-228                         bootup(7)

名称

    bootup - 系统启动流程

描述

    在系统启动过程中要涉及多个不同的组件。按下开机按钮后,首先BIOS/UEFI做最基本的硬件自检与初始化,
    然后加载预设/手动选择的磁盘/网络上的引导加载器(例如GRUB2),引导加载器进一步从磁盘/网络上加载操作系统内核(例如Linux)。
    对于Linux来说,内核将会(可选的)解压一个initrd(initial RAM disk)镜像(可以用dracut(8)之类的工具生成),
    并执行由"rdinit="内核引导参数指定的init程序(例如systemd(1))以寻找并挂载根文件系统。
    完成根文件系统的挂载之后,内核启动由"init="内核引导参数指定的init程序(例如systemd(1))以接管系统的控制权。
    该init程序将会负责检测所有其他的硬件设备、挂载必要的文件系统、启动所有必要的服务,等等。

    关机时,init程序将会停止所有服务、卸载所有文件系统、(可选的)返回initrd环境卸载根文件系统,最后关闭电源。

    其他有关系统启动流程的信息可以参考 boot(7) 手册。

常规启动流程

    当成功挂载了"root="内核引导参数指定的根文件系统之后,内核将启动由"init="内核引导参数指定的init程序,
    从这个时间点开始,即进入了"常规启动流程":检测硬件设备并加载驱动、挂载必要的文件系统、启动所有必要的服务,等等。
    对于 systemd(1) 系统来说,上述"init程序"就是 systemd(1) 进程,
    而整个"常规启动流程"也以几个特殊的 target 单元(详见 )作为节点,被划分为几个阶段性步骤。
    详见 systemd.target(5), systemd.special(7) 手册。
    在每个阶段性步骤内部,任务是高度并行的,所以无法准确预测其中的单元的顺序,但是不同阶段之间的先后顺序总是固定的。

    当启动系统时,systemd 将会以 default.target 为启动目标,借助单元之间环环相扣的依赖关系,即可完成"常规启动流程"。
    通常,default.target 只是一个指向 graphical.target(图形界面) 或 multi-user.target(文本控制台) 的软连接。
    为了强制启动流程的规范性以及提高单元的并行性,预先定义了一些具有特定含义的 target 单元,详见 systemd.special(7) 手册。

    下面的图表解释了这些具有特定含义的 target 单元之间的依赖关系以及各自在启动流程中的位置。
    图中的箭头表示了单元之间的依赖关系与先后顺序,整个图表按照自上而下的时间顺序执行。

    local-fs-pre.target
             |
             v
     (各个 mounts 与       (各个 swap       (各个加密块设备
      fsck services)        devices)            devices)        (各个底层服务        (各个底层API虚拟
             |                  |                  |             services: udevd,     文件系统 mounts:
             v                  v                  v             tmpfiles, random     mqueue, configfs,
      local-fs.target      swap.target     cryptsetup.target     seed, sysctl ...)      debugfs ...)
             |                  |                  |                    |                    |
             \__________________|_________________ | ___________________|____________________/
                                                  \|/
                                                   v
                                            sysinit.target
                                                   |
              ____________________________________/|\________________________________________
             /                  |                  |                    |                    \
             |                  |                  |                    |                    |
             v                  v                  |                    v                    v
       (各个 timers)      (各个 paths)             |             (各个 sockets)        rescue.service
             |                  |                  |                    |                    |
             v                  v                  |                    v                    v
       timers.target      paths.target             |             sockets.target        rescue.target
             |                  |                  |                    |
             v                  \_________________ | ___________________/
             .                                    \|/
             . . . . . . . . . . . . . . . . . . . v
                                             basic.target
                                                   |
              ____________________________________/|                                 emergency.service
             /                  |                  |                                         |
             |                  |                  |                                         v
             v                  v                  v                                 emergency.target
         display-        (图形界面所必须    (各个系统服务)
     manager.service      的各个系统服务)          |
             |                  |                  v
             |                  |         multi-user.target
             |                  |                  |
             \_________________ | _________________/
                               \|/
                                v
                       graphical.target

    用粗体下划线标识的目标单元经常被用作启动目标。有两种方法可以指定启动目标:
    (1)使用 systemd.unit= 内核命令行参数(参见 systemd(1) 手册);(2)使用 default.target 软连接。

    因为 timers.target 以异步方式包含在 basic.target 中,所以 timer 单元可以依赖于在 basic.target 之后才启动的服务。

initrd 启动流程

    在initrd内部,也可以将 systemd 用作init程序(由"rdinit="内核引导参数指定),此时 initrd.target 将是默认目标。
    initrd内部启动流程的上半部分与前一小节 basic.target 之前的部分完全相同,随后的启动流程将如下图所示。
    如果成功的将根文件系统挂载到 /sysroot 目录,那么 sysroot.mount 单元将被激活,然后进一步激活 initrd-root-fs.target 目标。
    initrd-parse-etc.service 将会分析 /sysroot/etc/fstab 文件以挂载 /usr (若需要)与带有 x-initrd.mount 标记的挂载点。
    这些挂载点都将被挂载到 /sysroot 之下,然后流程到达 initrd-fs.target 目标。
    再接下来 initrd-cleanup.service 将会使用
        /usr/bin/systemctl --no-block isolate initrd-switch-root.target
    命令启动 initrd-switch-root.target 目标。因为 isolate 表示立即停止所有在新的目标单元中不需要的进程,
    所以此动作实际上是为接下来切换根目录做预先的准备(也就是清理环境)。
    最后,激活 initrd-switch-root.service 服务,将系统的根目录切换至 /sysroot 目录。

                                    (之前的流程与上一小节完全相同)
                                                   :
                                                   v
                                             basic.target
                                                   |                                 emergency.service
                            ______________________/|                                         |
                           /                       |                                         v
                           |                  sysroot.mount                          emergency.target
                           |                       |
                           |                       v
                           |             initrd-root-fs.target
                           |                       |
                           |                       v
                           v            initrd-parse-etc.service
                    (各个自定义的                  |
                   initrd services)                v
                           |            (sysroot-usr.mount 以及
                           |            fstab 中带有 x-initrd.mount
                           |               标记的各个挂载点)
                           |                       |
                           |                       v
                           |                initrd-fs.target
                           \______________________ |
                                                  \|
                                                   v
                                              initrd.target
                                                   |
                                                   v
                                         initrd-cleanup.service
                                (使用 isolates 启动 initrd-switch-root.target)
                                                   |
                                                   v
                            ______________________/|
                           /                       v
                           |        initrd-udevadm-cleanup-db.service
                           v                       |
                   (各个自定义的                   |
                  initrd services)                 |
                           \______________________ |
                                                  \|
                                                   v
                                       initrd-switch-root.target
                                                   |
                                                   v
                                       initrd-switch-root.service
                                                   |
                                                   v
                                         切换到主机上的操作系统

关机流程

    systemd 系统在关机时同样遵循固定的流程,具体如下图所示:

                   (与所有系统服务互斥)   (与所有文件系统 mounts, swaps, cryptsetup devices 互斥)
                              |                                      |
                              v                                      v
                       shutdown.target                         umount.target
                              |                                      |
                              \______________________   _____________/
                                                     \ /
                                                      v
                                             (各个底层 services)
                                                      |
                                                      v
                                                final.target
                                                      |
                _____________________________________/ \_________________________________
               /                         |                        |                      \
               |                         |                        |                      |
               v                         v                        v                      v
    systemd-reboot.service   systemd-poweroff.service   systemd-halt.service   systemd-kexec.service
               |                         |                        |                      |
               v                         v                        v                      v
        reboot.target           poweroff.target          halt.target          kexec.target

    用粗体下划线标识的目标单元经常被用作关机目标。

参见

    systemd(1), boot(7), systemd.special(7), systemd.target(5), dracut(8)

bootup(7)                          systemd-228                         bootup(7)

GRUB2配置文件”grub.cfg”详解(GRUB2实战手册)

版权声明

本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。

  • 无担保:本文作者不保证作品内容准确无误,亦不承担任何由于使用此文档所导致的损失。
  • 自由使用:任何人都可以自由的阅读/链接/打印此文档,无需任何附加条件。
  • 名誉权:任何人都可以自由的转载/引用/再创作此文档,但必须保留作者署名并注明出处。

其他作品

本文作者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:

联系方式

由于作者水平有限,因此不能保证作品内容准确无误。如果你发现了作品中的错误(哪怕是错别字也好),请来信指出,任何提高作品质量的建议我都将虚心接纳。

  • Email(QQ):70171448在QQ邮箱

招聘

公司:某保险公司信息技术部
职位:Linux SA, PostgreSQL DBA
坐标:上海/北京
要求:Gentoo粉优先
有意者请直接加我QQ70171448了解详情(加我时请注明”应聘”)


GRUB2模块

对于GRUB-2.0.2版本来说,官方提供的模块一共有200多个,这些模块大致可以分为以下几类(模块间的依赖关系位于”moddep.lst”文件中):

命令模块[command.lst]
提供了各种不同的功能,类似标准Unix命令,一共将近100个。例如:cat cpuid echo halt lspci chainloader initrd linux password …
加密模块[crypto.lst]
提供了各种数据完整性校验与密码算法支持,一共20多个。例如:gcry_rijndael crc64 gcry_md5 …
文件系统模块[fs.lst]
提供了访问各种文件系统的功能,一共30多个。例如:btrfs cpio exfat ext2 fat iso9660 ntfs tar xfs zfs …
分区模块[partmap.lst]
提供了识别各种分区格式的功能,一共10多个。例如:part_bsd part_gpt part_msdos …
分区工具[parttool.lst]
提供了操作各种分区格式的功能,目前只有 msdospart 这一个。
终端模块[terminal.lst]
提供了各种不同终端的支持,一共不到10个。例如:serial gfxterm vga_text at_keyboard …
视频模块

提供了各种不同的视频模式支持,一共6个。例如:vga vbe efi_gop efi_uga …
其他模块
所有未在上述分类文件中列出的模块都归为这一类,一共将近100个。值得关注的有以下几个:

  • “all_video”可用于一次性加载当前所有可用的视频模块;
  • “gfxmenu”可用于提供主题支持;
  • “jpeg png tga”可用于提供特定格式的背景图片支持;
  • “xzio gzio lzopio”可用于提供特定压缩格式支持(常配合”initrd”命令使用);

GRUB2救援模式

GRUB2在BIOS平台上的常规启动步骤是这样的:BIOS –> boot.img[MBR] –> core.img[MBR gap/embedding area/BIOS Boot Partition] –> 设置”prefix root cmdpath”环境变量 –> 加载”normal.mod”模块[同时还包括它所依赖的 terminal crypto extcmd boot gettext 模块] –> 执行”normal $prefix/grub.cfg”命令

GRUB2在UEFI平台上的常规启动步骤是这样的:UEFI –> core.img[BOOTX64.EFI/BOOTX86.EFI] –> 设置”prefix root cmdpath”环境变量 –> 加载”normal.mod”模块[同时还包括它所依赖的 terminal crypto extcmd boot gettext 模块] –> 执行”normal $prefix/grub.cfg”命令

如果上述步骤全部成功,那么你将进入’普通模式’,一般是显示一个菜单(找到了’$prefix/grub.cfg’),或者直接进入GRUB SHELL(没找到’$prefix/grub.cfg’)。在普通模式中,命令模块[command.lst]与加密模块[crypto.lst]会被 自动按需载入(无需使用”insmod”命令),并且可使用完整的GRUB脚本功能。但是其他模块则可能需要明确使用”insmod”命令来载入。

如果在加载”normal.mod”模块这一步出现故障,那么你将进入GRUB2的’救援模式’,而不是常规的’普通模式’。在救援模式 中,GRUB只自动设置了”cmdpath prefix root”三个环境变量,并且只能使用”insmod ls set unset”四个命令。只有当额外的模块被加载之后,才可以使用一些其它的命令,变量,解析器,驱动程序。通常来说,进入救援模式可能意味着你的 GRUB2没有正确安装。请认真阅读’grub-install –help’的输出选项,并使用正确的选项重新安装。更多细节请参考GRUB2手册中的”GRUB only offers a rescue shell“部分。

GRUB2命名规则

设备与分区

GRUB2对设备与分区的命名规则举例如下,看看就能明白。需要说明的是磁盘从”0″开始计数,分区从”1″开始计数。

(fd0)          第一软盘
(hd0)          第一硬盘[大多数U盘与USB接口的移动硬盘以及SD卡也都被当作硬盘看待]
(hd1,1)        第二硬盘的第一分区(通用于MBR与GPT分区)
(hd0,msdos2)   第一硬盘的第二MBR分区,也就是传统的DOS分区表
(hd1,msdos5)   第二硬盘的第五MBR分区,也就是第一个逻辑分区
(hd0,gpt1)     第一硬盘的第一GPT分区
(cd)           启动光盘[仅在从光盘启动GRUB时可用]
(cd0)          第一光盘

上面所举的例子仅是最常用的情形,更多高级的设备命名规则请参考GRUB2手册中的”Naming convention“与”How to specify devices“部分。此外,如果你想看看当前系统上有哪些设备可用,可以在GRUB SHELL中使用”ls”命令(可能需要先加载必要的驱动模块)。

文件

文件的命名方法有两种:(1)绝对路径表示法,(2)相对路径表示法。举例如下:

(fd0)/grldr                 第一软盘根目录下的"grldr"文件[绝对路径]
(hd0,gpt1)/boot/vmlinuz     第一硬盘的第一GPT分区"boot"目录下的"vmlinuz"文件[绝对路径]
/boot/vmlinuz               根设备"boot"目录下的"vmlinuz"文件[相对路径],
                            当"root"环境变量等于"(hd0,gpt1)"时,等价于"(hd0,gpt1)/boot/vmlinuz"

上面所举的例子仅是最常用的情形,更多高级的文件命名规则请参考GRUB2手册中的”How to specify files“部分。

磁盘块

磁盘块的命名方法同样也有两种:(1)绝对路径表示法,(2)相对路径表示法。举例如下:

(hd1,1)0+1  在第二硬盘的第一分区上,从第"0"个磁盘块(首扇区)起,长度为"1"的连续块。[绝对路径]
(hd1,1)+1   含义与上一个相同,因为当从第"0"个磁盘块(首扇区)起时,"0"可以省略不写。[绝对路径]
+1          在根设备上,从第"0"个磁盘块(首扇区)起,长度为"1"的连续块。[相对路径]
            当"root"环境变量等于"(hd1,1)"时,等价于"(hd1,1)0+1"

磁盘块几乎只用于链式引导(chainloader)的场合。更多高级的磁盘块命名规则请参考GRUB2手册中的”How to specify block lists“部分。

GRUB2环境变量

GRUB2的环境变量大致可以分为两类,第一类是自动设置的变量,也就是这些变量的初始值由GRUB2自动设置,其值必定存在且不为空。第二类是手动设置的变量,它们没有初始值(或者初始值为空),需要经过手动明确设置之后才能使用。

大多数有特定含义的环境变量都是附属于特定附加模块的,只有加载了这些模块之后,这些环境变量才变得有意义。所以从模块的角度看,GRUB2的环境 变量又可以分为三类:(1)核心变量,GRUB2核心提供的变量,不依赖于任何可加载模块,这样的变量只有”cmdpath prefix root”三个,而且它们的初始值都由GRUB2自动设置。(2)模块变量,绝大多数有特定含义的环境变量都属此类。(3)脚本变量,这是为了方便编写 grub.cfg脚本而设置的变量,没有特殊含义,也不依赖于特定模块,与一般的bash脚本中的变量类似。有关GRUB2脚本的完整说明可以参考 GRUB2手册中的”Writing full configuration files directly“部分,基本上其语法与bash脚本完全一致,上手非常容易。

特殊变量

下面列出的变量都是有特定含义的变量,这里只列出常用的一些变量,完整的列表可以参考GRUB2手册中的”Special environment variables“部分。

?
上一条命令的返回值,零表示成功,非零表示失败[与bash一样]。由GRUB2自动设置。你只能使用此变量,而不能修改它。
check_signatures
是否在加载文件时强制验证签名,可以设为’yes’或’no’
chosen
当前被执行的菜单项名称(紧跟”menuentry”命令之后的字符串或者’–id’选项的参数),例如’Windows 7’。由GRUB2自动设置。你只应该使用此变量,而不应该修改它。
cmdpath
当前被加载的”core.img”所在目录(绝对路径)。例如:UEFI启动可能是'(hd0,gpt1)/EFI/UBUNTU’或'(cd0)/EFI/BOOT’,BIOS启动可能是'(hd0)’。由GRUB2自动设置。你只应该使用此变量,而不应该修改它。
debug
设为’all’时表示开启调试输出[会显示大量信息,谨慎开启]
default
默认选中第几个菜单项(从’0’开始计数)
fallback
如果默认菜单项启动失败,那么就启动第几个菜单项(从’0’开始计数)
gfxmode
设置”gfxterm”模块所使用的视频模式,可以指定一组由逗号或分号分隔的模式以供逐一尝试:每个模式的格 式必须是:’auto'(自动检测),’宽x高’,’宽x高x色深’之一,并且只能使用VBE标准指定的模式 [640×480,800×600,1024×768,1280×1024]x[16,24,32]。可以在GRUB SHELL中使用”videoinfo”命令列出当前所有可用模式。默认值是’auto’。
gfxpayload
设置Linux内核启动时的视频模式,可以指定一组由逗号或分号分隔的模式以供逐一尝试:每个模式的格式 必须是:’text'(普通文本模式,不能用于UEFI平台),’keep'(继承”gfxmode”的值),’auto'(自动检测),’宽x高’,’ 宽x高x色深’之一,并且只能使用VBE标准指定的模式 [640×480,800×600,1024×768,1280×1024]x[16,24,32]。在BIOS平台上的默认值是’text’,在 UEFI平台上的默认值是’auto’。除非你想明确设置Linux控制台的分辨率(要求内核必 须”CONFIG_FRAMEBUFFER_CONSOLE=y”),或者打算在BIOS平台上使用图形控制台(要求内核必 须”CONFIG_FRAMEBUFFER_CONSOLE=y”),否则不要设置此变量。
gfxterm_font
设置”gfxterm”模块所使用的字体,默认使用所有可用字体
grub_cpu
此GRUB所适用的CPU类型。例如:’i386′, ‘x86_64’。由GRUB2自动设置。你只应该使用此变量,而不应该修改它。
grub_platform
此GRUB所适用的平台类型。例如:’pc’, ‘efi’。由GRUB2自动设置。你只应该使用此变量,而不应该修改它。
lang
设置GRUB2的界面语言,必须搭配”locale_dir”变量一起使用。简体中文应设为’zh_CN’。
locale_dir
设置翻译文件(*.mo)的目录,通常是’$prefix/locale’,若未明确设置此目录,则禁止国际化。
pager
如果设为’1’,那么每一满屏后暂停输出,等待键盘输入。缺省是”,表示不暂停。
prefix
绝对路径形式的’/boot/grub’目录位置(也就是GRUB2的安装目录),例如'(hd0,gpt1) /grub’或'(hd0,msdos2)/boot/grub’。初始值由GRUB在启动时根据”grub-install”在安装时提供的信息自动设 置。你只应该使用此变量,而不应该修改它。
root
设置”根设备”。任何未指定设备名的文件都视为位于此设备。初始值由GRUB在启动时根据”prefix”变量的值自动设置。在大多数情况下,你都需要修改它。
superusers
设置一组”超级用户”(使用空格/逗号/分号进行分隔),以开启安全认证的功能。
theme
设置菜单界面的主题风格文件的位置,例如:”/boot/grub/themes/starfield/theme.txt”。关于如何定制界面风格(背景图片/字体/颜色/图标等)的细节,可以参考GRUB2手册中的”Theme file format“部分。
timeout
在启动默认菜单项前,等待键盘输入的秒数。默认值是’5’秒。’0’表示直接启动默认菜单项(不显示菜单),’-1’表示永远等待。

GRUB2命令

对于GRUB-2.0.2版本来说,所有可用的命令有大约200个之多,他们中的绝大多数由各种各样的模块提供。我们没有必要去了解所有这些200 个命令,只需要了解一些常用的命令即可(实际上就连官方文档也没有给出全部的命令说明)。更多的命令说明可以参考GRUB2手册中的”The list of available commands“页面中列出的几个二级页面。

menuentry “title” [–class=class …] [–users=users] [–unrestricted] [–hotkey=key] [–id=id] [arg …] { command; … }
定义一个名为”title”的菜单项。当此菜单项被选中时,GRUB将会把环境变量”chosen”的值设为”id”(使用了[–id=id]选 项)或”title”(未使用[–id=id]选项),然后执行花括号中的命令列表,如果列表中最后一个命令执行成功,并且已经载入了一个内核,那么将 执行”boot”命令。

可以使用 –class 选项指定菜单项所属的”样式类”。从而可以使用指定的主题样式显示菜单项。

可以使用 –users 选项指定只允许特定的用户访问此菜单项。如果没有使用此选项,则表示允许所有用户访问。

可以使用 –unrestricted 选项指明允许所有用户访问此菜单项。

可以使用 –hotkey 选项设置访问此菜单项的热键(快捷键)。”key”可以是一个单独的字母,或者’backspace’,’tab’,’delete’之一。

可以使用 –id 选项为此菜单项设置一个全局唯一的标识符。”id”必须由ASCII字母/数字/下划线组成,且不得以数字开头。

[arg …]是可选的参数列表。你可以把它们理解为命令行参数。实际上”title”也是命令行参数,只不过这个参数是个必须参数而已。这些参数都可以在花括号内的命令列表中使用,”title”对应着”$1″,其余的以此类推。

terminal_input [–append|–remove] [terminal1] [terminal2] …
如果不带任何选项与参数,则表示列出当前激活的输入终端,以及所有其他可用的输入终端。

可以使用 –append 选项将指定的终端加入到激活的输入终端列表中,所有列表中的终端都可以用于向GRUB提供输入。

可以使用 –remove 选项将指定的终端从激活的输入终端列表中删除。

如果不使用任何选项,但是指定了一个或多个终端参数,则表示将当前激活的输入终端设置为参数指定的终端。

terminal_output [–append|–remove] [terminal1] [terminal2] …
如果不带任何选项与参数,则表示列出当前激活的输出终端,以及所有其他可用的输出终端。

可以使用 –append 选项将指定的终端加入到激活的输出终端列表中,所有列表中的终端都将接受到GRUB的输出。

可以使用 –remove 选项将指定的终端从激活的输出终端列表中删除。

如果不使用任何选项,但是指定了一个或多个终端参数,则表示将当前激活的输出终端设置为参数指定的终端。

authenticate [userlist]
检查当前用户是否位于”userlist”或环境变量”superusers”中。[注意]如果环境变量”superusers”的值为空,此命令将返回’真’。

background_color color
设置当前激活的输出终端的背景颜色。”color”可以使用HTML风格的颜色表示法(“#RRGGBB”或”#RGB”)。

[注意]仅在使用’gfxterm’作为输出终端的时候,才能改变背景色。

background_image [[–mode ‘stretch’|’normal’] file]
将当前激活的输出终端的背景图片设置为”file”文件。除非使用了”–mode ‘normal'”选项,否则图片将被自动缩放以填满整个屏幕。

如果不带任何选项与参数,则表示删除背景图片。

[注意]仅在使用’gfxterm’作为输出终端的时候,才能改变背景图片。

boot
启动已经被载入的OS或链式加载器。仅在运行于交互式命令行的时候才是需要的。在一个菜单项结束时是隐含的。

cat [–dos] file
显示文件”file”的内容。如果使用了”–dos”选项,那么”回车/换行符”将被显示为一个简单的换行符。否则,回车符将被显示为一个控制符(<d>)。

chainloader [–force] file
链式加载”file”文件。通常使用磁盘块表示法,例如用’+1’表示当前根分区的第一个扇区。

可以使用 –force 选项强制载入文件,而不管它是否有正确的签名。通常用于加载有缺陷的启动载入器(例如 SCO UnixWare 7.1)。

configfile file
将”file”作为配置文件加载。如果”file”中定义了菜单项,那么立即显示一个包含它们的菜单。

[注意]”file”文件对环境变量所做的任何变更都将在从此文件返回后失效。

cpuid [-l]
检查CPU特性。仅在x86系统上可用。

如果使用了 -l 选项,那么如果CPU是64位则返回真,否则返回假。

drivemap -l|-r|[-s] from_drive to_drive
如果不使用任何选项,表示将”from_drive”映射到”to_drive”。这主要用于链式加载Windows之类的操作系统,因为它们只能从第一个硬盘启动。出于方便的原因,分区后缀将被忽略,因此你可用安全地将”${root}”作为磁盘使用。

可以使用 -s 选项,执行反向映射,也就是交换这两个磁盘。例如: drivemap -s (hd0) (hd1)

可以使用 -l 选项,列出当前已有的映射。

可以使用 -r 选项,把映射重置为默认值,也就是撤销所有当前已有的映射。

echo [-n] [-e] string …
显示所要求的文本并换行(除非使用了 -n 选项)。如果有多个字符串,依次输出它们,并用空格分隔每一个。

和bash的习惯一样,可以在双引号内使用”${var}”来引用变量的值,也可以使用 -e 选项激活对反斜杠转义符的解释( \\ \a \r \n \t …)。

export envvar
导出环境变量”envvar”,以使其对于使用”configfile”命令载入的配置文件可见。

false
不做任何事,只返回一个失败的结果。主要用在if/while之类的控制构造中。

gettext string
把”string”翻译为环境变量”lang”指定的语言。MO格式的翻译文件从环境变量”locale_dir”指定的目录加载。

halt [–no-apm]
关闭计算机。如果指定了 –no-apm 选项,表示不执行APM BIOS调用。否则,计算机使用APM关闭。

help [pattern …]
显示内建命令的帮助信息。如果没有指定”pattern”,那么将显示所有可用命令的简短描述。

如果指定了”pattern”,那么将只显示名字以这些”pattern”开头的命令的详细帮助信息。

initrd file
为以32位协议启动的Linux内核载入一个”initial ramdisk”,并在内存里的Linux设置区域设置合适的参数。

[注意]这个命令必须放在”linux”命令之后使用。

initrd16 file
为以16位协议启动的Linux内核载入一个”initial ramdisk”,并在内存里的Linux设置区域设置合适的参数。

[注意]这个命令必须放在”linux16″命令之后使用。

insmod module
载入名为”module”的GRUB2模块。

linux file …
使用32位启动协议从”file”载入一个Linux内核映像,并将其余的字符作为内核的命令行参数逐字传入。

[注意]使用32位启动协议意味着’vga=’启动选项将会失效。如果你希望明确设置一个特定的视频模式,那么应该使用”gfxpayload”环 境变量。虽然GRUB可以自动地检测某些’vga=’参数,并把它们翻译为合适的”gfxpayload”设置,但是并不建议这样做。

linux16 file …
以传统的16位启动协议从”file”载入一个Linux内核映像,并将其余的字符作为内核的命令行参数逐字传入。这通常用于启动一些遵守Linux启动协议的特殊工具(例如MEMDISK)。

[注意]使用传统的16位启动协议意味着:(1)’vga=’启动选项依然有效,(2)不能启动纯64位内核(也就是内核必须要’CONFIG_IA32_EMULATION=y’才行)。

loadfont file …
从指定的”file”加载字体,除非使用了绝对路径,否则”file”将被视为”$prefix/fonts/file.pf2″文件。

loopback [-d] device file
将”file”文件映射为”device”回环设备。例如:

loopback loop0 /path/to/image
ls (loop0)/

可以使用 -d 选项,删除先前使用这个命令创建的设备。

ls [arg …]
如果不使用参数,那么列出所有对GRUB已知的设备。

如果参数是包含在括号内的一个设备名,那么列出该设备根目录下的所有文件。

如果参数是以绝对路径给出的目录,那么列出这个目录的内容。

lsfonts
列出已经加载的所有字体

lsmod
列出已经加载的所有模块

normal [file]
进入普通模式,并显示GRUB菜单。[说明]只要当前没有处于救援模式,其实就已经是在普通模式中了,所以通常并不需要明确使用此命令。

在普通模式中,命令模块[command.lst]与加密模块[crypto.lst]会被自动按需载入(无需使用”insmod”命令),并且可使用完整的GRUB脚本功能。但是其他模块则可能需要明确使用”insmod”命令来载入。

如果给出了”file”参数,那么将从这个文件中读入命令(也就是作为”grub.cfg”的替代),否则将从”$prefix/grub.cfg”中读入命令(如果存在的话)。你也可以理解为”file”的默认值是’$prefix/grub.cfg’。

可以在普通模式中嵌套调用此命令,以构建一个嵌套的环境。不过一般不这么做,而是使用”configfile”命令来达到这目的。

normal_exit
退出当前的普通模式。如果这个普通模式实例不是嵌套在另一个普通模式里的话,就会返回到救援模式。

parttool partition commands
对分区表进行各种修改。目前只能作用于MBR分区表(DOS分区表),而不能用于GPT分区表。目前仅支持以下三种用法:

(1)设置或去掉分区的激活标记(仅对Windows系统有意义)。
例如:”parttool (hd0,msdos2) +boot”表示为(hd0,msdos2)分区加上激活标记,而”parttool (hd0,msdos2) -boot”则表示去掉(hd0,msdos2)分区的激活标记。

(2)设置或去掉分区的隐藏标记(仅对Windows系统有意义)。
例如:”parttool (hd0,msdos2) +hidden”表示为(hd0,msdos2)分区加上隐藏标记,而”parttool (hd0,msdos2) -hidden”则表示去掉(hd0,msdos2)分区的隐藏标记。

(3)更改分区的类型。其值必须是0x00-0xFF范围内的值。且应该使用’0xNN’格式的十六进制数。
例如:”parttool (hd0,msdos2) type=0x83″表示将(hd0,msdos2)分区类型修改为’0x83′(Linux分区)。

password user clear-password
定义一个名为user的用户,并使用明文口令’clear-password’。不建议使用此命令。

password_pbkdf2 user hashed-password
定义一个名为user的用户,并使用哈希口令’hashed-password'(通过”grub-mkpasswd-pbkdf2″工具生成)。这是建议使用的命令,因为它安全性更高。

probe [–set var] –driver|–partmap|–fs|–fs-uuid|–label device
提取”device”设备的特定信息。如果使用了 –set 选项,则表示将提取的结果保存在”var”变量中,否则将提取的结果直接显示出来。

read [var]
从用户读取一行输入。如果给定环境变量”var”,则把它设为所读取的行(不包括结尾的换行符)。

reboot
重新启动

rmmod module
卸载”module”模块

search [–file|–label|–fs-uuid] [–set [var]] [–no-floppy] name
通过文件[–file]、卷标[–label]、文件系统UUID[–fs-uuid]来查找设备。

如果使用了 –set 选项,那么会将第一个找到的设备设置为环境变量”var”的值。默认的”var”是’root’。

可以使用 –no-floppy 选项来禁止查找软盘设备,因为这些设备非常慢。

set [envvar=value]
将环境变量”envvar”的值设为’value’。如果没有使用参数,则打印出所有环境变量及其值。

source file
直接将”file”文件的内容插入到当前位置。与”configfile”不同,此命令既不切换执行环境,也不会显示一个新的菜单。

test expression
[ expression ]
计算”expression”的值,并在结果为真时返回零值,或者在结果为假时返回非零值,主要用在if/while之类的控制构造中。

可用的”expression”模式如下(与bash类似):

string1 == string2  [string1与string2完全相同]
string1 != string2  [string1与string2不完全相同]
string1 < string2  [string1在字母顺序上小于string2]
string1 <= string2  [string1在字母顺序上小于string2或与string2完全相同]
string1 > string2  [string1在字母顺序上大于string2]
string1 >= string2  [string1在字母顺序上大于string2或与string2完全相同]
integer1 -eq integer2  [integer1等于integer2]
integer1 -ge integer2  [integer1大于或等于integer2]
integer1 -gt integer2  [integer1大于integer2]
integer1 -le integer2  [integer1小于或等于integer2]
integer1 -lt integer2  [integer1小于integer2]
integer1 -ne integer2  [integer1不等于integer2]
prefixinteger1 -pgt prefixinteger2  [剔除非数字字符首部之后,integer1大于integer2]
prefixinteger1 -plt prefixinteger2  [剔除非数字字符首部之后,integer1小于integer2]
file1 -nt file2  [file1的修改时间比file2新]
file1 -ot file2  [file1的修改时间比file2旧]
-d file  [file存在并且是一个目录]
-e file  [file存在]
-f file  [file存在并且不是一个目录]
-s file  [file存在并且文件尺寸大于零]
-n string  [string的长度大于零]
string     [string的长度大于零]
-z string  [string的长度等于零]
( expression )  将expression视为一个整体(分组)
! expression   非(NOT)
expression1 -a expression2   与(AND)
expression1 -o expression2   或(OR)
true
不做任何事,只返回一个成功的结果。主要用在if/while之类的控制构造中。

unset envvar
撤销环境变量”envvar”

videoinfo [[WxH]xD]
列出所有当前可用的视频模式。如果指定了分辨率(或者还附加了色深),那么仅显示与其匹配的模式。

GRUB2安全

在默认情况下,GRUB对于所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB SHELL。要启用认证支持,必须将环境变量”superusers”设置为一组用户名(可用空格/逗号/分号作为分隔符),这样,将仅允 许”superusers”中的用户使用GRUB命令行、编辑菜单项、以及执行任意菜单项。而其他非”superusers”中的用户,只能执行那些没有 设置 –users 选项的菜单,以及那些在 –users 选项中包含了该用户的菜单,但不能使用GRUB命令行、编辑菜单项。下面使用一个配置片段举例说明:

set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.biglongstring
password user1 insecure

menuentry "所有人都可以执行此菜单" --unrestricted {
	...
}

menuentry "仅允许超级用户执行此菜单" --users "" {
	...
}

menuentry "允许 user1 和超级用户执行此菜单" --users user1 {
	...
}

有关GRUB2安全的更多详情,请参考GRUB2手册中的”Security“部分。

GRUB2实用技巧

如何给GRUB2菜单加上背景图?

首先制作一张PNG格式的图片,分辨率最好是”1024×768″以保证较好的兼容性。然后将这张图片放到”$prefix/themes/1024×768.png”(“$prefix”是GRUB2的安装目录)。然后在’grub.cfg’中加入如下内容:

set gfxmode=1024x768,auto
insmod gfxterm
insmod png
terminal_output  gfxterm
background_image $prefix/themes/1024x768.png

如何让GRUB2显示中文界面(包括显示中文菜单项)?

由于GRUB2在内部使用UTF-8编码,并且所有文本文件(包括’grub.cfg’)也都被假定为使用UTF-8编码,为了避免乱码,请务必以UTF-8编码保存’grub.cfg’文件。

set gfxterm_font=unicode
set lang=zh_CN
set locale_dir=$prefix/locale
insmod gfxterm
terminal_output  gfxterm
loadfont unicode

如何更改GRUB2的字体?

如果你认为默认的unicode字体在1024×768或更高分辨率的屏幕上显得太小,或者你认为默认的字体不好看,想换换口味,那么如何自己动手 制作一个pf2字体呢?那就要用到”grub-mkfont”工具。下面的示例展示了如何从一个ttc字体(文泉驿等宽微米黑)制作一个24px大小的 pf2字体:

grub-mkfont -i1 -n WenQuanYiMicroHeiMono24px -o WenQuanYiMicroHeiMono24px.pf2 -s24 -v wqy-microhei.ttc

将制作好的字体文件(WenQuanYiMicroHeiMono24px.pf2)放到”$prefix/fonts”目录中,修改’grub.cfg’文件中的两行:

set gfxterm_font=WenQuanYiMicroHeiMono24px
loadfont WenQuanYiMicroHeiMono24px

[注意]你最好使用等宽中文字体(推荐使用文泉驿等宽正黑或者等宽微米黑),否则可能会让GRUB2的字体间距过大,十分难看。

如何使用GRUB2引导WindowsPE的ISO文件?

GRUB4DOS有一个非常酷的’磁盘映射’功能,能够用于启动WinPE的ISO文件。其实,将GRUB2配合MEMDISK工具使用,同样可以引导各种镜像文件,包括ISO文件与软/硬盘镜像。

首先,你必须安装或者下载”syslinux“软件包,从中提取出”memdisk”文件(可能位于’/usr/share/syslinux/memdisk’或’bios/memdisk/memdisk’),然后将它复制到GRUB2的安装目录中,也就是位于”$prefix/memdisk”。

然后,再将你想要引导的WindowsPE的ISO文件放到某个地方,这里假定你和”memdisk”放在一起,也就是位于”$prefix/WinPE.ISO”。当然,为了节约磁盘空间,你也可以用gzip对ISO文件进行压缩,不过这个示例中没有这么做。

最后,在’grub.cfg’中加入如下菜单项(如果你对ISO进行了gzip压缩,那么还需要额外再加上”insmod gzio”命令):

menuentry "Windows PE" --unrestricted {
    linux16  $prefix/memdisk iso raw
    initrd16 $prefix/WinPE.ISO
}

[注意]与GRUB4DOS一样,由于MEMDISK对各种镜像文件的模拟是通过在实模式下拦截BIOS的 INT 13h 与 INT 15h 调用来实现的,所以有很大的局限性:

  • 只能用于BIOS模式启动,不能用于UEFI模式启动
  • 模拟出来的软盘/光盘/硬盘设备只能被基于实模式的操作系统所识别(DOS,FreeDOS),不能被基于保护模式的操作系统所识别(Windows,Linux,BSD)
  • 从实用的角度来说,只能用于引导WinPE的ISO以及基于DOS/FreeDOS的镜像,不能用于引导各种Linux的LiveCD ISO以及微软原版的Windows ISO安装光盘。

[释疑]不要将MEMDISK与 GRUB2的”memdisk.mod”模块混淆,他们是两个毫不相干的东西。”memdisk.mod”模块的作用是为’core.img’提供内存盘 支持,其目的是为了让GRUB2能够正确识别启动设备。如果把’core.img’比作Linux内核,那么”memdisk.mod”模块的作用就相当 于为’core.img’这个”内核”提供了’initramdisk’,用以加载磁盘与文件系统驱动,从而让GRUB2可以访问磁盘,进而加载其他的模 块。但是实际上,在绝大多数情况下,更本不需要使用”memdisk.mod”,因为在’grub-install’的时候,这些驱动已经被嵌入到 ‘core.img’中了。如果你还是不明白”memdisk.mod”模块的作用的话,那就忘记它的存在吧,因为你更本不需要知道有这个东西,就像你不 需要了解全部GRUB2模块一样。仅仅是因为这两个东西的名字相同,我才在这里多罗嗦了几句而已。

如何使用GRUB2引导(硬盘安装) Gentoo LiveCD 的ISO文件?

以”install-amd64-minimal-*.iso”为例。
第一步,将ISO中的’/isolinux/{gentoo,gentoo.igz}’、’/image.squashfs’三个文件放到'(hd0,gpt3)/OS/gentoo/’目录中;
第二步,将ISO中的’/livecd’放到相同分区(hd0,gpt3)的根目录下;
最后,在’grub.cfg’中加入如下菜单项:

menuentry "Gentoo Minimal Install LiveCD" --unrestricted {
    linux  (hd0,gpt3)/OS/gentoo/gentoo cdroot looptype=squashfs loop=/OS/gentoo/image.squashfs
    initrd (hd0,gpt3)/OS/gentoo/gentoo.igz
}

[说明]’livecd’是寻找’image.squashfs’所在磁盘分区的关键。

如何使用GRUB2引导(硬盘安装) Debian/Ubuntu/Fedora/RHEL/CentOS LiveCD 的ISO文件?

首先需要说明的是,这里给出的方法,只适用于提供了”iso-scan/filename=”或”fromiso=”之类参数的LiveCD。不适用于未提供此类参数的LiveCD(例如Gentoo)。

下面以’Debian 8.1 LiveCD’为例说明。首先,假定你将ISO文件放在'(hd0,gpt3)/ISO/Debian.iso’;然后,在’grub.cfg’中加入如下菜单项:

menuentry "Debian 8.1 LiveCD" --unrestricted {
    loopback loop0 (hd0,gpt3)/ISO/Debian.iso
    linux  (loop0)/live/vmlinuz boot=live fromiso=/dev/sda3/ISO/Debian.iso
    initrd (loop0)/live/initrd.img
}

[说明]这里给出的方法,其实就是各种”硬盘安装 XX Linux”的翻版,只不过不再需要将”vmlinuz”与”initrd”从ISO中解压出来而已。

更多其它发行版的实例,请继续阅读下面的内容。

“grub.cfg”实例

下面是本文作者实际使用的一个”grub.cfg”文件,通用于BIOS与UEFI模式,放在这里当作一个实例,供读者参考:

#################
## (1)特殊变量 ##
#################
#默认启动第一个菜单项
set default=0
#如果第一个菜单项启动失败,转而启动第二个菜单项
set fallback=1
#优先使用最常规的1024x768分辨率,以保证在不同的屏幕上拥有一致的菜单效果,如果失败再自动匹配分辨率
set gfxmode=1024x768,auto
#使用自己制作的24px的大号字体以避免默认字体太小看不清
set gfxterm_font=WenQuanYiMicroHeiMono24px
#将GRUB2设置为简体中文界面
set lang=zh_CN
#指定翻译文件(*.mo)的目录,若未明确设置此目录,则无法显示中文界面。
set locale_dir=$prefix/locale
#每一满屏后暂停输出,以免信息太多一闪而过看不清
set pager=1
#开启密码验证功能,并设置一个名为'root'的超级用户
set superusers=root
#设置菜单的超时时间为5秒
set timeout=5

#################
## (2)公共模块 ##
#################
#两种最流行的磁盘分区格式
insmod part_gpt
insmod part_msdos
#常见文件系统驱动
insmod btrfs
insmod exfat
insmod ext2
insmod fat
insmod iso9660
insmod jfs
insmod ntfs
insmod reiserfs
insmod udf
insmod xfs
insmod zfs
#一次性加载所有可用的视频驱动
insmod all_video
#图形模式终端
insmod gfxterm
#背景图片支持
insmod png

#########################################
## (3)公共命令(必须放在模块和变量之后) ##
#########################################
#激活图形模式的输出终端,以允许使用中文和背景图
terminal_output  gfxterm
#设置背景图片
background_image $prefix/themes/1024x768.png
#加载自己制作的24px的大号字体文件($prefix/fonts/WenQuanYiMicroHeiMono24px.pf2)
loadfont WenQuanYiMicroHeiMono24px
#设置'root'用户的哈希密码[通过"grub-mkpasswd-pbkdf2"工具生成]
password_pbkdf2 root grub.pbkdf2.sha512.69.7DBCA469F80EA1C0A8A1E2FEBC4F8463.B073C1C89EC1E85309C3D6A1BAFF4356

#################
## (4)菜单项   ##
#################

menuentry '正常启动(Windows)' --unrestricted {
    if search --file --set --no-floppy /bootmgr ; then
        chainloader +1
    elif search --file --set --no-floppy /ntldr ; then
        chainloader +1
    else
        echo '没有找到Windows'
        sleep --verbose 5
    fi
}

if [ 'pc' == $grub_platform ] ; then
    menuentry '系统救援(WinPE)' --users=root {
        if search --file --set --no-floppy /OS/WinPE.iso ; then
            linux16  $prefix/memdisk iso raw
            initrd16 /OS/WinPE.iso
        fi
    }
fi

# 硬盘安装 Gentoo
menuentry 'Gentoo LiveCD' --users=root {
    if search --file --set --no-floppy /OS/gentoo/image.squashfs ; then
        if [ -f /livecd -a -f /OS/gentoo/gentoo -a -f /OS/gentoo/gentoo.igz ] ; then
            linux  /OS/gentoo/gentoo cdroot looptype=squashfs loop=/OS/gentoo/image.squashfs rootwait doscsi nodmraid nokeymap docache dosshd scandelay slowusb passwd=123
            initrd /OS/gentoo/gentoo.igz
        fi
    fi
}

# 硬盘安装 Debian [假定'/OS/Debian.iso'所在分区的卷标是'GRUB2'][这种方法也适用于 Kali Linux]
# [加上"username=root"后,桌面上的安装快捷方式会消失,需要使用"system tools -> install Debian sid"安装]
menuentry 'Debian LiveCD' --users=root {
    if search --file --set --no-floppy /OS/Debian.iso ; then
        loopback loop0 /OS/Debian.iso
        linux  (loop0)/live/vmlinuz boot=live fromiso=/dev/disk/by-label/GRUB2/OS/Debian.iso rootwait ro username=root
        initrd (loop0)/live/initrd.img
    fi
}

# 硬盘安装 Ubuntu [加上"username=root"后,桌面上的安装快捷方式会消失,需要使用"system tools -> install Ubuntu"安装]
menuentry 'Ubuntu LiveCD amd64' --users=root {
    if search --file --set --no-floppy /OS/Ubuntu.iso ; then
        loopback loop0 /OS/Ubuntu.iso
        linux  (loop0)/casper/vmlinuz.efi boot=casper iso-scan/filename=/OS/Ubuntu.iso rootwait ro username=root
        initrd (loop0)/casper/initrd.lz
    fi
}

# 硬盘安装 Fedora 22 [ISO卷标是"Fedora-Live-LXDE-x86_64-22-3"]
# 这里的方法也适用于 CentOS 7 LiveCD [其卷标是"CentOS-7-livecd-x86_64"]
menuentry 'Fedora-Live-LXDE-x86_64-22-3' --users=root {
    if search --file --set --no-floppy /OS/Fedora.iso ; then
        loopback loop0 /OS/Fedora.iso
        set root=(loop0)
        linux  /isolinux/vmlinuz0 iso-scan/filename=/OS/Fedora.iso root=live:LABEL=Fedora-Live-LXDE-x86_64-22-3 ro rd.live.image
        initrd /isolinux/initrd0.img
    fi
}

#https://raw.githubusercontent.com/rhinstaller/anaconda/master/docs/boot-options.txt
menuentry '网络安装 CentOS 7 x86_64 [只能用于简单网络环境,不可用于WiFi环境]' --unrestricted {
    if search --file --set --no-floppy /OS/CentOS-7-x86_64-NetInstall-1503.iso ; then
        loopback loop0 /OS/CentOS-7-x86_64-NetInstall-1503.iso
        set root=(loop0)
        linux  /images/pxeboot/vmlinuz ip=dhcp nameserver=223.6.6.6 inst.repo=http://mirrors.aliyun.com/centos/7/os/x86_64/  inst.lang=zh_CN.UTF-8
        initrd /images/pxeboot/initrd.img
    fi
}

#[假定'/OS/CentOS-7-x86_64-Minimal-1503-01.iso'所在分区的卷标是'GRUB2']
# 这里的方法也适用于 CentOS-7-x86_64-DVD-1503-01.iso 与 CentOS-7-x86_64-Everything-1503-01.iso
menuentry '硬盘安装 CentOS 7 x86_64 [最小安装]' --unrestricted {
    if search --file --set --no-floppy /OS/CentOS-7-x86_64-Minimal-1503-01.iso ; then
        loopback loop0 /OS/CentOS-7-x86_64-Minimal-1503-01.iso
        linux  (loop0)/isolinux/vmlinuz  inst.repo=hd:LABEL=GRUB2:/OS/CentOS-7-x86_64-Minimal-1503-01.iso  inst.lang=zh_CN.UTF-8
        initrd (loop0)/isolinux/initrd.img
    fi
}

logrotate 配置详解

logrotate 配置详解

对于Linux 的系统安全来说,日志文件是极其重要的工具。系统管理员可以使用logrotate 程序用来管理系统中的最新的事件,对于Linux 的系统安全来说,日志文件是极其重要的工具。系统管理员可以使用logrotate 程序用来管理系统中的最新的事件。logrotate 还可以用来备份日志文件,本篇将通过以下几部分来介绍

 

日志文件的管理:
1、logrotate 配置
2、缺省配置 logrotate
3、使用include 选项读取其他配置文件
4、使用include 选项覆盖缺省配置
5、为指定的文件配置转储参数
一、logrotate 配置

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。

logrotate 的配置文件是 /etc/logrotate.conf。主要参数如下表:

参数 功能
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

二、缺省配置 logrotate

logrotate 缺省的配置募?/etc/logrotate.conf。
Red Hat Linux 缺省安装的文件内容是:

# see “man logrotate” for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# send errors to root
errors root
# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress
1
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own lastlog or wtmp –we’ll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}

/var/log/lastlog {
monthly
rotate 1
}

# system-specific logs may be configured here

缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。

第三行weekly 指定所有的日志文件每周转储一次。
第五行 rotate 4 指定转储文件的保留 4份。
第七行 errors root 指定错误信息发送给root。
第九行create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和
原来的文件一样的权限。
第11行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。

三、使用include 选项读取其他配置文件
include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个
主要的配置文件。当 logrotate 从logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。

第13行 include /etc/logrotate.d 告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM 软件包的日志转储参数一般存放在/etc/logrotate.d 目录。

include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d 。

典型的应用有:apache, linuxconf, samba, cron 以及syslog。

这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。

 

 

四、使用include 选项覆盖缺省配置

当 /etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数,如下例:

# linuxconf 的参数
/var/log/htmlaccess.log
{ errors jim
notifempty
nocompress
weekly
prerotate
/usr/bin/chattr -a /var/log/htmlaccess.log
endscript
postrotate
/usr/bin/chattr +a /var/log/htmlaccess.log
endscript
}
/var/log/netconf.log
{ nocompress
monthly
}

在这个例子中,当 /etc/logrotate.d/linuxconf 文件被读入时,下面的参数将覆盖/etc/logrotate.conf中缺省的参数。

Notifempty
errors jim

五、为指定的文件配置转储参数
经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:

# 注释
/full/path/to/file
{
option(s)
}

下面的例子就是每月转储 /var/log/wtmp 一次:
#Use logrotate to rotate wtmp
/var/log/wtmp
{
monthly
rotate 1
}

 

六、其他需要注意的问题

1、尽管花括号的开头可以和其他文本放在同一行上,但是结尾的花括号必须单独成行。

2、使用 prerotate 和 postrotate 选项
下面的例子是典型的脚本 /etc/logrotate.d/syslog,这个脚本只是对
/var/log/messages 有效。

/var/log/messages
{
prerotate
/usr/bin/chattr -a /var/log/messages
endscript
postrotate
/usr/bin/kill -HUP syslogd
/usr/bin/chattr +a /var/log/messages
endscript
}

第一行指定脚本对 /var/log messages 有效
花括号外的/var/log messages

 

 

prerotate 命令指定转储以前的动作/usr/bin/chattr -a 去掉/var/log/messages文件的“只追加”属性 endscript 结束 prerotate 部分的脚本postrotate 指定转储后的动作

/usr/bin/killall -HUP syslogd

用来重新初始化系统日志守护程序 syslogd

/usr/bin/chattr +a /var/log/messages

重新为 /var/log/messages 文件指定“只追加”属性,这样防治程序员或用户覆盖此文件。

最后的 endscript 用于结束 postrotate 部分的脚本

3、logrotate 的运行分为三步:

判断系统的日志文件,建立转储计划以及参数,通过cron daemon 运行下面的代码是 Red Hat Linux 缺省的crontab 来每天运行logrotate。

#/etc/cron.daily/logrotate
#! /bin/sh

/usr/sbin/logrotate /etc/logrotate.conf

4、/var/log/messages 不能产生的原因:
这种情况很少见,但是如果你把/etc/services 中的 514/UDP 端口关掉的话,这个文件就不能产生了。

小结:本文通过对Red Hat 系统上典型的logrotate 配置例子的介绍,详细说明了logrotate 程序的应用方法。希望对所有Linux 系统管理员有所帮助。管理好,分析好日志文件是系统安全的第一步,在以后的文章里FreeLAMP还会介绍另外一个检查日志的好东东 logcheck。

Linux ip命令使用方法

ip

1.作用
ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig、route等,使用权限为超级用户。几乎所有的Linux发行版本都支持该命令。

2.格式
ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]

3.主要参数
OPTIONS是修改ip行为或改变其输出的选项。所有的选项都是以-字符开头,分为长、短两种形式。目前,ip支持如表1所示选项。

OBJECT是要管理者获取信息的对象。目前ip认识的对象见表2所示。

表1 ip支持的选项

-V,-Version 打印ip的版本并退出。
-s,-stats,-statistics 输出更为详尽的信息。如果这个选项出现两次或多次,则输出的信息将更为详尽。
-f,-family 这个选项后面接协议种类,包括inet、inet6或link,强调使用的协议种类。如果没有足够的信息告诉ip使用的协议种类,ip就会使用默认值inet或any。link比较特殊,它表示不涉及任何网络协议。
-4 是-family inet的简写。
-6 是-family inet6的简写。
-0 是-family link的简写。
-o,-oneline 对每行记录都使用单行输出,回行用字符代替。如果需要使用wc、grep等工具处理ip的输出,则会用到这个选项。
-r,-resolve 查询域名解析系统,用获得的主机名代替主机IP地址

COMMAND 设置针对指定对象执行的操作,它和对象的类型有关。一般情况下,ip支持对象的增加(add)、删除(delete)和展示(show或list)。有些 对象不支持这些操作,或者有其它的一些命令。对于所有的对象,用户可以使用help命令获得帮助。这个命令会列出这个对象支持的命令和参数的语法。如果没 有指定对象的操作命令,ip会使用默认的命令。一般情况下,默认命令是list,如果对象不能列出,就会执行help命令。

ARGUMENTS 是命令的一些参数,它们倚赖于对象和命令。ip支持两种类型的参数:flag和parameter。flag由一个关键词组成;parameter由一个 关键词加一个数值组成。为了方便,每个命令都有一个可以忽略的默认参数。例如,参数dev是ip link命令的默认参数,因此ip link ls eth0等于ip link ls dev eth0。我们将在后面的详细介绍每个命令的使用,命令的默认参数将使用default标出。

4.1 ip link set–改变设备的属性. 缩写:set、s

示例1:up/down 起动/关闭设备。

# ip link set dev eth0 up

这个等于传统的 # ifconfig eth0 up(down)

示例2:改变设备传输队列的长度。

参数:txqueuelen NUMBER或者txqlen NUMBER

# ip link set dev eth0 txqueuelen 100

示例3:改变网络设备MTU(最大传输单元)的值。

# ip link set dev eth0 mtu 1500

示例4: 修改网络设备的MAC地址。

参数: address LLADDRESS

# ip link set dev eth0 address 00:01:4f:00:15:f1

  4.2 ip link show–显示设备属性. 缩写:show、list、lst、sh、ls、l

-s选项出现两次或者更多次,ip会输出更为详细的错误信息统计。

示例:

# ip -s -s link ls eth0

eth0: mtu 1500 qdisc cbq qlen 100

link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff

RX: bytes packets errors dropped overrun mcast

2449949362 2786187 0 0 0 0

RX errors: length crc frame fifo missed

0 0 0 0 0

TX: bytes packets errors dropped carrier collsns

178558497 1783946 332 0 332 35172

TX errors: aborted fifo window heartbeat

0 0 0 332

这个命令等于传统的 ifconfig eth0

  5.1 ip address add–添加一个新的协议地址. 缩写:add、a

示例1:为每个地址设置一个字符串作为标签。为了和Linux-2.0的网络别名兼容,这个字符串必须以设备名开头,接着一个冒号,

# ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0

示例2: 在以太网接口eth0上增加一个地址192.168.20.0,掩码长度为24位(155.155.155.0),标准广播地址,标签为eth0:Alias:

# ip addr add 192.168.4.2/24 brd + dev eth1 label eth1:1

这个命令等于传统的: ifconfig eth1:1 192.168.4.2

 5.2 ip address delete–删除一个协议地址. 缩写:delete、del、d

# ip addr del 192.168.4.1/24 brd + dev eth0 label eth0:Alias1

 5.3 ip address show–显示协议地址. 缩写:show、list、lst、sh、ls、l

# ip addr ls eth0

5.4.ip address flush–清除协议地址. 缩写:flush、f

示例1 : 删除属于私网10.0.0.0/8的所有地址:

# ip -s -s a f to 10/8

示例2 : 取消所有以太网卡的IP地址

# ip -4 addr flush label “eth0”

  6. ip neighbour–neighbour/arp表管理命令

缩写 neighbour、neighbor、neigh、n

命令 add、change、replace、delete、fulsh、show(或者list)

  6.1 ip neighbour add — 添加一个新的邻接条目

ip neighbour change–修改一个现有的条目

ip neighbour replace–替换一个已有的条目

缩写:add、a;change、chg;replace、repl

示例1: 在设备eth0上,为地址10.0.0.3添加一个permanent ARP条目:

# ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm

示例2:把状态改为reachable

# ip neigh chg 10.0.0.3 dev eth0 nud reachable

  6.2.ip neighbour delete–删除一个邻接条目

示例1:删除设备eth0上的一个ARP条目10.0.0.3

# ip neigh del 10.0.0.3 dev eth0

 6.3.ip neighbour show–显示网络邻居的信息. 缩写:show、list、sh、ls

示例1: # ip -s n ls 193.233.7.254

193.233.7.254. dev eth0 lladdr 00:00:0c:76:3f:85 ref 5 used 12/13/20 nud reachable

  6.4.ip neighbour flush–清除邻接条目. 缩写:flush、f

示例1: (-s 可以显示详细信息)

# ip -s -s n f 193.233.7.254

  7. 路由表管理

7.1.缩写 route、ro、r

  7.5.路由表

从Linux-2.2开始,内核把路由归纳到许多路由表中,这些表都进行了编号,编号数字的范围是1到255。另外,

为了方便,还可以在/etc/iproute2/rt_tables中为路由表命名。

默认情况下,所有的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。

  7.6.ip route add — 添加新路由

ip route change — 修改路由

ip route replace — 替换已有的路由

缩写:add、a;change、chg;replace、repl

示例1: 设置到网络10.0.0/24的路由经过网关193.233.7.65

# ip route add 10.0.0/24 via 193.233.7.65

示例2: 修改到网络10.0.0/24的直接路由,使其经过设备dummy

# ip route chg 10.0.0/24 dev dummy

示例3: 实现链路负载平衡.加入缺省多路径路由,让ppp0和ppp1分担负载(注意:scope值并非必需,它只不过是告诉内核,

这个路由要经过网关而不是直连的。实际上,如果你知道远程端点的地址,使用via参数来设置就更好了)。

# ip route add default scope global nexthop dev ppp0 nexthop dev ppp1

# ip route replace default scope global nexthop dev ppp0 nexthop dev ppp1

示例4: 设置NAT路由。在转发来自192.203.80.144的数据包之前,先进行网络地址转换,把这个地址转换为193.233.7.83

# ip route add nat 192.203.80.142 via 193.233.7.83

示例5: 实现数据包级负载平衡,允许把数据包随机从多个路由发出。weight 可以设置权重.

# ip route replace default equalize nexthop via 211.139.218.145 dev eth0 weight 1 nexthop via 211.139.218.145 dev eth1 weight 1

  7.7.ip route delete– 删除路由

缩写:delete、del、d

示例1:删除上一节命令加入的多路径路由

# ip route del default scope global nexthop dev ppp0 nexthop dev ppp1

  7.8.ip route show — 列出路由

缩写:show、list、sh、ls、l

示例1: 计算使用gated/bgp协议的路由个数

# ip route ls proto gated/bgp |wc

1413 9891 79010

示例2: 计算路由缓存里面的条数,由于被缓存路由的属性可能大于一行,以此需要使用-o选项

# ip -o route ls cloned |wc

159 2543 18707

示例3: 列出路由表TABLEID里面的路由。缺省设置是table main。TABLEID或者是一个真正的路由表ID或者是/etc/iproute2/rt_tables文件定义的字符串,

或者是以下的特殊值:

all — 列出所有表的路由;

cache — 列出路由缓存的内容。

ip ro ls 193.233.7.82 tab cache

示例4: 列出某个路由表的内容

# ip route ls table fddi153

示例5: 列出默认路由表的内容

# ip route ls

这个命令等于传统的: route

7.9.ip route flush — 擦除路由表

示例1: 删除路由表main中的所有网关路由(示例:在路由监控程序挂掉之后):

# ip -4 ro flush scope global type unicast

示例2:清除所有被克隆出来的IPv6路由:

# ip -6 -s -s ro flush cache

示例3: 在gated程序挂掉之后,清除所有的BGP路由:

# ip -s ro f proto gated/bgp

示例4: 清除所有ipv4路由cache

# ip route flush cache

*** IPv4 routing cache is flushed.

  7.10 ip route get — 获得单个路由 .缩写:get、g

使用这个命令可以获得到达目的地址的一个路由以及它的确切内容。

ip route get命令和ip route show命令执行的操作是不同的。ip route show命令只是显示现有的路由,而ip route get命令在必要时会派生出新的路由。

示例1: 搜索到193.233.7.82的路由

# ip route get 193.233.7.82

193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac cache mtu 1500 rtt 300

示例2: 搜索目的地址是193.233.7.82,来自193.233.7.82,从eth0设备到达的路由(这条命令会产生一条非常有意思的路由,这是一条到193.233.7.82的回环路由)

# ip r g 193.233.7.82 from 193.233.7.82 iif eth0

193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac/inr.ac

cache <src-direct,redirect> mtu 1500 rtt 300 iif eth0

  8. ip route — 路由策略数据库管理命令

命令

add、delete、show(或者list)

注意:策略路由(policy routing)不等于路由策略(rouing policy)。

在某些情况下,我们不只是需要通过数据包的目的地址决定路由,可能还需要通过其他一些域:源地址、IP协议、传输层端口甚至数据包的负载。

这就叫做:策略路由(policy routing)。

 8.5. ip rule add — 插入新的规则

ip rule delete — 删除规则

缩写:add、a;delete、del、d

示例1: 通过路由表inr.ruhep路由来自源地址为192.203.80/24的数据包

ip ru add from 192.203.80/24 table inr.ruhep prio 220

示例2:把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并通过表1进行路由

ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320

示例3:删除无用的缺省规则

ip ru del prio 32767

  8.7. ip rule show — 列出路由规则

缩写:show、list、sh、ls、l

示例1: # ip ru ls

0: from all lookup local

32762: from 192.168.4.89 lookup fddi153

32764: from 192.168.4.88 lookup fddi153

32766: from all lookup main

32767: from all lookup 253

  9. ip maddress — 多播地址管理

缩写:show、list、sh、ls、l

  9.3.ip maddress show — 列出多播地址

示例1: # ip maddr ls dummy

  9.4. ip maddress add — 加入多播地址

ip maddress delete — 删除多播地址

缩写:add、a;delete、del、d

使用这两个命令,我们可以添加/删除在网络接口上监听的链路层多播地址。这个命令只能管理链路层地址。

示例1: 增加 # ip maddr add 33:33:00:00:00:01 dev dummy

示例2: 查看 # ip -O maddr ls dummy

2: dummy

link 33:33:00:00:00:01 users 2 static

link 01:00:5e:00:00:01

示例3: 删除 # ip maddr del 33:33:00:00:00:01 dev dummy

 10.ip mroute — 多播路由缓存管理

 10.4. ip mroute show — 列出多播路由缓存条目

缩写:show、list、sh、ls、l

示例1:查看 # ip mroute ls

(193.232.127.6, 224.0.1.39) Iif: unresolved

(193.232.244.34, 224.0.1.40) Iif: unresolved

(193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg

示例2:查看 # ip -s mr ls 224.66/16

(193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg

9383 packets, 300256 bytes

  11. ip tunnel — 通道配置

缩写

tunnel、tunl

  11.4.ip tunnel add — 添加新的通道

ip tunnel change — 修改现有的通道

ip tunnel delete — 删除一个通道

缩写:add、a;change、chg;delete、del、d

示例1:建立一个点对点通道,最大TTL是32

# ip tunnel add Cisco mode sit remote 192.31.7.104 local 192.203.80.1 ttl 32

 11.4.ip tunnel show — 列出现有的通道

缩写:show、list、sh、ls、l

示例1: # ip -s tunl ls Cisco

  12. ip monitor和rtmon — 状态监视

ip命令可以用于连续地监视设备、地址和路由的状态。这个命令选项的格式有点不同,命令选项的名字叫做monitor,接着是操作对象:

ip monitor [ file FILE ] [ all | OBJECT-LIST ]

示例1: # rtmon file /var/log/rtmon.log

示例2: # ip monitor file /var/log/rtmon.log r