[3.300alias
basename
blkid
bunzip
bzcat
bzip2
cat
cal
cd
chattr
chage
chmod
chown
chgrp
clock
compress
cp
createrepo
cut
date
declare
dirname
diff
df
dnf
dumpe2fs
e2lable
e2fsck
echo
edquota
egrep
enable
env
export
fdisk
fgrep
find
findfs
free
fsck
fuser
gdisk
gedit
getent
getfacl
gpasswd
grep
groupadd
groupdel
groupmod
groups
groupmems
grpconv
grpck
grpunconv
gunzip
gzip
hash
halt
head
help
history
hostname
hwclock
ifconfig
ifup
ifdown
kill
let
less
locate
ln
info
ls
lsattr
lscpu
lsof
lvcreate
lvdisplay
lvextent
lvreduce
lvremove
lvrename
lvresize
lvs
makewhatis(centos6)
mandb(centos7)
man
mdadm
mkdir
mke2fs
mkfifo
mkfs
mkfs.ext2
mkfs.ext3
mkfs.ext4
mkfs.xfs
mkfs.vfat
mkswap
more
mount
newgrp
nc
parted
partprobe
partx
paste
patch
ping
poweroff
pwd
pwconv
pwck
pwunconv
pvdisplay
pvcreate
pvremove
pvs
quotacheck
quotaon
read
rename
reboot
rev
rm
rmdir
rpm
rpm2cpio
screen
sed
service
setfacl
set
setquota
shutdown
shift
sort
source
split
ssh
stat
su
swapon
swapoff
tac
tail
tailf
tar
tee
test
touch
tr
tree
tty
tune2fs
type
umask
unalias
uncompress
uniq
unset
unxz
unzip
useradd
userdel
usermod
vgcreate
vgdisplay
vgextend
vgreduce
vgremove
vgrename
vgs
vi
vim
vipw
vigr
wc
warnquota
watch
whatis
which
whoami
who am i
who
w
xargs
xfs_quota
xz
xzcat
yum
yum-config-manager
zcat
zip

第一天

linux入门
基本命令
ls、cd、cp、rm、touch、正则表达式、sed、grep、awk
bash、shell脚本
系统管理
启动流程、排错
服务启动
安全
防火墙 selinux

  1. dhcp服务: ip地址
  2. 172.18.0.100
  3. dns
  4. web IIS apache nginx
  5. 集群
  6. LB 负载均衡
  7. nginx, lvs
  8. 数据库缓存(memcached) 、代理服务缓存(varnish)
  9. HA 高可用 Keepalived
  10. 高性能 rhcs
  11. linux ops: ansible
  12. monitor: zabbix
  13. docker
  14. 计算机硬件 冗余,单点故障
  15. CPU、内存、硬盘(hhd,ssd) 、主板、显卡、声卡、Raid卡、电源、网卡
  16. 计算机软件 用户空间 内核空间

1946 宾夕法尼亚大学 冯诺依曼 ENIARC 长 30.48米 宽6米 高2.4米 占地170平方米 30英顿
每秒5000次运算

  1. cpu: intel amd 高通

服务器server:
vnc server

客户端client:
vnc viewer

(2+3)*5

一字节8bit

hello
分 角 元
8个2进程制

世界第一台计算机

0
1 bit b
8bit = 1 Bytes B
1字节 B
1024字节 KB
1024KB MB
1024MB GB
1024GB TB
1024TB PB
1024PB EB

块设备

1946 宾夕法尼亚大学 冯诺依曼 ENIARC 长 30.48米 宽6米 高2.4米 占地170平方米 30英顿
每秒5000次运算
1960 30终端

1965 300同时运行
multi task
Bell
MIT 麻省理工大学
GE
1969 最终目标是什么,越做越大,没有方向?迷失。
Bell
2000年 Ford
Ken Thompson Space Travel
PDP-7
dec(digital equipment corporation) 1988 被康柏收购 2001 康柏被惠普收购
PDP-11

  1. Denis
  2. B
  3. 1970-1-1 C UNIX
  4. 1974 文字系统 norff
  5. 《美国计算机通信》
  6. BELL 属于AT&T (American Telephone&Telegraph)
  7. 1977 Berkeley
  8. Berkeley System Distribution = BSD
  9. System V
  10. 1978 SCO 全球第一家包装发行UNIX
  11. 1980 Microsoft,Xenix,bill gates
  12. IBM
  13. SCP: Quick and Dirty Opertaing system( QDOS)
  14. MS DOS
  15. 1981
  16. 施乐
  17. xerox 8010 information system
  18. apple
  19. jobs
  20. bill gates
  21. 1985 windows
  22. 1984 Richard Stallman ***
  23. GNU: GNU is not unix
  24. GPL: General Public License
  25. software:
  26. gcc
  27. ls
  28. firefox
  29. apache
  30. mysql
  31. mariadb
  32. hurd
  33. unix
  34. unix like
  35. 1991 frex linus Torvalds
  36. ftp://..../linux
  37. www.kernel.org
  38. 1993 红色
  39. redhat
  40. 1999推出认证
  41. rhcsa(rhca)
  42. rhce red hat certified engineer
  43. 2003
  44. rhca
  45. redhat 1
  46. redhat 2
  47. rhel red hat enterprise linux
  48. centos
  49. fedora
  50. debian
  51. ubuntu

第二天

ctrl+shift+esc

linux
root super user
oracle sudo

  1. 磁盘2分区2 NTFS文件系统 mount挂载 目录
  2. 挂载源 挂载点
  3. /dev/sda
  4. /dev/sda1 / 20GB
  5. /dev/sda2 /boot 200MB
  6. /dev/sda3 /app 10GB
  7. swap 4G
  8. sdb
  9. sdc

vnc server
vnc client viewer

telnet

secure shell = ssh
openssh-server

192.168.153.137 192.168.153.138

securecrt/xshell/putty

** xshell

shell
人机交互语言
GUI: Windows shell,Mac OS, GNOME, Android,IOS
CLI: powershell, sh,bourn again shell ( bash )、ksh、csh、zsh

shell脚本

** 查看当前的默认shell
[root@centos6 ~]# echo “

** type 判断一个命令的类型
type cd
type ifconfig

** enable 显示及激活内部命令
enable 显示所有已激活的内部命令
enable |wc -l 显示所有已激活的内部命令的数量
enable command 激活所指定的内部命令
enable -n 显示所有被禁用的内部命令
enable -n |wc -l 显示所有已禁用的内部命令的数量
enable -n command 禁用所指定的内部命令

pwd 内部命令
外部命令去PATH找
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

/usr/local/sbin/pwd (ifconfig)
/bin/pwd

** hash 将外部命令的路径缓存
hash 显示所有被缓存的路径
hash -d 命令名 删除指定命令的hash缓存
hash -r 删除所有的hash缓存

** help 内部命令 显示指定内部命令的帮助

* 命令执行的顺序
alias > 内部 > hash > path

** alias 别名
alias 别名=’命令 选项’
alias ls=ls —color=auto

  1. unalias 取消别名
  2. unalias -a 取消所有别名

** 使命令执行不受别名影响
/path/命令 路径执行
\命令
‘命令’
“命令”

* 命令执行的语法
command -option arguments(激活或禁用命令的某项功能)
ls -l
ls -a
ls -al = ls -a -l
ls —help 如果一个选项整体由一个单词组成,即长格式选项,则用—表示
find -name
tar xvf

date
[root@centos7_v7(nanyibo) ~]# date ‘+%Y年%m月%d日 %H时%M分%S秒’
2018年07月10日 16时57分33秒

  1. date +%Y
  2. +%m
  3. +%d
  4. +%H
  5. +%M
  6. +%S
  7. +%w 星期
  8. ** +%F 年-月-日
  9. ** +%T 时:分:秒
  10. 表示昨天
  11. date -d "yesterday" +%F
  12. date -d "last day" +%F
  13. date -d "1 day ago" +%F
  14. date -d "-1 day" +%F
  15. 设置时间
  16. date 月日时分[年][.秒]
  17. [root@centos7_v7(nanyibo) ~]# date 100112302020.23
  18. Thu Oct 1 12:30:23 CST 2020

BIOS basic input output system 基本输入输出系统
CMOS Complementary Metal Oxide Semiconductor 互补金属氧化物半导体
电池 供电
BIOS时间 硬时间
OS 时间 软时间
关机时,将软时间写入硬时间,cmos电池供电,硬时间持续
开机时,将读取硬时间写入软时间

  • hwclock clock
    hwclock 查看硬时间
    hwclock -s 将硬时间写入软时间
    hwclock -w 将软时间写入硬时间
    * which command

*cal
cal 显示当月日历
cal 2018 显示指定年的日期 1-9999
cal -3 上个月当月下个月的日期
cal -y 显示当前日历
cal [日] [月] 年

第三天

关机
poweroff ,halt
重启
reboot

**shutdown
shutdown -r +分钟 在指定分钟后重启
shutdown -h +分钟 在指定分钟后关机
shutdown -r/h 时:分 在指定的绝对时间时重启/关机
shutdown -c 取消关机或重启的计划

** whoami
显示当前终端的用户名

** who
who am i 显示当前终端的用户名,终端名,登录时间(登录ip)
who 显示当前操作所有登录的终端的用户名,终端名,登录时间(登录ip)

** w
w 更详细显示当前操作所有登录的终端的用户名,终端名,登录时间(登录ip),正在进行的命令

6TB
IBM AIX —> Huawei rhel6
oracle 9i —> oracle 11g
xtts
30M/S
scp
scp zaitao.db root@192.168.10.1:/root

* 实验:使用rpm安装screen

  1. 在VMware虚拟机中加载安装光盘的iso
  2. mount /dev/cdrom /media/
  3. rpm -ivh /media/Packages/screen-4.0.3-19.el6.x86_64.rpm

* 使用screen
screen
screen 产生一个新的session,名为终端名-主机名
screen -S sessionname, 产生一个新的session,名为sessionname
screen -ls 查看所有的session及状态
Attached:表示session未与终端中断
Detached:表示session已与终端中断,可用-r恢复
screen -r sessionname 使用当前终端与已终端的session连接
screen -x sessionname 加入正在连接的session,可使两个终端连接相同的session,即两个终端显示效果完全同步

  1. screen -S help
  2. screen -x help

* echo
echo 字符串 打印该字符串到当前终端
echo -E (默认) 不启用解释功能
echo -n 不换行
echo -e 启用解释功能
八进制
[root@centos6(nanyibo) ~]# echo -e “\0150”
h
[root@centos6(nanyibo) ~]# echo -e “\0150\0145\0154\0154\0157”
hello
十六进制
[root@centos6(nanyibo) ~]# echo -e “\x68\x65\x6C\x6C\x6F”
hello

** ASCII编码
man 7 ascii

  • $的用法
    $变量名 引用变量的值
    笔记l - 图1变量名” 引用变量的值,强调变量名的起止范围
    $(命令) 或 命令 引用命令执行的结果
    笔记l - 图2(())
    ** bash只支持整数运算,不支持浮点数(可以使用bc或awk支持浮点数)
  1. {a..z} 显示小写字母a-z
  2. {A..Z} 显示大小字母A-Z
  3. {0..9} 显示数字0-9
  4. {1..10..2} 显示数字1 3 5 7 9 步进为2
  5. {100..1..3} 显示数字100 97 94 …… 1 步进为3

* TAB 补齐命令
cmd alias > 内部 > hash > path
其他部分的补齐:基于路径

** 命令行历史
history

  1. ~/.bash_history

** ctrl+r

** alt+.

** history
history 查看所有历史记录的列表
history -c 清空当前缓存中的历史记录
history -d 数字 删除指定数字的某条历史记录
history n 显示最近的n条历史记录
history -a 将当前终端中新加入缓存的历史记录追加到历史记录文件
history -r 从历史记录中读取文件并追加到缓存中
HISTTIMEFORMAT=”%F %T “ 在显示历史记录时,显示时间

  • export 变量名 可以将变量变为环境变量,以让子shell继承
  • HISTSIZE
  • HISTFILESIZE
  • HISTFILE
    ** HISTCONTROL
    将变量永久保存,写入以下文件

/etc/profile.d/mage.sh

  • bash 快捷键
     ctrl+l 清屏
    ctrl+c 中断命令
    • ctrl+z 暂停进程
    • fg 恢复暂停
    • ctrl+a 光标移至行首
    • ctrl+e 光标移至行尾

* alt+123 a 生成123个a

第三章 获取帮助

  • whatis
    基于数据库的查找
    优点:查找速度快
    缺点:没有实时性
    数据库文件
    Centos6:/var/cache/man/whatis
    Centos7:/var/cache/man/index.db
    更新数据库文件
    Centos6:makewhatis
    Centos7:mandb

** help
help cd
help pwd
help enable

  1. ls --help
  • man

中文man使用方法:
1.挂载光盘
mount /dev/cdrom /media/
2.安装中文man的软件包
rpm -ivh /media/Packages/man-pages-zh-CN-1.5.2-4.el7.noarch.rpm
3.将中文man的路径写的man的配置文件
gedit /etc/man_db.conf 增加一行,内容如下
MANDATORY_MANPATH /usr/share/man/zh_CN
4.man -a ls
q
回车

  1. man的使用
  2. f向下翻一页
  3. b向上翻一页
  4. d向下翻半页
  5. u向上翻半页
  6. ** G 跳至尾页
  7. ** g 跳至首页
  8. ** 搜索关键字
  9. /关键字 n 向下 N向上
  10. ?关键字 n 向上
  11. q 退出man
  12. man的章节,man的关键字有多个文件与之匹配,则按类型,划分为以下9个章节
  13. * 1 Executable programs or shell commands
  14. 2 System calls (functions provided by the kernel)
  15. 3 Library calls (functions within program libraries)
  16. 4 Special files (usually found in /dev)
  17. * 5 File formats and conventions eg /etc/passwd
  18. 6 Games
  19. 7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
  20. * 8 System administration commands (usually only for root)
  21. 9 Kernel routines [Non standard]
  22. man 章节号 关键字 (若省略章节号,则显示数字较小的章节)
  23. man -a 关键字 依次查看指定关键字的所有章节
  24. man -w 关键字 查看关键字匹配到的第一个章节的来源文件
  25. man -aw 关键字 查看关键字匹配到的所有章节的来源文件
  26. man -f 关键字 等于 whatis 关键字

作业:1.显示当前的时间,格式为 yyyy-mm-dd hh:mi:ss
答案:date “+%F %T”
2.显示前天是星期几,格式如Monday
答案:date -d ‘-2day’ +”%A”
3.设置当前日期为 2020-10-11 20:30:59
答案:
方法1:date 101120302020.59
方法2:date -s “2020-10-11 20:30:59”

  1. 4.在本机字符终端登录时,除显示原有信息外,再显示当前登录终端号,主机名和当前时间
  2. CentOS release 6.9 (Final)
  3. Kernel \r on an \m
  4. Zhongduan: \l
  5. Zhujiming: \n
  6. Shijian: \t
  7. 5.在今天晚上10点关机,并提示用户
  8. shutdown -h 20:00

info

第四天

  • 文件有两类数据:
    元数据:metadata 文件的属性:文件的类型,权限,从属关系,大小,时间,数据区指针
    数据:data

目录结构

/boot 与启动相关的文件:内核,ramdisk文件,grub相关,grub菜单文件
200M 300M
/bin binary 二进制
/sbin system binary
/usr/bin
/usr/sbin
/usr/local/bin
/usr/local/sbin

/lib library
/lib64
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64

/home 家
/home/username
/root

/media
/mnt

/etc 配置文件

/dev device
/dev/sda
/dev/tty1
/dev/pts/1
/dev/cdrom
/dev/sr0
/dev/sdb

  1. block: 块设备
  2. character: 字符设备

/opt /usr 程序本身的一些文档,配置文件模板等,默认放在/usr
/srv 服务数据,httpd网站的页面文件html,php,jsp,ftp所共享的数据文件 默认放在/var
/tmp 临时目录
/usr: universal shared, read-only data
/var: variable data files
/proc: 用于输出内核与进程信息相关的虚拟文件系统
/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统

** Linux下的文件类型 一切皆文件 everything is file
• -:普通文件

• d: 目录文件
• b: 块设备
• c 字:符设备
• l: 符号链接文件

• p: 管道文件pipe
• s: 套接字文件sock

pwd
-L 默认,不用打
-P 若当前目录为软链接,则显示源目录路径

绝对路径 从根出发
相对路径 相对
. 当前目录
.. 上一级目录
basename 路径 取出路径中的基名
dirname 路径 取出路径中的目录名

  • cd
    change directory 进入目录
    cd 路径 进入指定目录
    相对路径
    绝对路径
    cd 或 cd ~ 进入家目录
    cd - 进入上一次的工作目录 ,连续执行,会在当前与上一次之间来回切换
    cd -P 如果当前目录为软链接,则进入到源目录

ls list
ls 文件名 列出文件名 若不指定文件名或目录名,则列出当前目录
目录名 展开目录,列出一级子目录的文件名
-a 显示所有文件,包含隐藏文件
-A 显示所有文件,包含隐藏文件,但不包含.及..
-l —long format长格式,列出文件的类型、权限、链接数、owner、group、大小,时间,名字
root用户默认有别名ll
-R
recursive 递归
-d 目录 不展目录,只显示目录自身,一般与-l配合使用以显示目录自身的属性信息
-1 一列显示
**
关于文件名排序
受locale 当中LC_COLLATE 影响,默认是UTF-8
0-9 AaBbCc…Zz
可通过export LC_COLLATE=”C” 将其修改为ASCII排序方式,即
0-9 A-Z a-z

  1. ls 默认即按首字母用LC_COLLATE指定的方式排序
  2. -S 以文件大小排序,默认从大到小 -r后,从小到大
  3. * 关于时间戳
  4. atime 访问时间
  5. mtime 数据修改时间
  6. ctime 元数据修改时间
  7. 可能过stat 文件路径查看全部时间
  8. -t mtime 从最近到最远的时间排序 -r 倒序
  9. -ut atime 从最近到最远的时间排序 -r 倒序
  10. -ct ctime 从最近到最远的时间排序 -r 倒序
  11. -ul 时间列,显示为atime
  12. -cl 时间列,显示为ctime
  13. -U 按文件创建顺序,仅限Cenots7
  14. -X 按扩展名的首字母来排序

stat
显示文件的

文件名通配符

  • 匹配0或多个任意字符
    ? 匹配任意1个字符
    [0-9]
    练习:使用touch {1..100} 创建1到100这100个文件,显示1-35
    ls [0-9] [1-2][0-9] [3][0-5]
    [a-z] 表示aAbBcC……z
    [A-Z] 表示AbBcC……Z
    [a-Z] 表示所有大小写字母
    [ae] 表示是a或e的单一字符
    [^ae] 表示即不是a也不是e的其他任意单一字符
    [:lower:] 表示小写字母
    [:upper:] 表示大写字母
    [:alpha:] 表示大小写字母
    [:digit:] 表示任意数字 等于0-9
    [:alnum:] 表示任意字母及数字 等于a-Z0-9或[[:digit:][:alpha:]]
    [:blank:]:水平空白字符
    [:space:]:水平或垂直空白字符 文件名不可能包含回车,故此处使用与[:blank:]:效果相同
  • touch
    touch filename 若文件不存在,则创建一个空文件
    若文件存在,则更新三个时间戳
    -a filename 仅更新atime ctime
    -m filename 仅更新mtime ctime
    -c filename 若文件存在,则更新三个时间戳
    若文件不存在,不会创建
    -t 203010012050.30 fstab 将时间戳更新为指定时间

* cp 复制
-i 覆盖前提示用户,若不加-i,则直接覆盖(前提没有alias)
-r或-R 递归,如源包含目录,一定要递归才能复制
-d 当复制的源是一个软链接时,复制出的文件,也是软链接,若不加d,则复制完整的源文件
—preserv=
mode 保留权限不变
owner[ship] 保留权限及owner,group不变
time[stamp] 保留时间戳不变
all 以上都包含
-p = —preserv=mode,owner,time
-v 复制的详细信息,每复制完一个文件,显示一行记录
du -s 先查源大小,再查目标大小
-f ??
-u 只在源比目标更新时复制
—backup=numbered 在覆盖前自动备份,后缀为
cp fstab{,.orig} = cp fstab fstab.orig

mv
移动
改名
rename 策略 对哪些文件修改
例:
touch {1..9}.txt
将txt改为doc
rename txt doc *.txt

  1. -i 覆盖前提示用户,若不加-i,则直接覆盖(前提没有alias)
  2. -f 强制覆盖
  3. \mv
  4. /bin/mv
  5. 'mv'
  6. "mv"
  7. mv -f

* rm
-i 删除前提示用户,若不加-i,则直接删除(前提没有alias)
-f 强制删除
\rm
/bin/rm
‘rm’
“rm”
rm -f

tree
-L level 列出指定级的路径
-d 只列出目录
-P 模式匹配

mkdir

  • -p a/b/c/d/e 连续创建多级目录
    -v 创建时显示过程
    -m 777 创建时指定权限

rmdir

rm -rf

作业:
1、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录
ls -d /etc/[[1]][[:alpha:]]
2、显示/etc/目录下所有以rc开头,并后面是0- 6之间的数字,其它为任意字符的文件或目录
ls -d /etc/rc[0-6]

3、显示/etc目录下,所有以.d结尾的文件或目录
ls -d /etc/.d
4、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录
ls -d /etc/[mnrp]
.conf
5、只显示/root下的隐藏文件和目录
ls -d /root/.
6、只显示/etc下的非隐藏目录
ls -d /etc/
/
7、显示/etc目录下所有以k开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
ls -d /etc/k[0-9][[:lower:]]
8、显示/proc目录下名字由任意三位数字组成的文件或目录
ls -d /proc/[[:digit:]][[:digit:]][0-9]
9、显示/var/log目录下文件名包含符号及数字的文件或目录
ls -d /var/log/[:punct:][[:digit:]] /var/log/[[:digit:]][:punct:]
10、显示/usr/share/man目录下所有以m开头,以一个数字和x结尾的文件或目录
ls -d /usr/share/man/m[0-9]x
11、显示/etc目录下,所有以一个大写字母开头,以两个数字结尾的文件或目录
ls -d /etc/[[:upper:]]
[0-9][0-9]
12、显示/etc目录下,文件名至少包含一个小写字母和一个数字并以.conf结尾的文件或目录
ls -d /etc/[[:lower:]][0-9].conf /etc/[0-9][[:lower:]].conf
13、只显示用户家目录下的非隐藏目录
ls -d ~/*/
14、定义别名命令baketc,将/etc/目录下所有文件,备份到/testdir独立的子目录下,并要求子目录格式为 backupYYYY-mm-dd,备份过程可见
alias baketc=’cp -av /etc /testdir/backup$(date +%F)’
15、创建/testdir/rootdir目录,并复制/root下所有文件到该目录内,要求保留原有权限
cp -a /root/ /testdir/rootdir
16、如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6,
/testdir/dir5/dir7
mkdir -p /testdir/dir{3,4,5/dir{6,7}}
17、使用一条命令创建/testdir/dir8/x, /testdir/dir8/y, /testdir/dir8/x/a, /testdir/dir8/x/b, /testdir/dir8/x/c, /testdir/dir8/y/a, /testdir/dir8/y/b
mkdir -p /testdir/dir8/{x/{a,b,c},y/{a,b}}
18、使用一条命令创建 /testdir/dir9/x, /testdir/dir10/y, /testdir/dir9/x/a,
/testdir/dir10/y/b
mkdir -p /testdir/{dir9/x/a,dir10/y/b}
19、 使用一条命令创建/testdir/dir11, /testdir/dir12, /testdir/dir13,
/testdir/dir12/dir14, /testdir/dir13/dir15
mkdir -p /testdir/dir{11,12/dir14,13/dir15}

第五天

文件系统

windows95 dos
windows98 vfat
windows nt windows me ntfs
windows 2000
2001 xp

inode 与 block

inode
每个文件有且只有一个inode
inode用来存储文件的元数据
类型
权限
owner
group
链接数
atime mtime ctime
大小
扩展属性 acl
block的指针(1 5 10 200 2 11)
12个直接,1个间接,1个双间接,1个三间接

  1. 12*1K+256*1K+256*256*1K+256*256*256*1K=16G
  2. inode 2.6.10 128字节Bytes 4bytes

block 文件系统的最小存储单位 1K 2K 4K 2^n

superblock

inode block

对于目录 inode 元数据
目录的block存了什么?

/app/testa

/app/dir1
名字 inode号

testb 1001
test.sh 1002

/boot/dir2
名字 inode号

00000000
01110100
00000000
01010101

删除文件,就是在减少该文件的硬链接数,当文件的硬链接数,减少为0时,则

inode bitmap
1 2 3 4 5 6 7 10000
0 0 0 1 0 1 0 0
block bitmap
1 2 3 4 5 6 7 10000
0 0 0 1 0 1 0 0

**硬链接
ln 源 新文件
一旦创建成功,则没有源和目的文件关系
硬链接必须在相同的分区下
硬链接不能对目录创建
目录的硬链接数包含目录自身的名字,以及.和子目录里的..
所以目录的子目录数=(链接数-2)

**软链接
ln -s 源文件 目的文件
快捷方式
软链接可以跨分区
可以相对路径 ,也可以绝对路径
在创建相对路径时,推荐进入到最终目录,再创建
删除源,软链接不可用

*file 判断文件的类型
.exe .mp3 .txt
-b 显示的结果前不显示文件名
-f filelist 列出文件filelist中文件名的文件类型
-F. 输出的分隔符
-L 如果判断的对象是软链接,则显示源文件的文件类型

i/o
input / output

输入输出重定向

或 1> 表示正确输出重定向
若文件不存在,则创建,若文件已存在,则覆盖

若文件不存在,则创建,若文件已存在,则追加

2> 表示错误输出重定向
2> 若文件不存在,则创建,若文件已存在,则覆盖
2>> 若文件不存在,则创建,若文件已存在,则追加

&> 表示全部输出重定向(正确错误都定向)
&> 若文件不存在,则创建,若文件已存在,则覆盖
&>> 若文件不存在,则创建,若文件已存在,则追加

1>&2 表示将正确结果转换为错误结果
2>&1 表示将错误结果转换为正确结果

黑洞 垃圾桶
/dev/null

set -C 禁止覆盖

| 临时强制覆盖
set +C 允许覆盖

* tr
translate 转换

输入重定向
cat > test.txt
进行键盘输入
结束ctrl+d

tr a-z A-Z < .bashrc
cat > hello < /root/.bashrc

[root@centos6(nanyibo) app]# cat > hello.txt << EOF

dear zhangsan
how are you?
byebye
EOF

邮件收发
[zhangsan@centos6(nanyibo) ~]$ mail -s yuema root
wan shang you kong ma?
.
EOT

mail
1
save
quit

* 管道 |
只将正确的结果传递给管道
如希望错误的也可以传递,则需要先将错误结果转为正确结果 2>&1 | 或 |&

ls -l /etc/ |less
echo youkongma |mail -s “yuehui” root
echo 2.5+1.5 |bc

tr命令

tr转换和删除字符

tr[OPTION]… SET1 [SET2]

选项:
-c –C —complement:取字符集的补集
-d —delete:删除所有属于第一字符集的字符
**-s —squeeze-repeats:把连续重复的字符以单独一个字符表示
-t—truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符

[:alnum:]:字母和数字[:alpha:]:字母[:cntrl:]:控制(非打印)字符[:digit:]:数字[:graph:]:图形字符[:lower:]:小写字母[:print:]:可打印字符:punct::标点符号[:space:]:空白字符[:upper:]:大写字母[:xdigit:]:十六进制字符

重定向到多个目标(tee)

命令1 | tee[-a ] 文件名| 命令2
把命令1的STDOUT保存在文件中,做为命令2的输入
-a 追加

使用:

保存不同阶段的输出

复杂管道的故障排除

同时查看和记录输出

作业:
1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
tr a-z A-Z < /etc/issue > /tmp/issue.out
cat /etc/issue |tr a-z A-Z > /tmp/issue.out
2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中
who |tr a-z A-Z > /tmp/who.out
3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下:
Hello, I am 用户名,The system version is here,please help me to check it ,thanks
操作系统版本信息
( echo “Hello, I am mn2 c/fe3 uz4”,只保留其中的数字和空格
echo ‘xt.,l 1 jr#!$mn2 c
/fe3 uz4’ |tr -cd ‘0-9 ‘
8、将PATH变量每个目录显示在独立的一行
echo $PATH |tr : ‘\n’
9、将指定文件中0-9分别替代成a-j
cat hehe |tr 0-9 a-j
10、将文件中每个单词(由字母组成)显示在独立的一行,并无空行
cat test.txt |tr ‘:punct:‘ ‘\n’ |tr ‘ ‘ ‘\n’

用户,组,权限

用户(uid) 可以加入多个组

主要组 私有组
附加组 公有组

centos5 md5

2005 山东大学 王小云

文件 只能属于一个用户,一个组

安全的上下文
进程 zhangsan /bin/touch /app/san.txt

pwconv 默认生效,/etc/passwd中的密码位显示为x,密码被映射到了shadow(仅root可以访问)
pwunconv ,删除shadow,所有密码,直接存在/etc/passwd

* /etc/passwd
用户名
密码位:x
uid:
gid:
描述位:可为空
家目录:
shell:

/etc/shadow
用户名:
密码位:
密码的上次修改日期: 从1970-1-1到修改时走过多少天
passwd
—stdin 只需要输入一次明文密码一般配合管道使用,如下
echo redhat |passwd —stdin zhangsan
密码最小存活期: 多少天内不能改密码
密码最大存活期: 过期时间
密码过期前多少天开始提醒用户:
密码过期后多少天帐户过期:
帐户过期:
保留位:

chage
-d 上次修改时间
-E 过期时间
-I 过期之后多少天帐户过期
-l 列出信息
-m 密码最小存活期
-M 密码最大存活期

-W 密码过期之前多少天提醒用户

* /etc/group
组名
组密码:x 映射到了/etc/gshadow
组id
附加组成员列表:用,间隔

* /etc/gshadow
组名
加密后的密码位
组管理员:可以,间隔 可以修改组密码,可以修改组成员
附加组成员列表:用,间隔

vipw = vi /etc/passwd
vigr = vi /etc/group
pwck : 检测/etc/passwd /etc/shadow的语法
grpck : 检测 /etc/group /etc/gshadow的语法

* id
显示当前用户自身的信息
id 用户名 显示指定用户的信息
id -u 用户名 显示指定用户的uid
id -g 用户名 显示指定用户的主组的gid
id -un 用户名 显示指定用户的名字
id -gn 用户名 显示指定用的的主组的组名

* useradd
useradd 用户名
useradd -u xxx 用户名 指定被创建用户的uid为多少

第六天

* useradd
-u UID 指定 UID
-o 与-u 配合,不检查uid的唯一性
-g GID/组名 指定用户的主要组
-G GID/组名 指定用户的附加组
-c “注释” 用户名
-d 路径 用户名
路径中的目录名要先存在,而基名不要存在
-s /sbin/nologin 指定用户的默认shell
-N 使用users组做为主要组
-r 创建系统用户
-m 与-r 配合使用,在创建系统用户时,同时创建家目录
-M 创建非系统用户时,不创建家目录
-D 设置默认值,影响以下文件
useradd的默认设置 /etc/default/useradd

groupadd 组名

练习

1、创建用户gentoo,附加组为bin和root,默认shell为/bin/csh,注释信息为”Gentoo Distribution”
useradd -G root,bin -s /bin/csh -c “Gentoo Distribution” gentoo
getent passwd gentoo

2、创建下面的用户、组和组成员关系
名字为admins 的组
用户natasha,使用admins 作为附属组
用户harry,也使用admins 作为附属组
用户sarah,不可交互登录系统,且不是admins 的成员,natasha,harry,sarah密码都是centos

[root@centos6(nanyibo) ~]# groupadd admins
[root@centos6(nanyibo) ~]# useradd -G admins natasha
[root@centos6(nanyibo) ~]# useradd -G admins harry
[root@centos6(nanyibo) ~]# useradd -s /sbin/nologin sarah
[root@centos6(nanyibo) ~]# passwd natasha
Changing password for user natasha.
New password:
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
[root@centos6(nanyibo) ~]# echo centos |passwd —stdin natasha
Changing password for user natasha.
passwd: all authentication tokens updated successfully.
[root@centos6(nanyibo) ~]# echo centos |passwd —stdin harry
Changing password for user harry.
passwd: all authentication tokens updated successfully.

批量创建用户
cat /root/userlist.txt
user3笔记l - 图3551:551::/home/user3:/bin/bash
user4笔记l - 图4552:552::/home/user4:/bin/bash
user5笔记l - 图5553:553::/home/user5:/bin/bash

newuser /root/userlist.txt

批量设置密码
cat /root/userpasswd.txt
user3:redhat
user4:centos
user5:haha

chpasswd < /root/userpasswd.txt

usermod
-u UID 用户名 修改指定用户的uid
-g GID/组名 修改用户的主组(该组要先存在)
-G GID/组名[GID2/组名2……] 设置用户的附加组
*-a 与-G 配置,增加用户的附加组
删除所有的附加组
usermod -G ‘’ zhangsan
-s shell 修改用户的默认shell
-c ‘注释内容’ 修改用户的注释
-d 新地址 用户名 只修改/etc/passwd当中家目录的信息,并不会将目录迁移
-m 与-d 配合使用,修改家目录时,目录一同迁移
note: -d 与地址 一定要连在一起
-l 新名字 旧名字 修改用户的登录名
-L 用户名 锁定用户的密码
-U 用户名 解锁用户的密码

* userdel [-r] 用户
-r 删除用户时,连同家目录和mail文件一同删除

* id
id [OPTION]… [USER]
-u: 显示UID
-g: 显示GID
-G: 显示用户所属的组的ID
-n: 显示名称,需配合ugG使用

* su 切换用户
su 用户 非登录式切换 不读取配置文件 不切换家目录
su - 用户 登录式切换 完整登录

  1. su - 若不指定用户,则登录到root
  2. su - user1 -c "cmd1[;cmd2……]" 以指定用户的身份执行命令

* passwd
-e 使下次使用密码登录时,强制修改密码
—stdin:从标准输入接收用户密码
echo “PASSWORD” | passwd—stdin USERNAME

chfn
chsh
finger

* groupadd
-g 组ID 组名
-r 自动分区的组ID,centos6 < 500 centos7 <1000

groupmod
-n 新组名 当前组名
-g 新ID 当前组名

* groupdel
groupdel 组名 删除组

* gpasswd
gpasswd -a username groupname 将指定用户以附加组方式加入到指定组
gpasswd -d username groupname 将指定用户从指定组中删除
gpasswd -A admin1[,admin2……] groupname 设置组管理员
管理员可以修改组密码,及修改组成员

  1. gpasswd -M user1,user2 groupname 设置组成员列表 (仅root执行)
  2. gpasswd -M '' groupname 删除组成的所有成员
  3. gpasswd -r groupname 清空指定组的组密码
  4. 每个用户有且只能有一个主要组,但用户可以有零到多个附加组
  5. 每个文件只能有一个所属人,和一个所属组
  6. - rw- rw- r--. 1 guanyu guanyu 0 Oct 7 09:10 guanyufile1
  7. owner group other
  8. 当用户访问一个文件时,首先判断当前用户是否为该文件的所属人owner
  9. 如果是owner,则应用owner位的权限;
  10. 如果不是owner,则判断该用户的所属组当中,是否有一个组与该文件的group相同
  11. 如果有,则应用group位的权限
  12. 如果都不是,则应用other

*newgrp 组名 生成一个子shell,使用户临时将主要组切换到指定组。
如果当前用户本身以附加组方式存在于该组中,那么newgrp 组名 无需输入密码

** groupmems
-g 组名 -a 用户名 往组中增加成员
-d 用户名 从组中删除成员
-l 列出组成员 (不包含主组)
-p 清空该组的所有组员

总结:将某已在用户以附加组方式加入某组当中
1.usermod -G 组名 用户名
2.gpasswd -a 用户名 组名
3.groupmems -g 组名 -a 用户名

总结:将用户从指定组中删除
1.usermod -G ‘’ 用户名
2.gpasswd -d 用户名 组名
3.groupmems -g 组名 -d 用户名

groups 用户名 查看指定用户属于哪些组(包含主组、附加组)
groupmems -g 组名 -l 查看指定组里有哪些用户(只显示附加组成员列表)

* -rw-r—r—. 1 root shuguo 3317 Oct 7 09:44 passwd
-:文件的类型:-,d,l,b,c,p,s
rw-:owner
r—:group
r—:other
r w x - s t

  1. . 表示该文件是否有selinuxcontext
  2. 1 :表示该文件的硬链接数
  3. root: 该文件的owner
  4. shuguo: 该文件的group
  5. 3317: 该文件的大小,单位bytes
  6. Oc7 7 09:44 表示mtime
  7. -u 表示atime
  8. -c 表示ctime
  9. passwd: 文件名

chown 修改文件的owner
chown 用户名 文件/目录名
-R 递归同时修改目录下的子文件子目录
—reference 文件1 文件2 将文件1的owner设置给文件2
chown owner.group 或 owner:group 文件名 可以同时修改文件的owner和group 仅root

* chgrp 修改文件的group
chgrp 组名 文件/目录名

  1. owner可以修改文件的属于组,但owner一定要属于目标组
  2. -R 递归
  3. --reference 文件1 文件2 将文件1group设置给文件2
  • rwx权限
    文件
    当仅r权限作用在文件上的时候,表示可以读取该文件的内容 cat less
    当仅w权限作用在文件上的时候,表示可以修改该文件的内容 gedit vi vim nano > >>
    当仅x权限作用在文件上的时候,无作用
    *
    当rw权限同时作用在文件上的时候,表示可以读写该文件
    当rx权限同时作用在文件上的时候,表示可以读并能执行该文件
    当wx权限同时作用在文件上的时候,权限等同于仅w权限
    rwx
    目录
    当仅r权限作用在目录上的时候,可以短列出目录的内容(子文件,子目录名)
    当仅w权限作用在目录上的时候,无作用
    当仅x权限作用在目录上的时候,可以进入该目录
    当rw同时作用在目录上的时候,权限等同于仅r
    **
    当rx同时作用在目录上的时候,表示可以长列出,可以进入
    当wx同时作用在目录上的时候,可以创建及删除文件或目录。
    *当rwx同时作用在目录上的时候,可以列出可以创建删除可以进入。

chmod
符号模式
ugo +-= rwx
a=ugo 或=左边省略
=右边省略表示—-

  1. 数字模式
  2. rwx rw- r--
  3. r:4
  4. w:2
  5. x:1
  6. 1:x
  7. 2:w
  8. 3:wx
  9. 4:r
  10. 5:rx
  11. 6:rw
  12. 7:rwx

* umask
umask查询umask
umask xxx 设置umask

  1. chmod a+X * 当批量增加x权限时,x只增加到目录上,而跳过文件,如果某文件本身在ugo任意一位上有x,则不会被跳过
  2. cp -f src dst 当操作的用户对dst没有w权限时,则不能直接覆盖,可以使用-f,进行删除再创建(前提是,操作的用户对该目录有wx权限)

练习
1、当用户xiaoming对/testdir目录无执行权限时,意味着无法做哪些操作?
只有rw时,可以短列出
2、当用户xiaoqiang对/testdir目录无读权限时,意味着无法做哪些操作?
只有wx时,可以创建及删除,可以进入
3、当用户wangcai对/testdir目录无写权限时,该目录下的只读文件file1是否可修改和删除?
只有rx权限时,不能,不能
4、当用户wangcai对/testdir目录有写和执行权限时,该目录下的只读文件file1是否可修改和删除?
只有wx权限时,不能修改,可以删除

执行者 工具 对象

liubei passwd(root,root) /etc/shadow

作业
1、复制/etc/fstab文件到/var/tmp下,设置文件所有者为wangcai读写权限,所属组为sysadmins组有读写权限,其他人无权限
2、误删除了用户wangcai的家目录,请重建并恢复该用户家目录及相应的权限属性
3、创建用户liubei,guanyu,zhangfei,要求三用户同属于一个附加组shuguo
4、创建目录/app/house,要求owner为liubei,仅刘关张对该目录有完整权限,其他人无任何权限
5、分别使用刘关张三用户在house创建各自的room目录,名为xxx_room,要求各自的room只能自己有完整权限,其他人没有任何权限
6、创建一个共享目录为/app/house/common,要求刘关张在该目录下所创建的文件,彼此之间都可以读写,其他人无任何权限。

第七天

特殊权限
suid:当对于一个可执行的二进制文件作用了suid之后,任何人在执行该文件时,临时拥有其所有人的权限
chmod u+s

  1. sgid:
  2. 1.当对于一个可执行的二进制文件作用了sgid之后,任何人在执行该文件时,临时拥有其所有组的权限
  3. *** chmod g+s
  4. 2.当对于一个目录作用了sgid权限之后,任何人在该目录下所创建的文件的所属组,均与该目录的所属组相同
  5. *** sticky: 对于一个目录作用了sticky权限,该目录下的文件仅其所属人和目录的所属人及root可以删除。
  6. suid:4
  7. sgid:2
  8. sticky:1
  9. chattr
  10. +a 表示不能删除,不能覆盖,可以追加
  11. +i 表示不能删除,不能覆盖,不能追加
  12. lsattr 查看attr权限
  13. chattr -i
  14. chattr -a

acl
开启acl的方式
centos7 默认支持acl
centos6及之前,操作系统安装时所创建的文件系统默认支持acl,而操作安装之后使用mkfs格式化的文件系统默认未开启acl,需要手工开启,方法如下:
1.
tune2fs -o acl /dev/sda5
2.
mount -o acl /dev/sda5 /app

  1. 不用系统组
  2. 不要使某用户的多个组都设置不同的acl group 权限
  3. ACl权限判断顺序
  4. owner > acl user > group > other
  5. 设置ACL
  6. setfacl -m u:liubei:rwx testdir
  7. 使用文件设置acl
  8. 1.cat acl.txt
  9. u:liubei:rwx
  10. g:shuguo:---
  11. g:weiguo:r-x
  12. 2.setfacl -M acl.txt testdir/
  1. <br />
  2. 设置默认权限<br />
  3. setfacl -Rm u:liubei:rwx testdir/ 设置当前的权限<br />
  4. setfacl -Rm d:u:liubei:rwx testdir/ 设置未来文件的权限
  1. 删除权限
  2. [root@centos6(nanyibo) app]# setfacl -x u:liubei testdir/
  3. [root@centos6(nanyibo) app]# setfacl -x u:guanyu testdir/
  4. [root@centos6(nanyibo) app]# setfacl -x g:weiguo testdir/
  5. 删除所有权限,清空acl属性
  6. setfacl -b testdir
  7. 批量删除acl权限
  8. 1.cat aclrm.txt
  9. u:liubei
  10. g:shuguo
  11. g:weiguo
  12. 2.setfacl -X acl.txt testdir/
  13. 删除默认权限
  14. setfacl -k testdir
  15. 删除所有权限,清空acl结构
  16. setfacl -b testdir
  17. mask 权限的阀值 即权限上限
  18. setfacm -m m:rwx testdir
  19. chmod g=rwx testdir
  20. acl 扩展属性 打包工具不支持存储
  21. 实验:备份带有acl的文件至tar
  22. 1.备份acl
  23. getfacl * > /root/acl.bak
  24. 2.利用tar备份文件
  25. tar cvf file.tar *
  26. 3.删除原文件,模拟文件损坏
  27. rm a b c d -f
  28. 4.恢复文件
  29. tar xvf file.tar
  30. 5.恢复acl
  31. setfacl --restore /root/acl.bak

cat
-E 显示$
-v 显示windows文件中的换行符^M
-T 显示TAB
-A = EvT
-n 显示的结果前增加行号
-b 显示的结果前增加行号,空行不参加编号
-s 压缩连续的空号行成一行

tac 文件 倒序显示

rev 将标准输入的内容,每行倒着显示
rev < 文件
cat 文件 |rev
echo abcde |rev

less 文件

head 与 tail
head -n X /etc/passwd
tail -n X /etc/passwd
请显示/etc/passwd的第11行至第20行
head -20 /etc/passwd |tail
echo aaaaa | head -c X 取出一段字符的前多少字节

tail -f 根据文件描述符进行追踪,如文件被改名或删除,则追踪停止
tail -F 根据文件名进行追踪,如文件被改名或删除后,再重新创建相同的文件名,则继续恢复追踪

tailf 类型于tail -f -n 10 当监控的文件不增长时,不会去访问硬盘,可以减小磁盘的访问。

实验:利用df命令,查看当前磁盘各文件系统的空间使用率,不要%。

19
1
1
100

方法1:
df |tr -s ‘ ‘ |cut -d’ ‘ -f5 |cut -d% -f1
方法2:
df |tr -s ‘ ‘ % |cut -d% -f5
方法3
df |rev |cut -d’ ‘ -f2|rev |cut -d% -f1
文法4
df |cut -c 44-46

cut
cut -d指定分隔符 -f取第几列 m m,n m-n,k 2-5,7
cut -c取第几个字符 m m,n m-n,k
cut —output-delimiter=”#” 输出分隔符

第八天

paste

cat f1 f2
paste f1 f2
paste -d’|’ f1 f2 合并后的分隔符
paste -s 多行变一行

* wc
-l 行数
-m 字符数
-c 字节数
-w 单词数
-L 显示最长行的长度

  1. 只输入wc显示的行数 单词数 字节数

* sort
-t指定分隔符
-k以第几列排序
-n以数字方式排,将多位的数字当作整体
-r倒序排,从大到小,默认是从小到大
-u去除重复行

* uniq
uniq 去重连续的重复行
-c 显示每行重复的次数
-d 仅显示重复的行
-u 仅显示未重复的行

实验:利用df命令取出分区利用率的最大值
df |tr -s ‘ ‘ % |cut -d% -f5 |sort -n -r |head -1

实验2:利用access_log 分析,访问本网站次数前10名的ip地址
cat access_log |cut -d’ ‘ -f1|sort |uniq -c|sort -n -r|head

diff & patch

  1. diff f1 f2 比较两文件的不同
  2. diff -u f1.old f1.new > f1.patch 根据新,旧文件生成补丁文件
  3. patch -b f1.old f1.patch 根据旧文件及补丁可以生成新文件,同时对旧文件进行备份名字为 文件名.orig

练习

grep
grep 关键字 文件
—color=auto 关键字高亮显示
-v 关键字 显示不包含关关键字的行,取反
-i 关键字 忽略关键字的大小写
-n 显示的结果每行前增加行号
-c 仅显示找出的结果的行数
-o 仅显示匹配到的关键字,不显示同行的其他内容
-q 不输出任何结果,静默
-A # 显示关键字行及向下的n行
-B # 显示关键字行及向上的n行
-C # 显示关键字行及向上n行和向下的n行
nmap -v -sP 172.18.250.0/24 |grep -B1 ‘Host is up’ |grep for |cut -d’ ‘ -f5
-e 关键字1 -e 关键字2 …… 多个关键字之间是或的关系
-w 关键字 匹配整个单词
*-E 等于egrep 使用扩展正则表达式
-F 等于fgrep 不使用正则表达式

正则表达式
字符匹配
. 表示任意内容
[mage] 指定内容的范围 m或a或g或e
[^mage] 除m及a及g及e
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即A-Z, a-z
[:lower:] 小写字母[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
:punct: 标点符号

  1. 匹配次数
  2. * 表示前面的字符匹配任意次,可以0次,可以无限,贪婪模式
  3. .* 表示任意内容任意长度
  4. \? 表示前面的内容匹配0次或1
  5. \+ 表示前的的内容匹配1次以上
  6. \{n\}匹配前面的字符n
  7. \{m,n\}匹配前面的字符至少m次,至多n
  8. \{,n\}匹配前面的字符至多n
  9. \{n,\}匹配前面的字符至少n

作业:
1、在/testdir/dir里创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。
groupadd g1
groupadd g2
groupadd g3
useradd -G g2 alice
useradd -G g3 tom
mkdir -p /testdir/dir
chgrp g1 /testdir/dir
chmod 2750 /testdir/dir
setfacl -m d:g:g2:rwX /testdir/dir
setfacl -m d:g:g3:rX /testdir/dir

2、备份/testdir/dir里所有文件的ACL权限到/root/acltxt中,清除/testdir/dir中所有ACL权限,最后还原ACL权限
cd /testdir/
getfacl * > /root/acl.txt
setfacl -b dir
setfacl —restore /root/acl.txt
getfacl dir

3、利用lscpu命令,仅显示出本机的cpu型号
lscpu |head -13|tail -1|tr -s ‘ ‘|cut -d’ ‘ -f3-
4、利用free命令,仅显示当前主机的内存大小
1982 MB
echo 笔记l - 图6(free |head -2 |tail -1 |tr -s ‘ ‘|cut -d’ ‘ -f2)/1024]M
5、利用/etc/redhat-release文件,仅显示出当前系统的版本号(6或7)
cat /etc/redhat-release |cut -d’.’ -f1|rev |cut -d’ ‘ -f1
6、找出ifconfig“网卡名”命令结果中本机的IPv4地址
ifconfig |head -2 |tail -1 |tr -s ‘ ‘|cut -d ‘ ‘ -f3
7、查出分区空间使用率的最大百分比值
df|tr -s ‘ ‘ ‘%’|cut -d’%’ -f5 |sort -n|tail -1
8、查出用户UID最大值的用户名、UID及shell类型
cat /etc/passwd|sort -n -t: -k3|cut -d: -f1,3,7|tail -1
9、查出/tmp的权限,以数字方式显示
stat /tmp |head -4 |tail -1|tr -s ‘ ‘|cut -d: -f2|cut -c 3-6
stat -c %a /tmp/
10、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
grep -i “s” /proc/meminfo
grep -i [2] /proc/meminfo
grep -i ^s /proc/meminfo
cat /proc/meminfo |grep -e ^S -e^s
11、显示/etc/passwd文件中不以/bin/bash结尾的行
cat /etc/passwd |grep -v “/bin/bash’
16、显示CentOS7上所有系统用户的用户名和UID
cat /etc/passwd |cut -d’:’ -f1,3 |grep “<[0-9]{1,3}>”
17、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin)
,找出/etc/passwd用户名同shell名的行
cat /etc/passwd |grep ‘^(.):./\1”
22、使用egrep取出上面路径的目录名
echo “/etc/rc.d/init.d/functions” |egrep -o “./.” |egrep -o “./“
23、统计last命令中以root登录的每个主机IP地址登录次数
last |grep root |grep ‘([0-9]{1,3}.){3}[0-9]{1,3}’ -o |sort | uniq -c
24、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
[0-9]
[1-9][0-9]
1[0-9][0-9]
2[0-4][0-9]
25[0-5]

25、显示ifconfig命令结果中所有IPv4地址
ifconfig |egrep -o “<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>”
26、将此字符串:welcome to magedu linux中的每个字符去重并排序,重复次数多的排到前面
echo ‘welcome to magedu linux’ |grep -o ‘[[3]]’ |sort |uniq -c |sort -nr

第九天

vim

命令模式 command (default) 移动光标,复制,剪切,粘贴,搜索,撤销,重做…… ,进入其他模式
ZZ: 保存并退出
ZQ: 不保存直接退出
h: 向左移动光标
l: 向右移动光标
j: 向下移动光标
k: 向上移动光标

h|j|k|l 一次性移动指定行 #表示数字

w: 光标移到下一个单词的词首
e: 光标移到下一个单词的词尾
b: 光标移到当前或上一个单词的词首

w|e|b 一次性移动指定个单词 #表示数字

H: 光标移到当前页的页首
L: 光标移到当前页的页尾
M: 光标移到当前页的页中
*G: 光标移到整个文件的尾行

G: 跳到指定行 在退出模式下:#

gg: 光标移到整个文件的首行
^: 跳转至行首的第一个非空白字符
0: 跳转至行首
: 剪切到行尾
d^:剪切到非空行首
d0:剪切到行首
dw: 剪切当前单词
dd: 剪切光标所在的行

dd:多行剪切

y: 删除到行尾,同时进入插入模式
c^:删除到行首,同时进入插入模式
c0:删除到行首,包含带空格的行首,同时进入插入模式
cw: 删除到当前单词的词尾,同时进入插入模式
cc: 删除当前行,同时进入插入模式

cc:多行删除,同时进入插入模式

“[a-z]d|y 复制或剪切到指定的寄存器
“[a-z]p|P

  1. 以二进制方式打开文件
  2. vim b binaryfile
  3. 扩展命令模式下,利用xxd命令转换为可读的十六进制
  4. :%!xxd
  5. 编辑二进制文件
  6. 扩展命令模式下,利用xxd命令转换回二进制
  7. :%!xxdr
  8. 保存退出
  9. 可视化显示颜色
  10. ^[[1;31mhello^[[0m ^[ ctrl+v ;esc

编辑模式 insert : 修改编辑文件内容
i:光标在哪,就在哪进入插入模式
I:光标移到所在行的行首,同时进入插入模式
a:光标向后退一格,同时进入插入模式
A:光标移到所在行的行尾,同时进入插入模式
o:光标所在处向下创建一个新行,同时进入插入模式,光标在新行行首
*O:光标所在处向上创建一个新行,同时进入插入模式,光标在新行行首

  1. 回到command Esc

退出模式 exit: 退出,保存,替换
:进入退出模式
q退出
q!强制退出不保存
w保存
w!强制保存(仅限root及文件的owner)
wq或x 保存并退出
wq!或x! 强制保存并退出 (仅限root及文件的owner)

  1. 回到command: EscEsc, ENTER(左下方的:不会立即消失)
  2. r /path/filename 在光标所在行向下粘贴指定路径的文件的内容
  3. w /path/newfilename 将当前文件另存为到指定路径的新文件中。
  4. *** r! command 在光标所在行向下粘贴命令的输出结果
  5. *** .! command 将光标所在行替换并粘贴命令的输出结果
  6. :# 光标移到第#行
  7. 地址定界
  8. *:start_pos,end_pos
  9. # 具体第#行,例如2表示第2行
  10. #,# 从左侧#表示起始行,到右侧#表示结尾行
  11. #,+# 从左侧#表示的起始行,加上右侧#表示的行数
  12. 2,+3 表示25
  13. . 当前行
  14. $ 最后一行
  15. .,$-1 当前行到倒数第二行
  16. % 全文, 相当于1,$
  17. /pat1/,/pat2/
  18. 从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
  19. #,/pat/
  20. /pat/,$
  21. 使用方式:后跟一个编辑命令
  22. d
  23. y
  24. w file: 将范围内的行另存至指定文件中
  25. r file:在指定位置插入指定文件中的所有内容
  26. *** 查找
  27. /PATTERN:从当前光标所在处向文件尾部查找
  28. ?PATTERN:从当前光标所在处向文件首部查找
  29. n:与命令同方向
  30. N:与命令反方向
  31. *** 查找并替换
  32. :2s/bin/hello/gic
  33. g表示将所匹配行的全行的所有的bin换成hello
  34. i表示忽略大小写,无论大写的Bin还是小写的bin都替换为hello
  35. c替换每个匹配字符串时,询问
  36. :2,5s/bin/hello/g
  37. :/lp/,/ftp/s/bin/hello/g
  38. :/uucp/,20s/bin/hello/g
  39. :%s/\<root\>/rooter/gi
  40. :%s/\<r[^:]*t\>/hello/gi
  41. :%s/r[^:]\{4\}t/hello/gi
  42. :/\(r..t\).*\1/s/300/400/g
  43. 如果要替换的关键字当中包含/,则将替换所用的间隔符换成@或#,如下
  44. :%s@bin/bash@sbin/nologin@gi

替换模式
r 进入单字符的替换
R 进入多字符的替换,退格键表示还原
选择模式
v 进入字符选择模式
d c y
V 进入整行选择模式
d c y

练习:
1、复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的行首的空白字符
:%s/[4]+//gi
2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号
:%s/([5]+.*$)/#\1/gi

  1. ***undo
  2. u 一步步撤消
  3. U 将当前行一次性还原到最初打开状态,注意不能换行
  4. :e! 一次性将整个文件还原
  5. ***redo
  6. ctrl+r 重做
  7. vim FILE1 FILE2 FILE3 ... 多文件模式
  8. :next 下一个
  9. :prev前一个
  10. :first 第一个
  11. :last 最后一个
  12. :wall 保存所有
  13. :qall退出所有
  14. :wqall
  15. 多文件分割
  16. vim -o|-O FILE1 FILE2 ...
  17. -o: 水平分割
  18. -O: 垂直分割
  19. 在窗口间切换:Ctrl+w, Arrow
  20. 单文件窗口分割:
  21. Ctrl+w,s: split, 水平分割
  22. Ctrl+w,v: vertical, 垂直分割
  23. ctrl+w,q:取消相邻窗口
  24. ctrl+w,o:取消全部窗口
  25. wqall退出
  26. 配置文件:永久有效
  27. 全局:/etc/vimrc
  28. 个人:~/.vimrc
  29. 扩展模式:当前vim进程有效
  30. (1) 行号
  31. 显示:set number, 简写为set nu
  32. 取消显示:set nonumber, 简写为set nonu
  33. (2) 忽略字符的大小写
  34. 启用:set ic
  35. 不忽略:set noic
  36. 故障恢复
  37. 未保存修改,vim进程直接意外中断,可利用.文件名.swap来恢复
  38. vim -r 文件名 enter
  39. 还原结束后,请自行删除.swap文件

变量

SEHLL PS1 PATH USER

局部变量:仅对当前shell有效,子shell不继承
set 查看所有的局部变量

环境变量:对当前shell和子shell均有效
export 局部变量名
export 变量名=值

declare -x 局部变量名
declare -x 变量名=值
declare -x 显示所有的环境变量 或export

env 查看所有的环境变量

* unset 取消变量的定义

位置化变量

位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, …:对应第1、第2等参数,shift [n]换位置
笔记l - 图7: 传递给脚本的所有参数,全部参数合为一个字符串
笔记l - 图8#: 传递给脚本的参数的个数
$@ $
只在被双引号包起来的时候才会有差异
set —清空所有位置变量
shift 将位置化参数前移,原有的$1消失,原有的$2变为笔记l - 图9n变为$n-1

shell算术表达式

1.let mage=2*3
echo $mage
6

2.echo $[2*3]

3.echo $((2*3))

生成随机数
echo 笔记l - 图10RANDOM%20+1]

增强型赋值:
+=, -=, *=, /=, %=

let varOPERvalue
例如:let count+=3
自加3后自赋值

自增,自减:
let var+=1
let var++
let var-=1
let var—

练习:
1、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

!/bin/bash

UidA=$(cat /etc/passwd |head -笔记l - 图11%0AUidB%3D#card=math&code=1%20%7Ctail%20-1%20%7Ccut%20-d%3A%20-f3%29%0AUidB%3D&height=20.919540229885058&width=234.13793103448276)(cat /etc/passwd |head -笔记l - 图12%0ASum%3D#card=math&code=2%20%7Ctail%20-1%20%7Ccut%20-d%3A%20-f3%29%0ASum%3D&height=20.919540229885058&width=229.31034482758622)[笔记l - 图13UidB]
echo 第笔记l - 图14{2}个用户的uid和为$Sum

作业:
0、编写一个脚本名为/root/bin/createsh.sh, 在执行该脚本时,执行方法如/root/bin/createsh.sh backup.sh ,执行后,会在/root/bin下生成一个名为backup.sh的文件,其中自带以下行

!/bin/bash

Filename: hello.sh

Revision: 1.0

Date: 2017/06/01

Author: wang

Email: wang@gmail.com

Website: www.magedu.com

Description:


然后自动用vim打开该文件,且光标直接位于非注释部分下的新行

1、在vim中设置tab缩进为4个字符
set ts=4
set tabstop=4
2、复制/etc/rc.d/init.d/functions文件至/tmp目录,替换/tmp/functions文件中的/etc/sysconfig/init为/var/log
cp /etc/rc.d/init.d/functions /tmp
vim /tmp/functions
:%s@etc/sysconfig/init@var/log@gi
3、删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号
:%s @^#([[:space:]]+)@\1@gi
4、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
主机名: hostname
ipv4地址: ifconfig
操作系统版本: /etc/redhat-release Centos 6.9 或 Centos 7.5
内核版本:uname -r
CPU型号:lscpu
内存大小: MB free
硬盘大小: fdisk -l /dev/sda

答案:

!/bin/bash

echo “主机名:笔记l - 图15%22%0Aecho%20%22ipv4%E5%9C%B0%E5%9D%80%EF%BC%9A#card=math&code=%28hostname%29%22%0Aecho%20%22ipv4%E5%9C%B0%E5%9D%80%EF%BC%9A&height=24.137931034482758&width=233.33333333333334)(ifconfig |head -2|tail -1|tr -s ‘ ‘ |cut -d’ ‘ -f3|cut -d: -f2) “
echo “操作系统版本:Centos 笔记l - 图16%22%0Aecho%20%22%E5%86%85%E6%A0%B8%E7%89%88%E6%9C%AC%EF%BC%9A#card=math&code=%28cat%20%2Fetc%2Fredhat-release%20%20%7Crev%7Ccut%20-d%27%28%27%20-f2%7Ccut%20-d%27%20%27%20-f2%7Crev%7Ccut%20-d%27.%27%20-f1%29%22%0Aecho%20%22%E5%86%85%E6%A0%B8%E7%89%88%E6%9C%AC%EF%BC%9A&height=24.137931034482758&width=712.8735632183908)(uname -r)”
echo “CPU型号:笔记l - 图17%22%0Aecho%20%22%E5%86%85%E5%AD%98%E5%A4%A7%E5%B0%8F%EF%BC%9A#card=math&code=%28lscpu%20%7Chead%20-13%7Ctail%20-1%7Ctr%20-s%20%27%20%27%7Ccut%20-d%27%20%27%20-f3-%29%22%0Aecho%20%22%E5%86%85%E5%AD%98%E5%A4%A7%E5%B0%8F%EF%BC%9A&height=24.137931034482758&width=506.89655172413796)(free -m|tr -s ‘ ‘|cut -d’ ‘ -f2|head -2|tail -1)” MB
echo “硬盘大小:$(fdisk -l /dev/sda|grep ‘sda:’|cut -d ‘ ‘ -f3,4|cut -d, -f1)”

5、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中

!/bin/bash

cp -rv /etc/ /root/etcdate +%F
6、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

!/bin/bash

echo df |egrep ^/dev |tr -s ' ' '%'|cut -d'%' -f5 |sort -nr|head -1
7、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

!/bin/bash

cat access_log |cut -d’ ‘ -f1|sort |uniq -c |sort -rn
8、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

!/bin/bash

space1=$(cat 笔记l - 图18“ |wc -l)
space2=$(cat 笔记l - 图19“ |wc -l)
sum=笔记l - 图20space1+笔记l - 图21sum

9、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

!/bin/bash

f1=笔记l - 图22%0Af2%3D#card=math&code=%28ls%20-A%20%2Fetc%20%7Cwc%20-l%29%0Af2%3D&height=20.919540229885058&width=173.79310344827587)(ls -A /var |wc -l)
f3=笔记l - 图23%0Asumfiles%3D#card=math&code=%28ls%20-A%20%2Fusr%20%7Cwc%20-l%29%0Asumfiles%3D&height=20.919540229885058&width=228.50574712643677)[笔记l - 图24f2+笔记l - 图25sumfiles 个”

第十天

&& ||
&& { echo … ; exit 1 ; }

test
[] [ $n -eq 0 ]
[[ =~ ]] 在=~ 可以使用扩展正则表达式,注意正则表达式部分不能使用引号
^ $ \1

1、编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
[ (cat 笔记l - 图26“ |wc -l)
echo “笔记l - 图27spaceline”

2、编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,如果未指定参数,或指定的参数大于2,则显示,“请仅指定一个IP地址”,如果指定的不是一个合法的IP,则显示“请指定一个正确的IP” 测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

[ $# -ne 1 ] && echo “请仅指定一个IP地址” && exit 1
[[ ]] || { echo “请指定一个正确的IP” && exit 2; }
ping -c1 -W1 $1 &> /dev/null && echo “该IP地址可访问” || echo “该IP地址不可访问”
exit 0

3、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满

DiskUsage=笔记l - 图28%0AInodeUsage%3D#card=math&code=%28df%20%7Cgrep%20sd%20%7Cegrep%20-o%20%22%5B%5B%3Adigit%3A%5D%5D%7B1%2C3%7D%25%22%7Cegrep%20-o%20%22%5B%5B%3Adigit%3A%5D%5D%2B%22%20%7Csort%20-n%20%7Ctail%20-%0A1%29%0AInodeUsage%3D&height=20.919540229885058&width=387.01149425287355)(df -i |grep sd |egrep -o “[[:digit:]]{1,3}%”|egrep -o “[[:digit:]]+” |sort -n |ta
il -1)
[ $DiskUsage -ge 80 ] && wall “Disk Usage will full”
[ $InodeUsage -ge 80 ] && wall “FileSystem inode will full”

存在性测试
-a FILE:同-e
-e FILE: 文件存在性测试,存在为真,否则为假
存在性及类别测试
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或-L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件

read
-p 提示内容
-s 输入的内容不显示
-n N 只能输入最长N个字符
-d a 输入结束符
-t N 超时时间,单位秒

read -p “Please type your name: “ Name
id Name is already exit” ; exit 1; }
useradd Name created”
read -sp “Please type your password for ${Name}: “ Passwd
echo
echo $Passwd |passwd —stdin $Name &> /dev/null && echo “Password for $Name updated”

转义

“ “ 部分范围转义: $ ! `
‘ ‘ 完全范围转义
\ 完全单个转义

登录式shell 交互式登录
su - username
登录tty终端
/etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc
清除上个shell的所有变量,同时进入自己的家目录,并按照以上文件设置变量、别名、umask、函数

非登录式shell 非交互式登录
su username
执行脚本

~/.bashrc -> /etc/bashrc -> /etc/profile.d/*.sh
继承上个shell的所有变量,依然默认在上个用户的所在目录,并按照以上文件设置变量、别名、umask、函数

关于-变量

  1. C的作用:禁止使用>覆盖,可用>| 临时覆盖
  2. h的作用:表示将外部命令的路径缓存至hash
  3. i的作用:表示交互式shell
  4. m的作用:表示可以用ctrl+z暂时进程或可以用fgbg 恢复进程
  5. B的作用:表示开启{}的扩展作用
  6. H的作用:表示开启!的历史调用功能

grep 基本正则
egrep 扩展正则
vim 基本正则
[[ =~ ]] 扩展正则
locate -r 基本正则

查找

*locate
基于数据库的查找 updatedb /var/lib/mlocate/mlocate.db
-i 忽略大小写
-r ‘正则表达式’
-n N 只显示前N的条目

* find
-mindepth N 最小搜索深度
-maxdepth N 最大搜索深度
-mindepth N -maxdepth N 只搜索指定深度
-name 以名称为搜索条件 默认精确查找
char“ 模糊查找
-iname 以名称为搜索条件并忽略大小写
-inum inode号 以inode号为查找条件
-samefile file1 找出与file1 inode相同的文件
-links n 找到硬链接数为n的文件
-regextype posix-extended -regex ‘/app/.(r..t)…\1er’ 正则部分要用引号引起来,同时要表示文件的完整路径,搜索当前目录时,用./,搜索指定目录时如/app,则用/app/….
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uidUserID:查找属主为指定的UID号的文件
-gidGroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件

  1. -type
  2. f: 普通文件
  3. d: 目录文件
  4. l: 符号链接文件
  5. s:套接字文件
  6. b: 块设备文件
  7. c: 字符设备文件
  8. p: 管道文件
  9. find /app -path '/app/other' -a -prune -o -name "*test*"
  10. 根据文件大小来查找:
  11. -size [+|-]#UNIT
  12. 常用单位:k, M, Gcbyte
  13. #UNIT: (#-1, #]
  14. 如:6k 表示(5k,6k]
  15. -#UNIT:[0,#-1]
  16. 如:-6k 表示[0,5k]
  17. +#UNIT:(#,∞)
  18. 如:+6k 表示(6k,∞)
  19. find -size 6k
  20. 根据时间戳:
  21. 以“天”为单位;
  22. -atime[+|-]#,
  23. #: [#,#+1)
  24. +#: [#+1,∞]
  25. -#: [0,#)
  26. -mtime
  27. -ctime
  28. 以“分钟”为单位:
  29. -amin
  30. -mmin
  31. -cmin
  32. 根据权限查找:
  33. -perm [/|-]MODE
  34. MODE: 精确权限匹配
  35. /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ centos7开始淘汰
  36. -MODE:每一类对象都必须同时拥有指定权限,与关系
  37. 0 表示不关注
  38. find-perm755会匹配权限模式恰好是755的文件
  39. 只要当任意人有写权限时,find -perm +222就会匹配
  40. 只有当每个人都有写权限时,find -perm -222才会匹配
  41. 只有当其它人(other)有写权限时,find -perm -002才会匹配
  42. 处理动作
  43. -print (默认) 查找的结果打印到终端
  44. -ls 查找的结果显示详细信息
  45. -delete 将查找的结果删除,不交互
  46. -ok shell command {} \; 交互执行shell命令
  47. -exec shell command {} \; 非交互执行shell命令
  48. find -name "*test*" -exec rm {} \;
  49. find -name "*.sh" -exec cp {} {}.bak \;

作业:
1、编写脚本/bin/per.sh,判断当前用户对指定的参数文件,是否不可读并且不可写
[ ! -r “$1” -a ! -w “$1” ] && echo “true” || echo “false”
2、编写脚本/root/bin/excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件

!/bin/bash

read -p “please input the dirname: “ dir
[ -f $dir ] && [[ ]] && chmod a+x 笔记l - 图29{dir}不是脚本文件”
3、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统
nologin.sh
[ -f /etc/nologin ] && echo “All user already can not access” ||touch /etc/nologin && echo “All user
can not access”
login.sh
[ ! -f /etc/nologin ] && echo “All user already can access” ||rm -f /etc/nologin && echo “All user
can access”
4、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
vim /etc/profile.d/.sh
export PATH=$PATH:/usr/local/apache/bin
. /etc/profile.d/
.sh

5、用户root登录时,将命令指示符变成红色,并自动启用如下别名:rm=‘rm –i’
cdnet=‘cd /etc/sysconfig/network-scripts/’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或ifcfg-ens33 ’ (如果系统是CentOS7)
6、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
echo -e ‘\e[31m hi,dengerous! \e[0m’
7、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等

!/bin/bash

echo “alias ls=’ls -l’” >>/etc/bashrc
echo “echo -e ‘\e[31mHi,dangerous!\e[0m’” >>/etc/bashrc
echo “set nu”>> vimrc
echo export d=12>>/etc/profile

8、查找/var目录下属主为root,且属组为mail的所有文件
9、查找/var目录下不属于root、lp、gdm的所有文件
10、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
11、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
12、查找/etc目录下大于1M且类型为普通文件的所有文件
13、查找/etc目录下所有用户都没有写权限的文件
14、查找/etc目录下至少有一类用户没有执行权限的文件
15、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

第十一天

compress
压缩
compress messages 权限不变
compress -c messages > messages.Z 原文件保留,但权限根据umask来设置
解压
uncompress message.Z 或 compress -d messages.Z 权限不变

  1. uncompress -c messages.Z > messages compress -dc messages.Z > messages zcat messages.Z > message
  2. 压缩包保留,但权限根据umask来设置
  3. -v 压缩或解压时,显示详细过程

* gzip
压缩
gzip messages 权限不变
gzip -#(1-9) messages 数字越小,压缩速度越快,压缩比越低,数字越大,压缩速度越慢,压缩比越高,生成的压缩文件越小,默认压缩比为6.
gzip -c messages > messages.gz 原文件保留,但权限根据umask来设置
解压
gunzip message.gz 或 gzip -d messages.gz 权限不变

  1. gunzip -c messages.gz > messages gzip -dc messages.gz > messages zcat messages.gz > message
  2. 压缩包保留,但权限根据umask来设置
  3. -v 压缩或解压时,显示详细过程

* bzip2
压缩
bzip2 messages 权限不变,原文件消失
bzip2 -k message 权限不变,原文件保留,可用在压缩和解压缩
bzip -# (1-9) messages 数字越小,压缩速度越快,压缩比越低,数字越大,压缩速度越慢,压缩比越高,生成的压缩文件越小,默认压缩比为9.
bzip2 -c messages > messages.bz2 原文件保留,但权限根据umask来设置
解压
bunzip -k message.bz2 或 bzip2 -kd messages.bz2 权限不变,压缩包保留
bunzip -c messages.bz2 > messages 或 bzip2 -dc messages.bz2 > messages 或bzcat messages.bz2 > message 压缩包保留,但权限根据umask来设置
-v 压缩或解压时,显示详细过程

* xz
压缩
xz messages 权限不变,原文件消失
xz -k message 权限不变,原文件保留,可用在压缩和解压缩
xz -# (1-9) messages 数字越小,压缩速度越快,压缩比越低,数字越大,压缩速度越慢,压缩比越高,生成的压缩文件越小,默认压缩比为6.
xz -c messages > messages.xz原文件保留,但权限根据umask来设置
解压
unxz -k message.xz 或 xz -kd messages.xz 权限不变,压缩包保留
unxz -c messages.xz > messages 或 xz -dc messages.xz > messages 或xzcat messages.xz > message 压缩包保留,但权限根据umask来设置
-v 压缩或解压时,显示详细过程

*zip

zip 文件名 要压缩的文件
-r
unzip 压缩包.zip

linux.tar.gz

** tar
-c 创建包
-v 打包或解包显示过程
-f 指定文件
-t 查看包中的内容
-x 从包中解开文件,可解开指定文件或全部文件
-xf user.tar passwd 仅解出passwd
-xf user.tar 解出全部文件
-r 往归档包中增加文件
-rf user.tar /etc/fstab
—delete 从归档包中删除文件
tar —delete -f userfile.tar etc/fstab
-C 与-x 配合,指定解压到的目的目录
-j 压缩与解压缩时使用bzip2
tar jcvf userfile.tar.bz2 group gshadow passwd shadow
-z 压缩与解压缩时使用gzip
tar zcvf userfile.tar.gz group gshadow passwd shadow
*-J 压缩与解压缩时使用xz
tar Jcvf userfile.tar.xz group gshadow passwd shadow

  1. tar jxvf tar zxvf tar Jxvf 智能化 直接用 tar xvf

split 分割压缩包

  1. 1.tar Jcvf app.tar.xz *
  2. 2.split -b 5K -d app.tar.xz bakcup
  3. 3.cat bakcup0* > app.tar.xz
  4. 4.tar xvf app.tar.xz

sed

  1. 地址定界:
  2. (1) 不给地址:对全文进行处理
  3. (2) 单地址:
  4. #: 指定的行,$:最后一行
  5. /pattern/:被此处模式所能够匹配到的每一行
  6. (3) 地址范围:
  7. #,#
  8. #,+#
  9. /pat1/,/pat2/
  10. #,/pat1/
  11. (4) ~:步进
  12. 1~2 奇数行
  13. 2~2 偶数行

sed ‘’ fstab
sed -n ‘2p’ fstab
ifconfig |sed -n ‘2p’
sed -n ‘/^r/p’ /etc/passwd
seq 1 10 |sed -n ‘1~2p’
seq 1 10 |sed -n ‘1~2!p’ 或 seq 1 10 |sed -n ‘2~2p’
seq 1 10 |sed -n ‘$p’
seq 1 10 |sed -n ‘3,5p’
seq 1 10 |sed -n ‘2,+3p’
cat pets |sed -n ‘/redhat/,/linux/p’
cat pets |sed -n ‘2,/linux/p’
cat pets |sed ‘2d’
cat -n pets |sed ‘/redhat/d’
cat -n pets |sed ‘2ahahahahah’
cat -n pets |sed ‘1i\hahahahah’
cat -n pets |sed ‘1c\hahahahah’
cat -n pets |sed ‘2,3w/app/haha’
cat -n pets |sed ‘2r/etc/fstab’
cat pets |sed ‘=’

cat pets |sed ‘s/dog/cat/gi’
cat pets |sed ‘s@/testdir/app@/app/testdir@g’
cat pets |sed -r ‘s/(r.t).\1/hello/g’

高级用法
seq 1 8 |sed -n ‘n;p’ 输出偶数行
seq 1 10 |sed ‘1!G;h;笔记l - 图30p’ 倒序输出
seq 1 10 |sed ‘N;D’ 或 seq 1 10 |sed ‘笔记l - 图31!N;/d;G’ 空行删除,每行后加一个空行,即保证每行后只有一个空行
seq 1 10 |sed ‘n;d’ 只显示奇数行

作业:
1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
3、在centos6系统/root/install.log每一行行首增加#号
4、在/etc/fstab文件中不以#开头的行的行首增加#号
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
6、利用sed取出ifconfig命令中本机的IPv4地址
7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
9、将文本文件的n和n+1行合并为一行,n为奇数行

第十二天

C源代码执行过程

1.编写源代码
vim hello.c
// hello.c

include

int main(){
printf(“hello world!\n”);
return 0;
}

2.预处理,将include包含的头文件直接拷贝到hello.c,同时将代码中的注释部分删除
gcc -E hello.c -o hello.i

3.编译的过程实质上是把高级语言翻译成机器语言(汇编语言)的过程,从高级语言-> 汇编语言
gcc -S hello.i -o hello.s

4.汇编:汇编语言-> 二进制
gcc -c hello.s -o hello.o
5.链接:编译过程只是把源文件翻译成了二进制而已,这个二进制还不能直接执行,需要将二进制文件与库绑定到一块
gcc hello.o -o hello

练习:统计光盘中Packages当中的rpm包各架构数量
1.
ls *.rpm |rev |cut -d. -f2|rev |sort |uniq -c |sort -rn

  1. ls .rpm |sed -r ‘s@..(.*).rpm$@\1@p’|sort|uniq -c|sort -n -r

ls *.rpm |egrep -o “[^.]+.rpm” |cut -d. -f1 |sort |uniq -c |sort -rn

实验:删除 /lib64/libc.so.6 并恢复
0.做快照
1.rm -f /lib64/libc.so.6
2.重启,在vmware上点击重启
3.进入rescue 全部回车默认,直到进入命令行
4.cp /lib64/libc.so.6 /mnt/sysimage/lib64
5.exit;并选择重启

ldd which ifconfig

  1. 实验:内核降级
  2. 1.rpm -ivh --oldpackage kernel-2.6.32-642.el6.x86_64.rpm
  3. 2.reboot重启进入旧内核
  4. 3.删除较新的内核
  5. rpm -e kernel-2.6.32-696.el6.x86_64
  6. 实验:内核升级
  7. 1.rpm -ivh kernel-2.6.32-696.el6.x86_64.rpm
  8. 2.reboot 进入新内核

第十三天

rpm 安装
rpm -i 安装
-iv 显示过程
-ivv 显示详细过程
-ivh 显示过程及安装进度百分比
—test 仅测试,并不真正安装
—nodeps 在安装或卸载时忽略依赖性
—replacepkgs重复安装已安装过的包,文件覆盖
—replacefiles将要安装包的部分文件与其他已安装的包文件冲突,可继续安装,文件不覆盖
—oldpackage 已安装过新版本,现在装旧版本
—force 等同于 —replacepkgs, —replacefiles, and —oldpackage.
—noscripts 安装时不执行包中自带的脚本

  1. * -Uvh 新版本rpm 升级rpm包,若有旧版本,则先删除旧版本再安装新版本
  2. 若没有旧版本,则直接安装指定的rpm
  3. -Fvh 新版本rpm 升级rpm包,若有旧版本,则先删除旧版本再安装新版本
  4. 若没有旧版本,则不安装rpm
  5. 当升级内核时,应使用-ivh 安装新内核,以保证旧内核依然存在.
  6. -q 包名 查询已安装过的包的信息
  7. -qa 列出已安装过的所有rpm
  8. -qa "*关键字*" rpm -qa |grep 关键字
  9. *** -qf 文件路径 查询指定文件来自于哪一个已安装的rpm
  10. -qi 包名 显示包的详细信息
  11. -qp [ilcd……] rpm路径 查询信息的数据来自于rpm
  12. -q --provides 查询某个包提供了哪些能力
  13. -qa --provides 查询当前系统提供的所有能力
  14. -q --whatprovides webserver 查询某个能力由哪一个rpm包提供
  15. -q --whatrequires webserver 查询某个能力被哪个rpm包所依赖
  16. -q --changelog httpd 查询更新日志
  17. *** -ql httpd 列出软件包提供的所有文件
  18. -qc httpd 列出软件包提供的配置文件
  19. -qd httpd 列出软件包提供的文档文件
  20. rpm {-V|--verify} [select-options] [verify-options]
  21. S file Size differs
  22. M Mode differs (includes permissions and file type)
  23. 5 digest (formerly MD5 sum) differs
  24. D Device major/minor number mismatch
  25. L readLink(2) path mismatch
  26. U User ownership differs
  27. G Group ownership differs
  28. T mTimediffers
  29. P capabilities differ
  30. rpm --import /media/RPM-GPG-KEY-CentOS-7 导入公钥
  31. rpm -K vsftpd-3.0.2-22.el7.x86_64.rpm
  32. rpm -qa "gpg-pubkey*"

rpm2cpio initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id

  1. <br />
  2. <br />

*实验:删除某文件后利用rpm2cpio解开rpm来恢复文件
1.删除文件
[root@centos(nanyibo) ~]# rm -rf /etc/rc.d/init.d/functions
2.查询文件来自于哪一个已安装rpm包
[root@centos(nanyibo) ~]# rpm -qf /etc/rc.d/init.d/functions
initscripts-9.03.58-1.el6.centos.x86_64
3.挂载光盘
[root@centos(nanyibo) ~]# mount /dev/cdrom /media/
mount: block device /dev/sr1 is write-protected, mounting read-only
4.复制rpm到一个临时目录
[root@centos(nanyibo) ~]# cp /media/Packages/initscripts-9.03.58-1.el6.centos.x86_64.rpm /app
5.进入临时目录并解开rpm包
[root@centos(nanyibo) ~]# cd /app
[root@centos(nanyibo) app]# rpm2cpio initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id
6.从解出的目录里找到需要的文件并复制到相关的原目录下
[root@centos(nanyibo) app]# cp etc/rc.d/init.d/functions /etc/rc.d/init.d/

yum
** /etc/yum.repos.d/.repo 仓库路径
[repoid] 仓库的名称,不能重复
name= 仓库的描述,可以不写,将会用repoid当作name
enabled=1|0 激活或禁用仓库,若不写该行,则默认启用
gpgcheck=1|0 是否在安装包是检测gpg签名,默认检测,即为1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 指定gpg key的路径

  1. *** yum install 包名
  2. repolist [enabled] 默认,只显示已激活的仓库
  3. disabled 仅显示已禁用的仓库
  4. all 显示所有仓库

教学环境repo
[base]
name=Red Hat Enterprise Linux 笔记l - 图32releasever
enabled=1
gpgcheck=0
[epel]
name=mage epel 笔记l - 图33releasever/$basearch
enabled=1
gpgcheck=0

使用在线epel
[epel]
name=mage epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
enabled=1
gpgcheck=0

yum-config-manager —add “https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/

* yum clean all 清空yum缓存
yum makecache 重建缓存,(没有缓存时,首次使用yum的任何命令都会自动重建)

* yum list
base 未安装的包,来自于base
epel 未安装的包,来自于epel
@base 该包已经安装,且是从base安装的
@anaconda 该包已经安装,且是从操作系统的安装程序anaconda安装的

  1. all 默认 表示列出所有包
  2. updates 列出可更新的包
  3. installed 列出已安装的包
  4. @repoid 表示该包安装自指定的仓库
  5. installed 表示该包由rpm命令手工安装

* install 包名1 [包名] [包名2……]
-y 自动应答
reinstall 包名 重新安装指定的包

  1. update 更新包
  2. remove 卸载包 卸载时不会连同依赖包一同卸载

yum info 包名 查看指定包的详细信息

** yum provides “/rz” 搜索一个文件来自于哪个rpm包,可以是未安装的包

yum search 关键字 模糊搜索 软件包和描述

yum deplist php 列出指定包所依赖的所有包

* yum history 列出所有的yum历史
info # 查看某条历史的详细信息
redo # 重做某条历史
undo # 撤消某条历史
如果该历史为install,则undo 是remove
如果该历史为remove,则undo 是install

安装本地的包
yum [local]install /path/*.rpm

软件包组
图形化:
X11 1988
Gnome
Firefox
gedit
Lireoffice
ibus
ibus-pinyin
ibus-wubi

  1. X windows system
  2. Development Tools
  3. ……

* yum grouplist 列出所有的包组名
yum groupinfo ‘包组名’ 查看指定包组中包含哪个包
yum groupinstall ‘包组名’
yum groupupdate ‘包组名’
yum groupremove ‘包组名’

  1. -q 静默,尽量还是用 &> /dev/null

yum reinstall bind —downloadonly —downloaddir=/app 仅下载包,不安装

createrepo rpm包的目录路径 创建repodata

yum


实验:使用源码包安装httpd2.4(centos7)
1.下载源码 官网,教室的服务器
lftp 172.18.0.1
user thirty-three pass:thirty-three
get files/httpd-2.4.27.tar.bz2
exit
tar xvf httpd-2.4.27.tar.bz2
2.安装Development Tools
3.查看README INSTALL
4../configure —help
./configure —prefix=/app/apache24 —sysconfdir=/etc/apache24
dnf|yum install -y apr-devel apr-util-devel pcre-devel
5.make -j 4
6.make install
7.export PATH=$PATH:/app/apache24/bin 可把这行写入/etc/profile.d/*.sh 之后,再source该文件
8.apachectl start 启动服务
9.vim /app/apache24/htdocs/index.html
10.iptables -F
11.浏览器访问

实验2:使用源码包安装httpd2.2(centos6)

作业:
1、查询命令java来自于哪个rpm包
2、yum的配置和使用,包括yum仓库的创建
3、在centos7上安装和使用dnf
4、编写系统初始化脚本reset.sh,包括别名,提示符颜色,yum仓库配置文件,安装tree,ftp,lftp,telnet等包
5、在CentOS6上编译安装apache 2.2源码包,并启动此服务
6、在CentOS7上编译安装apache 2.4源码包,并启动此服务

mknod /app/magediska1 b 8 1
mknod /app/tty1 c 4 1

  1. /dev/sda
  2. /dev/sdb

kvm openstack vda
xen xvda

磁盘三围 hcs
head
cylinder
sector

磁头
柱面
扇区

  1. s h c

512 Bytes 扇区数/磁道 head * 柱面数 = 硬盘的大小

实验一:备份mbr
1.破坏mbr
dd if=/dev/sda of=/app/mbr.img bs=1 count=512
sz /app/mbr.img
dd if=/dev/zero of=/dev/sda bs=1 count=512
reboot
2.
将被破坏的centos7关机,然后在centos6中将centos7的硬盘加入
3.
echo ‘- - -‘ > /sys/class/scsi_host/host0/scan
4.
rz 将备份文件mbr.img 拷到centos6
dd if=mbr.img of=/dev/sdb
5.关闭centos6
6.开启centos7
7.从centos6中删除Centos7的硬盘,再启动centos6

实验二:仅破坏分区表,并恢复
1.备份mbr并破坏分区表
dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446
2.利用mbr的备份,恢复分区表
dd if=/app/mbr.img of=/dev/sda bs=1 count=64 skip=446 seek=446

添加虚拟硬盘,并立即生效

[root@centos7(nanyibo) ~]# echo ‘- - -‘ > /sys/class/scsi_host/host2/scan

第十四天

parted
parted -l 列出所有硬盘的分区表
parted /dev/sda print 列出指定硬盘的分区信息
parted /dev/sdb mklabel gpt|msdos 给指定硬盘重建指定类型的分区表gpt|mbr
parted /dev/sdb mklabel gpt -s 非交互
parted /dev/sdb mkpart primary 1 2G
parted /dev/sdb mkpart primary 2G 5G
parted /dev/sdb mkpart primary 5G 10G
parted /dev/sdb mkpart extended 10G 21.5G
parted /dev/sdb mkpart logical 10G 11G

fdsik
如果非操作系统所在硬盘,w后,直接同步内核
如果是操作系统所在硬盘,w后,自动同步不成功,需要手动同步,方法如下:
centos5及之前,centos7及之后:partprobe
centos6:partx -a /dev/sdX 增加时的同步
partx -d —nr N /dev/sdX 删除时同步

  1. -l 列出所有块设备的分区信息
  2. -l /dev/sda 查看指定块设备的分区信息
  3. /dev/sdX 对指定硬盘修改分区
  4. m: 帮助
  5. o: 创建msdos分区label
  6. n: 创建新的分区
  7. d: 删除分区
  8. p: 查看当前分区表
  9. a: 添加/取消 启动标记
  10. t: 转换分区类型ID
  11. l/L: 显示分区类型ID
  12. 非交互模式 echo -e "n\np\n\n\n+1G\nw\n" |fdisk /dev/sdb &> /dev/null

gdisk /dev/sdb
echo -e “n\n\n\n+2G\n\nw\ny\n” |gdisk /dev/sdb

文件系统

mkfs

[root@centos7(nanyibo) fs]# mkfs.xfs /dev/sdb1
[root@centos7(nanyibo) fs]# mkfs -t xfs /dev/sdb2
[root@centos7(nanyibo) fs]# mke2fs -t ext4 /dev/sdb2 仅支持创建ext系列文件系统

mkfs.ext4 -L 设置卷标
[root@centos7(nanyibo) ~]# e2label /dev/sdb2 查看卷标
zhangsan
[root@centos7(nanyibo) ~]# e2label /dev/sdb2 lisi 修改卷标

mkfs.xxx
-L 卷标
-b block size
-j 启用日志区

blkid
显示所有文件系统名 uuid 文件系统类型
-L 卷标 显示指定卷标的文件系统名
-U UUID 显示指定UUID的文件系统名

findfs
[root@centos7(nanyibo) ~]# findfs LABEL=hello
/dev/sdb2
[root@centos7(nanyibo) ~]# findfs UUID=362d3fd5-0984-46ba-aaf4-b3f91989f88a
/dev/sdb1

* tune2fs 查看及修改ext文件系统

  1. *-l /dev/sdxn 列出指定文件系统的详细信息,信息来源于超级块(superblock)
  2. -L 设置label
  3. -m 设置预留百分比
  4. -j ext2升级为ext3
  5. -O ^has_journal
  6. *-o acl ^acl
  7. -U UUID

dumpe2fs 导出文件系统信息
开头部分与tune2fs -l 相同
-h 不显示分组信息

  1. async sync

e2fsck /dev/sdb2
-f 强制
-y 自动回答yes

mount
-r 只读
-w 读写 默认
-n 挂载后不更新/etc/mtab,导致mount和df命令无法查询到挂载信息,但可查看/proc/mounts
-a 读取/etc/fstab 挂载当前尚未挂载的文件系统,已经挂载的文件系统不会重新挂载,也不会更新挂载选项。
-L ‘LABEL’: 以卷标指定挂载设备
-U ‘UUID’: 以UUID指定要挂载的设备
-B 目录挂载目录
文件挂载文件 df 不可见 可以用df -a查看

  1. -o 指定挂载选项
  2. async (default) 异步模式 sync 同步模式,立即同步
  3. atime (default) 文件被访问时,更新atime noatime 文件被访问时,不更新atime
  4. diratime (default) 目录被访问时,更新atime nodiratime 目录被访问时,不更新atime
  5. auto (default) 写入/etc/fstab后,被mount -a自动挂载
  6. noauto 写入/etc/fstab后,不被mount -a自动挂载
  7. exec (default) 该目录下有rx权限的文件可以被执行
  8. noexec 该目录下所有文件对所有用户包括root,都不可以被执行
  9. dev (default) 该目录下设备文件可以被使用
  10. nodev 该目录下的设备文件不可被使用
  11. suid (default) 表示该目录下的suid,sgid权限生效
  12. nosuid 表示该目录下的suid,sgid权限不生效
  13. remount,xxx 不卸载的情况下,可直接更新挂载选项
  14. rw (default)
  15. ro
  16. nouser(default) 写入/etc/fstab的项目不能让普通用户挂载/卸载
  17. user 写入/etc/fstab的项目可以让普通用户挂载/卸载
  18. acl (centos7 default) 该目录下的文件可以设置acl权限
  19. noacl (centos6及之前 default) 该目录下的文件不可以设置acl权限
  20. loop 挂载loop设备,如iso时,要指定
  21. defaults rw, suid, dev, exec, auto, nouser, asyncatimediratimeacl(centos7)

findmnt MOUNT_POINT|device

lsof 挂载点,查看在指定挂载点上运行的程序,显示其进程号
kill 进程号 杀死指定进程

* fuser 挂载点 可以查看并杀死在挂载点上执行的程序
-v 详细查看
-m 递归,如不加m,只查看挂载点自身,不查看子目录
-k 杀死

  1. *** -vmk 常用的选项组合

CPU
内存
硬盘 虚拟内存
IO: 显示器,键盘,鼠标,打印机,扫描仪
网卡
显卡

交换空间 swap

扩展swap
通过分区扩展 fdisk/parted/gdisk; partprobe
通过文件扩展 dd if=/dev/zero of=/app/swap.img bs=1M count=512

  1. mkswap /dev/sdb5 创建swap(格式化为swap)
  2. swapon /dev/sdb5 手工激活
  3. -p 0-32767 指定优先级,数字越大,越优先
  4. swapoff /dev/sdb5 手工关闭
  5. swapon -a 激活所有在/etc/fstab中的swap
  6. swapoff -a 关闭所有swap
  7. /etc/fstab
  8. UUID=44582fb3-67e4-4b28-b4d3-41fce6fb00d4 swap swap defaults,pri=1 0 0
  9. UUID=6820fd47-271d-44ed-beed-6b3e628469cf swap swap defaults,pri=10 0 0
  10. /app/swap.img swap swap defaults,pri=0 0 0

第十五天

scsi sata ide usb /dev/sd

free
-m
-g
-h

df
-h human-readable
-T 显示文件系统类型

du 目录
分别显示指定目录下所有子目录的大小
-s 仅显示指定目录下所有文件大小的总和
-h human-readable
* -sh

1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项
2、写一个脚本,完成如下功能:
(1) 列出当前系统识别到的所有磁盘设备
(2) 如磁盘数量为1,则显示其空间使用信息
否则,则显示最后一个磁盘上的空间使用信息
3、将CentOS6的CentOS-6.8-x86_64-bin-DVD1.iso和CentOS-6.8-x86_64-bin-DVD2.iso两个文件,合并成一个CentOS-6.8-x86_64-Everything.iso文件,并将其配置为yum源

关闭selinux
1.setenforce 0
2.sed -i ‘7s/enforcing/disabled/g’ /etc/selinux/config

高级文件系统管理

*磁盘配额
ext系列文件系统的quota

  1. 1.开启quotaextxfs)
  2. vim /etc/fstab
  3. 在需要开启quota的文件系统的挂载选项的defaults后加usrquota,grpquota如下
  4. /dev/sda5 /app ext4 defaults,usrquota,grpquota 1 0
  5. 2.生成quota数据库
  6. quotacheck -cugm /app/
  7. 3.开启quota
  8. quotaon /app
  9. quota
  10. -v 显示当前用户自己的quota限额
  11. -v username 显示指定用户的quota限额 仅限root
  12. repquota -v /app 显示所有用户的quota限额(仅限用户在该目录有所属的文件) 仅限root
  13. 4.配置quota
  14. edquota -u/g username/groupname
  15. edquota -u liubei
  16. edquota -g shuguo
  17. 或非交互式
  18. setquota -u[default] |-g username|groupname 10M 20M 5 20 /app
  19. setquota -u liubei 0 0 0 0 /app
  20. setquota -g shuguo 10M 20M 50 100 /app
  21. edquota -p liubei zhangfei liubeiquota设置复制给zhangfei
  22. 注意:对group设置quota时,应该对附加组设置,同时,目录要设置sgid权限才有意义

xfs文件系统的quota
1.开启quota(ext、xfs)
vim /etc/fstab
在需要开启quota的文件系统的挂载选项的defaults后加usrquota,grpquota如下
/dev/sda5 /app ext4 defaults,usrquota,grpquota 1 0

  1. 一定要卸载再挂载才生效
  2. 2.配置
  3. xfs_quota -x -c "print" 查看当前系统中所有的xfs文件系统哪些开启了quota
  4. Filesystem Pathname
  5. / /dev/sda2
  6. /boot /dev/sda1
  7. /app /dev/sda3 (uquota, gquota)
  8. xfs_quota -x -c "report -ugibh" 查看quota设置
  9. -u 查看用户的
  10. -g 查看组的
  11. -i 查看inode
  12. -b 查看block (默认)
  13. -h human-readable
  14. 默认是-ug
  15. ***-uibh
  16. xfs_quota -x -c "state" /app 查看qutoa状态,显示grace time时间
  17. xfs_quota -x -c "limit -u bsoft=30M bhard=40M liubei" /app
  18. 对用户设置quota
  19. xfs_quota -x -c "limit -g bsoft=50M bhard=100M shuguo" /app
  20. 对组设置quota
  21. xfs_quota -x -c "timer -u -b 14days" /app
  22. 设置quota grace time
  23. 获取帮助
  24. xfs_quota -x -c "help limit"
  25. xfs_quota -x -c "help report"

raid

  1. raid0
  2. raid1
  3. raid10

热备盘

实验:为虚拟机增加4块硬盘,每块1G,然后创建一个raid10,格式化为ext4文件系统,并挂载到/raid/test,保护该挂载在重启后依然有效。
mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/sd{e,f}

删除raid
1.umount
2.mdadm -S /dev/md2
3.mdadm —zero-superblock /dev/sd{g..j}

mdadm
-D /dev/md1 查看raid信息
cat /proc/mdstat
-D -s > /etc/mdadm.conf 将所有raid的信息导出到配置文件
-S /dev/md1 停止指定的raid
-A /dev/md2 /dev/sd{g..j} 手动将硬盘组成raid
-A -s 激活所有的raid设备
-A -s /dev/md1 激指定的raid,一定要有配置文件

模拟故障
mdadm /dev/md2 -f /dev/sdg 模拟将md2中的sdg损失
mdadm /dev/md2 -r /dev/sdg 删除损坏的盘
mdadm /dev/md2 -a /dev/sdg 添加新的盘

共享热备盘

1.确定2组raid级别为1或5,同时有一组raid已有热备盘
2.mdadm -D -s > /etc/mdadm.conf
3.需要共享热备盘的raid后都加上spare-group如下
ARRAY /dev/md2 metadata=1.2 spares=1 name=centos7.magedu.com:2 UUID=624dbbed:e93fc3a6:4c04aa3c:f3d1bc20 spare-group=magespace
ARRAY /dev/md3 metadata=1.2 name=centos7.magedu.com:3 UUID=8a6973ab:e4799ca4:4b12ccc1:15bd28b8 spare-group=magespace
MAILADDR root 并加上该行,如不加,mdmonitor服务无法启动
4.启动服务mdmonitor
centos6: service mdmonitor start
centos7: systemctl start mdmonitor

5.mdadm /dev/mdX -f /dev/sdN

LVM

创建LVM过程

  1. 1.分区或增加新的硬盘
  2. 如果是分区,注意分区的ID设置为8e
  3. 2.创建物理卷pv
  4. pvcreate /dev/sdX /dev/sdXn /dev/md1
  5. 查看命令
  6. pvs
  7. pvdisplay [/dev/sdX]
  8. 3.创建卷组vg
  9. vgcreate [-s xM] vgName /dev/sdX ……
  10. vgs
  11. vgdisplay [vgname]
  12. 4.创建逻辑卷lv
  13. lvcreate -l pe num /-L size -n lvname vgname
  14. lvs
  15. lvdisplay [/dev/vgname/lvname]
  16. lvm名称
  17. /dev/dm-x
  18. /dev/mapper/vgname-lvname
  19. /dev/vgname/lvname

删除

  1. 1.卸载
  2. umount /data/lvmtest1/
  3. 2.lvremove /dev/vgmage/lvm33
  4. 3.vgremove vgmage
  5. 4.pvremove /dev/sdb
  6. 为什么要用?在线扩展
  • 扩展逻辑卷
    第一种情况,需要扩展的pe数量,vg可以提供
    lvextend -L +500M /dev/vgmage/lv01
    resize2fs /dev/vgmage/lv01 或 lvextend中指定-r

第二种情况,vg空间不够,需先扩展vg,扩展vg就是往vg中加pv

1.加硬盘,或创建分区等来增加block device
2.创建pv
pvcreate /dev/sdb
3.扩展vg
vgextend vgmage /dev/sdb
4.lvextend -L 4G -r /dev/vgmage/lv01

减小逻辑卷
umount /data/lvmtest1/
e2fsck -f /dev/vgmage/lv01
resize2fs /dev/vgmage/lv01 1000M
lvreduce -L 1000M /dev/vgmage/lv01
mount -a

XFS文件系统的在线扩展

第一种情况,需要扩展的pe数量,vg可以提供
lvextend -L +500M /dev/vgmage/lv01
xfs_growfs /dev/vgmage/lv01 或 lvextend中指定-r

第二种情况,vg空间不够,需先扩展vg,扩展vg就是往vg中加pv

1.加硬盘,或创建分区等来增加block device
2.创建pv
pvcreate /dev/sdb
3.扩展vg
vgextend vgmage /dev/sdb
4.lvextend -L 4G -r /dev/vgmage/lv01

作业:
1.使用8块盘组建Raid50,要求两个raid5各有一个热备盘,同时热备盘可以共享。
2:创建一个可用空间为1G的RAID1设备,文件系统为xfs,有一个空闲盘,开机可自动挂载至/backup目录
3:创建由三块硬盘组成的可用空间为2G的RAID5设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录

  1. 创建用户sunquan要求sunquan对/backup目录只能创建50M的文件,且当创建文件达40M后触发软限制,宽限时间为14天。
    5.创建用户caocao,simayi,guojia三个用户,并创建组weiguo,将以上3个用户以附加组方式加入到该组,要求weiguo用户对/mydata目录共可创建100M的文件,到达80M会开始警告,另外该组用户只能创建最多500个文件。并要求weiguo的用户只能在/mydata下删除自己创建的文件,同时创建的文件,彼此之间可以相互读取他人创建的文件,但不可修改,非weiguo的用户对文件无任何权限。
    6、创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录
    7、新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录
    8、扩展testlv至7G,要求archlinux用户的文件不能丢失
    9、收缩testlv至3G,要求archlinux用户的文件不能丢失
    10、写一个脚本可以进行手机号码抽奖,脚本为/root/bin/choujiang.sh,当执行脚本时,会对/app/mobile.txt文件进行随机抽奖,注意手机号中的第4位及之后的3位变成*
    13911234231 -> 1394231

复习:1.用户组权限,家目录
2.源码编译httpd
3.grep及正则表达式
4.库文件删除
5.tr命令

  1. 6.yum
  2. 7.脚本<br />
  3. 8.cutsortwctr<br />
  4. 9.操作系统版本查看,内核版本查看,CPU型号,内存大小,硬盘大小<br />
  5. 10.tcp/ip

第十六天

1.观察需要迁移的lv所属的vg由哪些pv组成。
pvs
2.将vg的所有数据迁移到一块硬盘上(非系统盘)
pvmove /dev/sda9 /dev/sdb
……
3.把其他无数据存储的硬盘对应的pv从vg中删除
vgreduce vgmage /dev/sda9 ……
4.umount 卸载挂载lv的目录
5.vgchange -an vgmage
6.vgexport vgmage
7.物理操作,将硬盘从旧机器拔掉,插入新机器
8.pvscan
9.vgimport vgmage
10.vgchange -ay vgmage
11.创建所需要的挂载目录
12.mount /dev/vgmage/lv01 挂载点

  1. COW copy on write

openstack
kvm

虚拟机快照

100个centos7

1台机器

100G

关机 10G

作业:
1.对testlv创建快照,并尝试基于快照备份数据,验证快照的功能

ICQ
OICQ

QQ
微信
钉钉
旺旺
飞信
MSN

mail.163.com
mail.qq.com
mail.yahoo.com
mail.sina.com.cn
mail.google.com

outlook、foxmail
tigervnc,openvnc
YY

TCP/IP
IPX
CIFS

NFS sun solaris Network file system
SMB IBM samba

Oracle
mysql -> sun -> oracle
mariadb

马斯洛理论

wifi 电
第一层:生理上需要
第二层:安全上需求
第三层:情感需求
第四层:尊重的需要
第五层:自我实现

modem 调制解调器
2M 10 20M 100M 200M

高可用性
正常时间/总体时间(正常时间+异常时间)
99.9999% 72 7*60 42分钟

ISO 9001
OSI 开放系统互联
IOS cisco

DEC -> 康柏 -> HP -> 清华紫光
intel

ipx
ieee 802.11 a/b/g/n/ac/ad 4.6G 5G

双工模式

单工:单向传输,电视
双工:双向传输,
半双工:
全双工:电话,视频

IOE

ibm 小型机 Oracle EMC
iOS LINUX

BT

root
iptables -F

shell脚本进阶

!/bin/bash

if [ $1 -eq 5 ];then
echo “middle”
elif [ $1 -lt 5 -a $1 -ge 0 ];then
echo “small”
elif [ $1 -lt 0 ];then
echo “error”
else
echo “big”
fi

!/bin/bash

case $1 in
boy|m[ae]n|male)echo “Gentleman”;;
girl|wom[ae]n|female)echo “Lady”;;
*)echo “Error”;;
esac

作业:
1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
2、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes,y,Y,yes,YES,yEs,yeS,还是no,如果输入的是yes,则echo yes,否则 echo no
3、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
4、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
5、写一个计算个人所得税的脚本,名为/root/bin/suodeshui.sh,执行时,输入工资,之后按以下要求算出税后工资。
当工资小于3000时,不收税
当工资在3000至5999时,税率1%
当工资在6000至8999时,税率3%
当工资在9000至11999时,税率5%
当工资在12000及以上时,税率8%

要求,输入税前工资,直接显示税后工资。

6、写一个彩票系统,判断5个数字,猜中多少按以下方式输出
一个不中,显示,“谢谢,下次加油”
中一个显示,”First blood”
中二个显示,”Double kill”
中三个显示,”Triple kill”
中四个显示,”Quadra kill”
全中显示,“大吉大利,今晚吃鸡”

000
001
010
011
100
101
110
111

2^16
1 2

ftp:21 20
ssh:22
telnet:23
smtp:25
pop3:110
imap:143
dns:53 udp tcp
dhcp:67
tftp:69
http:80
https:443
rpc:111
snap:161

for n in $(seq 1 10);do
echo $n
done

for n in $(cut -d: -f1 /etc/passwd);do
echo my name is $n
done

批量创建用户mageuser1~mageuser20。useradd.sh

!/bin/bash

for n in 笔记l - 图34%3Bdo%0A%09useradd%20mageuser#card=math&code=%28seq%201%2020%29%3Bdo%0A%09useradd%20mageuser&height=20.919540229885058&width=218.04597701149424)n
done

批量删除用户mageuser1~mageuser20。连同家目录一同删除。userdel.sh

练习:批量创建用户mageuser18用户的shell为/sbin/nologin,9~20用户的uid为/bin/bash。最后这20个用户的密码都设置为centos

  1. #!/bin/bash
  2. for n in $(seq 1 20);do
  3. if [ $n -le 8 ];then
  4. useradd -u $[2000+$n] -s /sbin/nologin mageuser$n
  5. else
  6. useradd -u $[2000+$n] mageuser$n
  7. fi
  8. echo centos |passwd --stdin mageuser$n &> /dev/null
  9. echo "mageuser$n created"
  10. done

创建一个脚本名为useradd.sh,
当执行-a选项时,会批量创建用户mageuser18用户的shell为/sbin/nologin,9~20用户的uid为/bin/bash。最后这20个用户的密码都设置为centos
当执行-d选项时,批量删除用户mageuser1~mageuser20。连同家目录一同删除

!/bin/bash

case $1 in
-a)for n in {1..20} ;do
if [ $n -le 8 ];then
useradd -u 笔记l - 图35n] -s /sbin/nologin mageuser$n
else
useradd -u 笔记l - 图36n”|bc) mageuser笔记l - 图37n &> /dev/null
echo “mageuser笔记l - 图38for%20n%20in%20%7B1..20%7D%20%3Bdo%0A%20%20%20%20%20%20%20%20%20%20%20%20userdel%20-r%20mageuser#card=math&code=n%20created%22%0A%20%20%20%20%20%20%20done%3B%3B%0A%20%20%20%20-d%29for%20n%20in%20%7B1..20%7D%20%3Bdo%0A%20%20%20%20%20%20%20%20%20%20%20%20userdel%20-r%20mageuser&height=20.919540229885058&width=426.4367816091954)n
done;;
*)echo “Please type -a or -d”;;
esac

!/bin/bash

for n in $(seq 1 254);do
if 笔记l - 图39n &> /dev/null);then
echo “172.18.250.笔记l - 图40n is down”
fi
done

练习:打印矩形。

!/bin/bash

for i in {1..5};do
for j in {1..20};do
echo -en ‘\033[31m❤\033[0m’
done
echo
done

n=0
while [ $n -lt 10 ];do
echo $n
let n++
done

n=0

while true;do
let n++
echo $n
if [ $n -eq 9];then
break
fi
done

while [ $n -lt 10 ];do
echo $n
let n++
if [ $n -eq 5 ];then
continue
fi
done

until [ $n -eq 10 ];do
echo $n
let n++
done

关于shift

!/bin/bash

while [ $# -gt 0 ];do
echo $*
shift
done

练习:创建一个脚本createuser.sh 执行该脚本时,可以在脚本后跟上参数,如./createuser.sh liubei guanyu zhangfei …… ,脚本会依次创建每个用户,如用户本来就存在,则直接改密码为centos,如用户不存在,则创建,并设置密码为centos

!/bin/bash

while [ $# -gt 0 ];do
id $1 &> /dev/null && { echo centos |passwd —stdin $1 &> /dev/null && shift && continue; }
useradd $1 && echo centos |passwd —stdin $1 &> /dev/null && shift
done

练习:
1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本

while : ;do
who |egrep ‘‘ &> /dev/null
if [ $? -eq 0 ];then
echo “who |grep hacker“ >> /var/log/login.log
break
fi
sleep 3s
done

until who |grep “^hacker>” &> /app/login.log;do
sleep 3s
done

!/bin/bash

while read userline;do
userid=笔记l - 图41userline” |cut -d: -f3)
username=笔记l - 图42userline” |cut -d: -f1)
if [ “笔记l - 图43username is a sys user”
else
echo “$username is a comm user”
fi
done < /etc/passwd

!/bin/bash

for userline in 笔记l - 图44%3Bdo%0A%09userid%3D#card=math&code=%28cat%20%2Fetc%2Fpasswd%20%7Ctr%20-d%20%27%5B%5B%3Ablank%3A%5D%5D%27%29%3Bdo%0A%09userid%3D&height=21.724137931034484&width=352.41379310344826)(echo “笔记l - 图45%0A%09username%3D#card=math&code=userline%22%20%7Ccut%20-d%3A%20-f3%29%0A%09username%3D&height=20.919540229885058&width=280)(echo “笔记l - 图46%0A%09if%20%5B%20%22#card=math&code=userline%22%20%7Ccut%20-d%3A%20-f1%29%0A%09if%20%5B%20%22&height=20.919540229885058&width=216.4367816091954)userid” -lt 1000 ];then
echo “笔记l - 图47username is a comm user”
fi
done

实验:把分区利用率大于10%的分区显示 sda5 will be full : 30%

!/bin/bash

df |grep sd |while read disk ;do
diskname=$(echo 笔记l - 图48%0A%09diskusage%3D#card=math&code=disk%20%7Ccut%20-d%27%20%27%20-f1%29%0A%09diskusage%3D&height=21.724137931034484&width=232.52873563218392)(echo $disk |sed -r ‘s/. ([0-9]+)%./\1/‘)
[ diskname will be full: ${diskusage}%”
done

作业:
1、判断/var/目录下所有文件的类型
2、添加10个用户user1-user10,密码为8位随机字符
tr -cd ‘[[:alnum:].@#!_]’ < /dev/urandom |head -c 8
3、centos6下 /etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如
K34filename stop
S66filename start
4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和
5、计算100以内所有能被3整除的整数之和
6、打印九九乘法表 用for写
1*1=1
1_2=2 2_2=4
1_3=3 2_3=6
7、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
8、打印等腰三角形
9、编写脚本,求100以内所有正奇数之和
10、编写脚本,打印九九乘法表 用while写
11、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值
12、编写脚本,实现打印国际象棋棋盘
13、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:
echo $RANDOM|md5sum|cut –c1-10
后的结果,请破解这些字符串对应的RANDOM值
14、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出
15、用文件名做为参数,统计所有参数文件的总行数
16、用二个以上的数字为参数,显示其中的最大值和最小值

第十七天

ipv4 32位2进制
0-255.0-255.0-255.0-255
8位2进制.8位2进制.8位2进制.8位2进制

00000000 0
00000001 1
00000010 2
00000100 4
00001000 8
00010000 16
00100000 32
01000000 64
10000000 128

10101110 174

A类地址,前8位为网络ID,后24位为主机ID
0xxxxxxx.主机ID.主机ID.主机ID

最小值 00000000.主机ID.主机ID.主机ID 0
最大值 01111111.主机ID.主机ID.主机ID 127
网络数:2^7-2=126个
主机数:2^24-2=16777214个
私网地址:10.0.0.0
0.0.0.0 所有地址
127 回环
主机范围:1-126

B类地址,前16位网络ID,后16位为主机ID
10xxxxxx.xxxxxxxx.主机ID.主机ID
网络数:2^14=16384个
主机数:2^16-2=65534个

最小值 10000000 128
最大值 10111111 191

主机范围:128-191
私网地址:172.16.0.0-172.31.0.0

C类地址,前24位网络ID,后8位主机ID
110xxxxx.xxxxxxxx.xxxxxxxx.主机ID
最小值:11000000 192
最大值:11011111 223

主机范围:192-223
网络数:2^21=2097152
主机数:2^8-2=254
私网地址:192.168.0.0-192.168.255.0

D类地址
用于多播
1110xxxx.主机ID.主机ID.主机ID
最小值:11100000 224
最大值:11101111 239

E类地址 保留地址,用于实验室
11110xxx.主机ID.主机ID.主机ID
240-254

192.168.5.0 192.168.5.1-192.168.5.254

172.18.0.1 172.18.10.5

172.16.0.1
10101100.00010000.00000000.00000001
11111111.11111111.11111111.00000000 255.255.255.0
10101100.00010000.00000000.00000000

10101100.00010000.00000000
10101100.00010000.00001010

172.16.10.5
10101100.00010000.11100000.00000101
11111111.11111111.11100000.00000000 /24 = 255.255.255.0
/16 = 255.255.0.0
/8 = 255.0.0.0
/19 = 255.255.224.0

centos6:
172.16.0.1 255.255.0.0 —> 172.16.5.7 255.255.0.0

centos7:
172.16.5.7 255.255.255.0 —> 172.16.0.1 255.255.255.0

centos6网卡名修改

  1. [root@centos6 ~]# vim /etc/udev/rules.d/70-persistent-net.rules
    SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?“, ATTR{address}”00:0c:29:77:8e:d3”, ATTR{type}”1”, K
    ERNEL==”eth
    “, NAME=”ethmage”

2.查看网卡驱动名
[root@centos6 ~]# ethtool -i eth0 |head -1
driver: e1000

3.修改网卡配置文件
[root@centos6 ~]# cd /etc/sysconfig/network-scripts/
[root@centos6 network-scripts]# mv ifcfg-eth1 ifcfg-ethmage (非必须)
[root@centos6 network-scripts]# vim ifcfg-ethmage
DEVICE=ethmage
NAME=”System ethmage” 非必须

4.卸载驱动并加载驱动以重读udev设置
root@centos6 ~]# modprobe -r eth1 ; modprobe eth1

ifconfig
ifconfig 列出所有已激活的网卡信息
ifconfig -a 列出所有网卡信息,包含激活与禁用的
ifconfig eth0 (centos6及之前) ifconfig ens33 (centos7)
ifconfig 网卡名 down 禁用某块网卡;ifconfig 网卡名 up

  1. 设置ip地址
  2. ifconfig eth1 6.6.6.6/24
  3. ifconfig eth1 6.6.6.6 netmask 255.255.0.0

route
route del default 删除默认路由
route add -host 1.1.1.1 gw 2.2.2.254
route add -net 1.1.1.0/24 gw 2.2.2.254
route add default gw 2.2.2.254

centos6:开启ip转发

[root@route1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@route1 ~]# sysctl -p

修改ip地址方法centos6
[root@pc2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth2
BOOTPROTO=dhcp 删除,或=none|static
增加以下两行
IPADDR=2.2.2.2
NETMASK=255.255.255.0

[root@pc2 ~]# ifup eth2

实验1:pc1,pc2,r1三个机器
pc1:1.1.1.1/24
pc2:2.2.2.2/24
r1:
s1: 1.1.1.254
s2: 2.2.2.254

pc1:route add -net 2.2.2.0/24 gw 1.1.1.254
pc2:route add -net 1.1.1.0/24 gw 2.2.2.254
r1:
[root@route1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@route1 ~]# sysctl -p
[root@route1 ~]# iptables -F

实验2:pc1,pc2,r1,r2,r3五个机器

规划如图

r1:route add -net 3.3.3.0/24 gw 2.2.2.252
r1:route add -net 4.4.4.0/24 gw 3.3.3.253
r2:route add -net 1.1.1.0/24 gw 2.2.2.251
r2:route add -net 4.4.4.0/24 gw 3.3.3.253
r3:route add -net 2.2.2.0/24 gw 3.3.3.252
r3:route add -net 1.1.1.0/24 gw 2.2.2.251

动态路由协议:ospf rip bgp eigrp思科专属协议

quagga

作业:
pc1,pc2,r1,r2,r3,r4,r5 配置5个网络,让两个pc机,穿越5个路由可以实现互通

netstat
-t: tcp协议相关
-u: udp协议相关
-w: raw socket相关
-l: 处于监听状态
-a: 所有状态
-n: 以数字显示IP和端口;
-e:扩展格式
-p: 显示相关进程及PID
-rn: 显示路由表
-i :显示所有网卡的流量信息
-IethX :显示指定网卡的流量信息 或 ifconfig -s eth1

ifconfig
ifup
ifdown
route

ip
ip l[ink] [show] 查看链路状态
l[ink] s[et] 网卡名 down 或 ifconfig 网卡名 down 禁用指定的网卡
l[ink] s[et] 网卡名 up 或 ifconfig 网卡名 up 禁用指定的网卡

  1. a[ddr] [show] 查看ip信息
  2. a[ddr] a[dd] x.x.x.x/xx dev 网卡名
  3. a[ddr] a[dd] x.x.x.x/xx dev 网卡名 label 网名名:别名
  4. a[ddr] d[el] x.x.x.x/xx 删除某个ip地址
  5. a[ddr] flush dev 网卡名 清空指定网卡的所有ip地址
  6. r[oute] flush dev 网卡名 清空指定网卡相关的所有路由
  7. 增加路由
  8. ip route add 6.6.6.6 via 172.18.0.1
  9. route add -host 6.6.6.6 gw 172.18.0.1
  10. 删除路由
  11. ip route del 6.6.6.6

ss
-t 显示tcp 默认
-u 显示udp
-l 显示listen状态
-a 所有状态

网卡的配置文件
DEVICE=eth0 设备名
ONBOOT=yes 表示随着网络服务的启动,该网卡是否随之启动
NM_CONTROLLED=yes 表示该网卡是否支持NetworkManager管理
BOOTPROTO=dhcp|static|none 如删除该行,则为手动设置地址
HWADDR= 该网卡的MAC地址

PEERDNS=no 默认是yes
当该网卡启动时,而PEERDNS=yes,则dns配置文件中的dns会被该网卡的dns设置所覆盖,若网卡是dhcp则被dhcp的设置覆盖,若网卡是静态地址,则被静态配置的dns覆盖

IPADDR=6.6.6.6
NETMASK=255.255.255.0
GATEWAY=6.6.6.1
USERCTRL=yes 该网卡的开关是否被普通用户所调整

qq.com

13台根服务器 欧洲1台,日本1台,其他全在美国
www.qq.com.
music.qq.com
v.qq.com
mail.qq.com
game.qq.com
lol.qq.com

/etc/hosts
/etc/nsswitch.conf

给网卡设置别名
1.复制别名的配置文件
cd /etc/sysconfig/network-scripts/
vim ifcfg-eth0:0
3.
DEVICE=eth0:0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
HWADDR=00:0C:29:77:8E:C9
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
IPADDR=3.3.3.3
NETMASK=255.0.0.0
NAME=”System eth0”

在centos6上配置bond

1.手工添加2块网卡,并设置到同一个vmnet中。
2.创建bond0的文件
[root@centos6 ~]# cd /etc/sysconfig/network-scripts/
[root@centos6 network-scripts]# vim ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
BONDING_OPTS=”miimon=100 mode=1”
IPADDR=10.8.8.8
NETMASK=255.255.255.0
NM_CONTROLLED=no

3.配置slave的配置文件
[root@centos6 network-scripts]# vim ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
SLAVE=yes
MASTER=bond0
NM_CONTROLLED=no

[root@centos6 network-scripts]# vim ifcfg-eth3
DEVICE=eth3
TYPE=Ethernet
ONBOOT=yes
SLAVE=yes
MASTER=bond0
NM_CONTROLLED=no

4.重启网络服务
[root@centos6 network-scripts]# service network restart

实验:修改centos7的网卡命令方式为传统模式
1.配置grub2.cfg
vim /boot/grub2/grub.cfg
linux16 /vmlinuz-3.10.0-862.el7.x86_64 root=UUID=659d6636-5012-4347-9b12-3859eb998d40 ro rhgb quiet net.ifnames=0
2.修改网卡配置文件
[root@centos7(nanyibo) network-scripts]# mv ifcfg-ens33 ifcfg-eth0
[root@centos7(nanyibo) network-scripts]# mv ifcfg-ens34 ifcfg-eth1
[root@centos7(nanyibo) network-scripts]# vim ifcfg-eth0
[root@centos7(nanyibo) network-scripts]# vim ifcfg-eth1
文件中的内容主要是DEVICE要改正确

3.重启网络服务

Centos7的网卡配置

nmcli
device show 详细显示网卡的信息 可以后面再跟上具体的网卡名,如不加,则显示所有网卡的信息
device status 简单显示所有网卡的连接状态
device disconnect ens33 断开指定网卡与方案的连接
device connect ens33 创建指定网卡与方案的连接

/etc/sysconfig/network-scripts/ifcfg-xxxx 在centos7中是一个方案的配置文件,xxxx是方案创建时的方案名,但方案名真正存储在文件中的Name=,在修改方案名时,只会改Name=

实验:使用nmcli为网卡配置2套方案,一个Dhcp一个静态获取

1.改旧方案的名称(非必须)
nmcli connection modify ens33 connection.id mage243
cd /etc/sysconfig/network-scripts/
mv ifcfg-ens33 ifcfg-mage243

2.将mage243的方案设置的自动获取ipv4地址
nmcli connection modify mage243 ipv4.method auto

3.使方案生效
[root@centos7(nanyibo) ~]# nmcli connection up mage243

4.新增方案名为mage247
[root@centos7(nanyibo) ~]# nmcli connection add con-name mage247 type ethernet ifname ens33

5.为新增的方案进行配置静态地址
[root@centos7(nanyibo) ~]# nmcli connection modify mage247 ipv4.method manual connection.autoconnect yes ipv4.addresses 8.8.8.8/24 ipv4.gateway 8.8.8.1 ipv4.dns 4.4.4.4

6.切换到新方案,使之生效
[root@centos7(nanyibo) ~]# nmcli connection up mage247

完成

查看方案
[root@centos7(nanyibo) ~]# nmcli connection show
NAME UUID TYPE DEVICE
ens34 dadb8960-c959-47f5-addb-13f8e439d72d ethernet ens34
mage247 482d5ab5-ac7d-4467-ac09-65440b174331 ethernet ens33
virbr0 1eee137a-f1ea-4fe8-b387-5d0561d76aca bridge virbr0
mage243 2ae365b6-ab9a-4882-8831-e38a362881e2 ethernet —

切换方案
[root@centos7(nanyibo) ~]# nmcli connection up mage243
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/9)
[root@centos7(nanyibo) ~]# nmcli connection show
NAME UUID TYPE DEVICE
ens34 dadb8960-c959-47f5-addb-13f8e439d72d ethernet ens34
mage243 2ae365b6-ab9a-4882-8831-e38a362881e2 ethernet ens33
virbr0 1eee137a-f1ea-4fe8-b387-5d0561d76aca bridge virbr0
mage247 482d5ab5-ac7d-4467-ac09-65440b174331 ethernet —

如果手工修改了配置文件,如下
[root@centos7(nanyibo) ~]# vim /etc/sysconfig/network-scripts/ifcfg-mage247
IPADDR=8.8.8.8
PREFIX=24
GATEWAY=8.8.8.1
DNS1=4.4.4.4

则需要使用nmcli connection reload来重读后才能够nmcli connection up
删除方案
[root@centos7(nanyibo) ~]# nmcli connection delete mage247

在centos7上配置网卡bond
1.加2个网卡。
2.增加bond的方案
[root@centos7(nanyibo) ~]# nmcli connection add con-name bond0 ifname bond0 type bond mode active-backup
3.增加slave的方案给两块新加的网卡
[root@centos7(nanyibo) ~]# nmcli connection add con-name slave-38 ifname ens38 type ethernet master bond0
Connection ‘slave-38’ (97708606-56ac-48aa-9014-c23a376c2379) successfully added.
[root@centos7(nanyibo) ~]# nmcli connection add con-name slave-39 ifname ens39 type ethernet master bond0
Connection ‘slave-39’ (608dc1a0-9407-45be-a720-4c415b4b8488) successfully added.
4.配置bond0
[root@centos7(nanyibo) ~]# nmcli connection modify bond0 ipv4.method manual connection.autoconnect yes ipv4.addresses 20.20.20.20/24 ipv4.dns 8.8.8.8 ipv4.gateway 20.20.20.1

5.直接激活bond0
nmcli connection up bond0
ifconfig bond0

ifconfig bond0

team

1.创建team方案
[root@centos7(nanyibo) ~]# nmcli connection add con-name team0 type team ifname team0 config ‘{“runner”: {“name”: “loadbalance”}}’
2.创建slave的方案并指定master
[root@centos7(nanyibo) ~]# nmcli connection add con-name slave-38 type team-slave ifname ens38 master team0
Connection ‘slave-38’ (f3aca771-7131-44ee-80c9-fd1ca866191a) successfully added.
[root@centos7(nanyibo) ~]# nmcli connection add con-name slave-39 type team-slave ifname ens39 master team0
Connection ‘slave-39’ (b69fbcb5-c454-4ea9-bd0f-42ef523ec2fb) successfully added.
3.设置team0的ip
[root@centos7(nanyibo) ~]# nmcli connection modify team0 ipv4.method manual connection.autoconnect yes ipv4.addresses 20.20.20.20/24
4.激活team0及slave
[root@centos7(nanyibo) ~]# nmcli connection up team0
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/59)
[root@centos7(nanyibo) ~]# nmcli connection up slave-38
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/70)
[root@centos7(nanyibo) ~]# nmcli connection up slave-39
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/71)

ftp
lftp
-o
lftpget
wget
axel -n 1000 http://mirror.logol.ru/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso

第十八天

!/bin/bash

for ((i=1;i<=100;i++));do
let sum+=i
done
echo sum=$sum

函数

set 查看本地变量及本地函数
unset 变量名或函数名 取消变量或函数的定义

本地函数
mage () {
echo Hello World
}

环境函数
declare -xf mage或export -f mage
查看环环境函数
declare -xf 或export -f

declare -i num=100 使num的赋值只在当前函数中有效,等于同local num=100

实验:使用函数功能打印国际象棋棋盘

!/bin/bash

red(){
echo -e “\033[41m \033[0m\c”
}
yel(){
echo -e “\033[43m \033[0m\c”
}
redyel() {
for ((i=1;i<=2;i++));do
for ((j=1;j<=4;j++));do
[ “$1” = “-r” ] && { yel;red; } || { red;yel; }
done
echo
done
}
for ((line=1;line<=8;line++));do
[ 笔记l - 图49line%2] -eq 0 ] && redyel || redyel -r
done

0=1
1=1
2=21
3=3_2_1
4=4_3_2
1

函数嵌套

!/bin/bash

fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]; then
echo 1
else
echo $[笔记l - 图50(fact $[$1-1])]
fi
}
fact $1

作业:
1.为某餐馆用Shell制作一个点菜系统。功能如下:
执行脚本会列出主菜单,如下

  1. 请选择您要吃的菜品(消费满608折)
  2. 1)饭
  3. 2)面
  4. 3)饺子
  5. 4)结账
  6. 等待用户选择
  7. 如选择1,则再问
  8. 1)炒饭 10
  9. 2)盖饭 10
  10. 3)拌饭 12
  11. 4)返回主菜单
  12. 如选择2,则再问
  13. 1)炒面 10
  14. 2)热干面 9
  15. 3)烩面 15
  16. 4)重庆小面 9
  17. 5)返回主菜单
  18. 如选择3,则再问
  19. 1)猪肉大葱 18
  20. 2)素三鲜 15
  21. 3)韭菜鸡蛋 18
  22. 4)返回主菜单
  23. 如选择4,则直接退出
  24. 选择后,提示用户,再吃几份,输入完后提示是否还要继续选,如继续选,则返回主菜单,然后继续以上过程,如不要继续选,则会打印消费单后退出,消费单格式如下
  25. 炒饭 5 50
  26. 热干面 1 9
  27. 素三鲜 1 15
  28. 总计 74
  29. 折后 59.2

!/bin/bash

PS3=’请选择您要吃的菜品(消费满60打8折): ‘
while true;do
let RoundTime++
select menu in 饭 面 饺子 结账;do
let RoundTime++
case $REPLY in
1)
select menu in “炒饭 10元 $YiDianChaoFan” “盖饭 10元 $YiDianGaiFan” “拌饭 12元 $YiDianBanFan” “返回主菜单”;do
let RoundTime++
case $REPLY in
1)read -p “要几份: “ ChaoFanNum
let ChaoFanYiDianNum+=ChaoFanNum
YiDianChaoFan=”已点 笔记l - 图51{#CaiPin[]}]=ChaoFan
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
2)read -p “要几份: “ GaiFanNum
let GaiFanYiDianNum+=GaiFanNum
YiDianGaiFan=”已点 笔记l - 图52{#CaiPin[]}]=GaiFan
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
3)read -p “要几份: “ BanFanNum
let BanFanYiDianNum+=BanFanNum
YiDianBanFan=”已点 笔记l - 图53{#CaiPin[]}]=BanFan
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
)continue $RoundTime;;
esac
done;;
2)
select menu in “炒面 10元 $YiDianChaoMian” “热干面 9元 $YiDianReGanMian” “烩面 15元 $YiDianHuiFan” “重庆小面 9元 $YiDianXiaoMian” “返回主菜单”;do
let RoundTime++
case $REPLY in
1)read -p “要几份: “ ChaoMianNum
let ChaoMianYiDianNum+=ChaoMianNum
YiDianChaoMian=”已点 笔记l - 图54{#CaiPin[
]}]=ChaoMian
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
2)read -p “要几份: “ ReGanMianNum
let ReGanMianYiDianNum+=ReGanMianNum
YiDianReGanMian=”已点 笔记l - 图55{#CaiPin[
]}]=ReGanMian
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
3)read -p “要几份: “ HuiMianNum
let HuiMianYiDianNum+=HuiMianNum
YiDianHuiMian=”已点 笔记l - 图56{#CaiPin[
]}]=HuiMian
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
4)read -p “要几份: “ XiaoMianNum
let XiaoMianYiDianNum+=XiaoMianNum
YiDianXiaoMian=”已点 笔记l - 图57{#CaiPin[
]}]=XiaoMian
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
)continue $RoundTime;;
esac
done;;
3)
select menu in “猪肉大葱 18元 $YiDianZhuRouDaCong” “素三鲜 15元 $YiDianSuSanXian” “韭菜鸡蛋 18元 $YiDianJiuCaiJiDan” “返回主菜单”;do
let RoundTime++
case $REPLY in
1)read -p “要几份: “ ZhuRouDaCongNum
let ZhuRouDaCongYiDianNum+=ZhuRouDaCongNum
YiDianZhuRouDaCong=”已点 笔记l - 图58{#CaiPin[]}]=ZhuRouDaCong
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
2)read -p “要几份: “ SuSanXianNum
let SuSanXianYiDianNum+=SuSanXianNum
YiDianSuSanXian=”已点 笔记l - 图59{#CaiPin[]}]=SuSanXian
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
3)read -p “要几份: “ JiuCaiJiDanNum
let JiuCaiJiDanYiDianNum+=JiuCaiJiDanNum
YiDianJiuCaiJiDan=”已点 笔记l - 图60{#CaiPin[]}]=JiuCaiJiDan
read -p “还要继续点菜吗(y/n): “ yesorno
case $(echo $yesorno | tr A-Z a-z) in
y|yes)continue $RoundTime;;
)break $RoundTime;;
esac;;
)continue $RoundTime;;
esac
done;;
)break $RoundTime;;
esac
done
done

for ((i=0;i<${#CaiPin[]};i++));do
if [ 笔记l - 图61{CaiPin[$i]}YiDianNum) -ne 0 ];then
case i]} in
ChaoFan)printf “%-12s\t%-10s%-10s\n” “炒饭” “笔记l - 图62[![](https://g.yuque.com/gr/latex?ChaoFanYiDianNum
10%5D%E5%85%83%22%3Blet%20Total%2B%3D#card=math&code=ChaoFanYiDianNum%2A10%5D%E5%85%83%22%3Blet%20Total%2B%3D&height=24.137931034482758&width=331.4942528735632)[笔记l - 图63printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E7%9B%96%E9%A5%AD%22%20%22#card=math&code=ChaoFanYiDianNum%2A10%5D%3B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20GaiFan%29printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E7%9B%96%E9%A5%AD%22%20%22&height=20.919540229885058&width=346.7816091954023){GaiFanYiDianNum}份” “笔记l - 图64GaiFanYiDianNum_10]元”;let Total+=笔记l - 图65GaiFanYiDianNum_10];;
BanFan)printf “%-12s\t%-10s%-10s\n” “拌饭” “笔记l - 图66[笔记l - 图67[笔记l - 图68printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E7%82%92%E9%9D%A2%22%20%22#card=math&code=BanFanYiDianNum%2A12%5D%3B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ChaoMian%29printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E7%82%92%E9%9D%A2%22%20%22&height=20.919540229885058&width=361.264367816092){ChaoMianYiDianNum}份” “笔记l - 图69ChaoMianYiDianNum_10]元”;let Total+=笔记l - 图70ChaoMianYiDianNum_10];;
ReGanMian)printf “%-12s\t%-10s%-10s\n” “热干面” “笔记l - 图71[笔记l - 图72[笔记l - 图73printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E7%83%A9%E9%9D%A2%22%20%22#card=math&code=ReGanMianYiDianNum%2A9%5D%3B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HuiMian%29printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E7%83%A9%E9%9D%A2%22%20%22&height=20.919540229885058&width=375.7471264367816){HuiMianYiDianNum}份” “笔记l - 图74HuiMianYiDianNum_15]元”;let Total+=笔记l - 图75HuiMianYiDianNum_15];;
XiaoMian)printf “%-12s\t%-10s%-10s\n” “重庆小面” “笔记l - 图76[笔记l - 图77[笔记l - 图78printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E7%8C%AA%E8%82%89%E5%A4%A7%E8%91%B1%22%20%22#card=math&code=XiaoMianYiDianNum%2A9%5D%3B%3B%0A%20%20%20%20%20%20%20%20%20%20%20ZhuRouDaCong%29printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E7%8C%AA%E8%82%89%E5%A4%A7%E8%91%B1%22%20%22&height=20.919540229885058&width=411.14942528735634){ZhuRouDaCongYiDianNum}份” “笔记l - 图79ZhuRouDaCongYiDianNum_18]元”;let Total+=笔记l - 图80ZhuRouDaCongYiDianNum_18];;
SuSanXian)printf “%-12s\t%-10s%-10s\n” “素三鲜” “笔记l - 图81[笔记l - 图82[笔记l - 图83printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E9%9F%AD%E8%8F%9C%E9%B8%A1%E8%9B%8B%22%20%22#card=math&code=SuSanXianYiDianNum%2A15%5D%3B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20JiuCaiJiDan%29printf%20%22%25-12s%5Ct%25-10s%25-10s%5Cn%22%20%22%E9%9F%AD%E8%8F%9C%E9%B8%A1%E8%9B%8B%22%20%22&height=20.919540229885058&width=408.7356321839081){JiuCaiJiDanYiDianNum}份” “笔记l - 图84JiuCaiJiDanYiDianNum_18]元”;let Total+=笔记l - 图85JiuCaiJiDanYiDianNum_18];;
esac
fi
done
if [ -z $Total ];then
echo “欢迎下次惠顾”
exit 1
fi
echo “总计 ${Total}元”
if [ ${Total} -ge 60 ];then
echo “折后 笔记l - 图86Total*8/10]元”
fi
exit 0

2.编写服务脚本/root/bin/testsrv.sh,完成如下要求
(1) 脚本可接受参数:start, stop, restart, status
(2) 如果参数非此四者之一,提示使用格式后报错退出
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
考虑:如果事先已经启动过一次,该如何处理?
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
考虑:如果事先已然停止过了,该如何处理?
(5) 如是restart,则先stop, 再start
考虑:如果本来没有start,如何处理?
(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is running…”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped…”
其中:SCRIPT_NAME为当前脚本名

  1. 编写脚本/root/bin/copycmd.sh
    (1) 提示用户输入一个可执行命令名称
    (2) 获取此命令所依赖到的所有库文件列表
    (3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下;如:/bin/bash > /mnt/sysroot/bin/bash
    /usr/bin/passwd> /mnt/sysroot/usr/bin/passwd
    (4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下:如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
    (5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit退出

编写函数实现两个数字做为参数,返回最大值

  1. 斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)

6.选作
汉诺塔(又称河内塔)问题是源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,利用函数,实现N片盘的汉诺塔的移动步骤

数组

数组的赋值
1.
title[0]=boss
title[1]=ceo
title[2]=coo
title[3]=cto

2.name=(liubei guanyu zhangfei zhaoyun)
digit=({1..10})
name=($(cat test.txt))
3.course=([0]=linux [2]=python [5]=java)

  1. read -a mean
    lamian niuroumian huimian reganmian

向数组中增加值
testshuzu[${#testshuzu[*]}]=caocao

练习:写一个脚本会生成一个名为digit的数组,其中包含10个随机数(用$RANDOM生成),显示数组所有值 ,最大值,最小值。

!/bin/bash

declare -i min max
declare -a digit
for ((i=0;i<10;i++));do
digit[笔记l - 图87RANDOM
[ {digit[0]} && max=${digit[0]} && continue
[ i]} -gt {digit[$i]} && continue
[ i]} -lt {digit[$i]}
done
echo All digit are ${digit[*]}
echo Max is $max
echo Min is $min

练习:编写脚本,定义一个数组,数组中的元素是/var/log/目录下所有以.log结尾的文件,统计其下标为偶数的文件的行数之和

[root@centos6 ~]# filename=(/root/.sh)
[root@centos6 ~]# echo ${filename[
]}
/root/chess.sh /root/f1.sh /root/jiecheng.sh /root/suiji.sh /root/testfun.sh

!/bin/bash

filename=(/var/log/.log)
s=${#filename[
]}

echo $s

for n in seq 1 $s;do
if [ 笔记l - 图88[$n-1]%2] -eq 0 ];then
s2=cat ${filename[$[$n-1]]} |wc -l
let sum+=s2
echo [$n-1]]}
fi
done
echo $sum

练习:
1、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序

0
1
2
10
200

echo 笔记l - 图89{num[1]}
num[1]={num[2]}
num[2]=$n

-5 -20 5 100 200

5 1 6 2 10 3 20 0

1 5 2 6 3 10 0 20
1 2 5 3 6 0 10 20
1 2 3 5 0 6

5 4 3 2 1 4

4 3 2 1 5 3

3 2 1 4 5 2

  1. 1

!/bin/bash

quit() {
if [[ $1 =~ [Qq][Uu][Ii][Tt]|[Qq] ]];then
exit 0
fi
}

read -p “请输入数字: “ -a num
quit $num
for x in ${num[*]};do
if [[ 笔记l - 图90 ]];then
true
else
echo “请输入正确数字” 1>&2
exit 1
fi
done

while true;do
for ((i=0;i<{#num[]}-1;j++));do
if [ ${num[j]} -gt 笔记l - 图91{num[j]}
num[j]=笔记l - 图92n
fi
done
done
echo ${num[
]}
read -p “是否要继续输入数字进行冒泡,若输入quit则退出: “ num1
quit $num1
if [[ 笔记l - 图93 ]];then
true
else
echo “请输入正确数字” 1>&2
exit 2
fi
num[num1
done

declare [选项] 变量名
-r 声明或显示只读变量
-i 将变量定义为整型数
-a 将变量定义为数组
-A 将变量定义为关联数组
-f 显示此脚本前定义过的所有函数名及其内容
-F 仅显示此脚本前定义过的所有函数名
-x 声明或显示环境变量和函数
-l 声明变量为小写字母declare –l var=UPPER
-u 声明变量为大写字母declare –u var=lower

mktemp命令:创建并显示临时文件,可避免冲突

mktemp[OPTION]… [TEMPLATE]
TEMPLATE: filename.XXX
X至少要出现三个

OPTION:
-d: 创建临时目录
-p DIR或—tmpdir=DIR:指明临时文件所存放目录位置

示例:
mktemp/tmp/test.XXX
tmpdir=mktemp–d /tmp/testdir.XXX
mktemp—tmpdir=/testdirtest.XXXXXX

xshell
ssh server ssh(secure shell) windows +xshell (ssh client)

expect

!/bin/bash

user=root
password=centos
for ip in $(cat /root/bin/iplist.txt);do
expect << EOF
spawn ssh 笔记l - 图94ip
expect {
“yes/no” { send “yes\n”;exp_continue }
“password” { send “$password\n”}
}
expect “]#” { send “touch /app/daociyiyou\n” }
send “exit\n”
expect eof
EOF
done

作业:
一.将下图所示,实现转置矩阵matrix.sh
1 2 3 1 4 7
4 5 6 ===> 2 5 8
7 8 9 3 6 9

二.写一个创建用户的脚本,要求如下
1.执行时会询问,请输入要创建的用户名称(当用户超时8秒不输入,提示超时并退出),脚本会检测用户名是否已经存在,若已存在,则提示用户已存在,是否要为其设置密码,如否,则继续回到第1步,询问用户另一个用户名。如是,进入第3步。
2.如第1步完成,则会创建指定用户,然后脚本继续问用户是否为新用户设置密码,如否,则返回第1步继续创建其他用户,如是,则进入第3步
3.为用户设置密码,要求密码要验证2次,2次一致才可通过。同时密码要满足复杂性要求,要求如下:
密码至少8个字符长度,密码必须包含 大写,小写字母,数字,和#@!,._ 这之中的三种字符。 如不满足,则提示用户密码太短或太简单,返回第3步。
且密码不能是 /usr/share/dict/words 已存在的字符,或是,则提示用户密码是个常见单词,然后返回第3步。
用户只能尝试设置新密码3次,若超过3次仍然没有设置出满足要求的密码,则直接返回第1步。
4.在任何步骤,只要输入exit均可退出脚本。

三.
编写一个录入个人信息的脚本/root/bin/information.sh,要求如下:
1.提示用户输入username(需对名字进行字符要求检查,用户名中不能模糊包含系统中任何一个已在存在用户名,如不能为helloroot1,123bin,ggntp2等。且要求username要以大写字母开头,长度至少5个字符。
2.提示用户输入性别,仅能输入male或female,输入其他的提示用户重试。
3.提示用户输入生日,格式必须为yyyy-mm-dd,并对日期的合法性进行检查,若输入2018-02-30等与现实不符的日期,则提示日期错误,请重试。
4.提示用户输入手机号,长度仅能11位,且务必以13x,18x,15x,17x开头,若错误则提示用户重新输入。
5.提示用户输入身份证号,长度可为18位,格式前17位均为数字。要求第7位至第14位所填的内容与第3步的生日符合。同时要求第17位所填的数字若为奇数,那么第2位所填写的性别应为male,反之偶数应为female。最后1位可为数字或x。
6.将以上输入的信息以:为分隔符,保存至/root/info.txt中,每次输入一个用户,会向下追加一行。
如Zhangsan:male:1999-12-20:13588291219:4101011999122030051

四.
利用第三题的脚本,输入20个用户信息。
编写一个抽奖系统的脚本 ,可对/root/info.txt文件中的手机号进行随机抽奖,将中奖的手机号打印出来,要求第4-7位显示为*,即1351219

第十九天

ps axo %cpu,%mem,comm
显示cpu占用率最高的前10个进程
ps axo %cpu,%mem,comm |grep -v CPU |sort -rn
ps axo pid,%cpu,%mem,comm k -%cpu |head -11

BSD格式的常用组合 aux

UNIX格式常用组合 -ef

-20 19

realtime = rt

ps axl pri(new)
PRI(new)=PRI(OLD 20) + NICE

pidof 进程名 指定进程名,查出进程号PID

*nice

  1. 已运行的进程:renice -n XX(-20~19) PID
  2. 未运行的进程:nice -n command

*pgrep
pgrep -u liubei
pgrep -g testgrp
pgrep -lu liubei -t pts/1
pgrep -P 8000

uptime

top
P 按cpu占用率排序
M 按mem占用率排序
s 修改刷新间隔
k 杀死指定进程

vmstat [M] [N]
M 表示刷新间隔时间
N 表示刷新次数 ,若不指定,则一直刷新,直到手动停止ctrl+c

iostat [M] [N]

glances 通过epel源安装

*kill pid

  1. -1 通过进程重读配置文件 (不是所有服务都支持) vsftpd
  2. -2 中断进程
  3. -15 正常退出一个进程,通知进程,正常结束 (默认)
  4. -9 强制杀死一个进程

*killall command

  1. -sig

*pkill
pkill -u liubei
pkill -g testgrp
pkill -u liubei -t pts/1
pkill -P 8000

* 作业管理

使运行的进程不属于终端的子进程的方法
一、( command & )
一旦关闭终端,进程持续运行,但输出结果不再显示
二、nohup command &
一旦关闭终端,进程持续运行,输出结果持续追加至nohup.out

三、screen
screen -S 会话名,如不使用-S 指定会话名,则默认生成格式为终端名-主机名前缀
screen -r 会话名, 恢复会话
screen -d 会话名,分离会话
screen -x 会话名,加入会话,可以允许多个终端加入同一个会话,以实现同屏

jobs 仅显示属于当前终端且被Stop或放入后台的进程
fg 把jobs当中的stoped或放入后台的进程放入前台
bg 放入后台

fg # 或 bg #

* 同时运行多个进程,提高效率

  1. 方法1
  2. vi all.sh
  3. f1.sh&
  4. f2.sh&
  5. f3.sh&
  6. 方法2
  7. (f1.sh&);(f2.sh&);(f3.sh&)
  8. 方法3
  9. { f1.sh& f2.sh& f3.sh& }
  • 计划任务

at
at HH:MM [yyyy-mm-dd]
at -l = atq 列出at列表
at -d NUM = atrm NUM 删除指定的at任务
at -c NUM 查看指定at任务的详细信息

  1. at的数据存放在/var/spool/at/下 如需要修改at ,只能直接修改文件
  2. /etc/at.deny 写入该文件的用户不能配置at
  3. /etc/at.allow 默认不存在,不存在时,deny文件有效,当allow存在,deny失效,只有写入allow的用户才能配置at

crontab

系统级计划任务 只能由root配置
cronie
/etc/crontab
/etc/cron.d/ 配置文件目录
/etc/cron.d/0hourly
01 root run-parts /etc/cron.hourly
/etc/cron.hourly/ 脚本
cronie-anacron
/etc/anacrontab
1 5 cron.daily nice run-parts /etc/cron.daily
/etc/cron.daily/脚本
7 25 cron.weekly nice run-parts /etc/cron.weekly
/etc/cron.weekly/脚本
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly /etc/cron.monthly/脚本

用户级计划任务
crontab

用户cron:

crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
crontab命令:
crontab[-u user] [-l | -r | -e] [-i]
-l: 列出所有任务;
-e: 编辑任务;
-r: 移除所有任务;
-i:同-r一同使用,以交互式模式移除指定任务
-u user: 仅root可运行,指定用户管理cron任务

控制用户执行计划任务:
/etc/cron.{allow,deny}
/etc/cron.deny 写入该文件的用户不能配置cron
/etc/cron.allow 默认不存在,不存在时,deny文件有效,当allow存在,deny失效,只有写入allow的用户才能配置cron。

Create at time crontab -e
List at -l crontab -l
Details at -c jobnum N/A
Remove at -d jobnum crontab -r
Edit N/A crontab -e

练习:配置一个计划任务,每分钟给root发一封邮件,标题为diskusage report at 当前时间, 内容为当前时间点磁盘空间的使用率最高的前2个分区,及其磁盘占用比。

!/bin/bash

1.
[root@centos6 ~]# vim /app/disk.sh
df |sed -rn ‘//dev/sd/s/(/dev/sda.).[:space:]./\1 \2/p’ |sort -t “ “ -k2 -rn |head -2 |mail -s “diskusage report at $(date “+%F %T”)” root

chmod +x /app/disk.sh

  1. [root@centos6 ~]# crontab -e
    /1 * /app/disk.sh

作业:
1、每天的2点和12点整,将/etc备份至/testdir/backup目录中,保存的文件名称格式为“etcbak-yyyy-mm-dd-HH.tar.xz”
2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
朝9晚5 周一到周五

第二十天

GNU

GPL

Hurd

追求完美

pubwin

作业
1: 删除rhel5或rhel6 的/boot/grub/grub.conf文件,并恢复,确定在启动时不需要人工交互就能正常启动系统.

2: 在rhel5或rhel6 上破解root密码

第二十一天

RHEL5启动流程

1.POST自检
2.BIOS把启动交给第一启动项—> 硬盘
3.MBR(Boot Loader 446字节 + 16*4 + 55aa 2字符)
4.Boot Loader
linux loader = lilo
GRUB
windows loader
作用:
1.提供启动菜单
2.加载内核
3.将引导转交给其他的Boot Loader

  1. windowslinux双系统实现:mbr中的Boot Loader一定要为grub
  2. stage1 446字节 基本引导功能 ,如判断启动分区的文件系统类型
  3. stage1.5 centos6:e2fs_stage1_5 centos7: xfs_stage1_5
  4. stage2 加载grub.conf 启动内核
  5. int 13 中断
  6. 自定义grub启动图片:
  7. yum -y install ImageMagick
  8. convert -resize 640x480 -colors 14 bird.jpg bird.xpm
  9. gzip bird.xpm
  10. 修改grub.conf
  11. splashimage=(hd0,0)/grub/bird.xpm.gz

5.启动init
/etc/inittab
runlevel 查看当前的init运行级别
/etc/rc.d/rc.sysinit
/etc/fstab
/etc/sysctl.conf
/etc/mdadm.conf

  1. service daemon-name start 启动服务
  2. stop 关闭服务
  3. restart 重启服务(先关闭,再启动)
  4. status 查看服务的状态
  5. reload 重读服务的配置文件,并不是每个服务都有
  6. /etc/init.d/daemon-name start/stop
  7. /etc/rc.d/init.d/daemon-name start/stop
  8. chkconfig daemon-name on 使服务在指定级别自启动
  9. off 使服务在指定级别默认关闭
  10. chkconfig --level 35 vsftpd on/off 使服务在35级别自启动或关闭
  11. chkconfig --add new-daemon
  12. #chkconfig xx xx
  13. #description: xxxxxxxx
  14. chkconfig --del new-daemon

实验1: 删除/boot/grub/下除了grub.conf外的其他文件
结果:正常启动

实验2: dd if=/dev/zero of=/dev/sda bs=1 count=446 清空stage1
结果:无法启动,直接进入了光盘引导

  1. 处理方法:进入rescue
  2. centos5:linux rescue
  3. centos6,7 在菜单用选择
  4. chroot /mnt/sysimage
  5. grub-install /dev/sda
  6. exit
  7. exit

实验3: dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512
破坏stage1.5
恢复:进入Rescue后并进行chroot
grub
root(hd0,0)
setup (hd0) 该步骤需要/boot/grub下的Stage1,Stage1.5,Stage2,如不存在,只能通过grub-install重装

stage1 mbr前446字节 /boot/grub/stage1
stage1.5 mbr后10240字节 /boot/grub/e2fs_stage_1_5
stage2

grub加密方法

default=0
timeout=5
password —encrypted 笔记l - 图95FFsretEQSSdkkQ1j$zG2.RpizmVOyMhbxgFcq3vn060F1QDyYmkP0q2xPZICgr6sNZlQ71seuBHS23JN0bjf70JxvuqpXjy3g1ePwe.
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=234f756b-b613-425b-af46-269c7cafd100 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img

password可以明文如
password magedu
也可以用md5加密,用grub-md5-crypt生成密码后,如
password —md5 笔记l - 图96N.uAy/$J.vM7bcjk5lS6olhU0Ets0
还可以用sha512加密,用grub-crypt后,如
password —encrypted 笔记l - 图97FFsretEQSSdkkQ1j$zG2.RpizmVOyMhbxgFcq3vn060F1QDyYmkP0q2xPZICgr6sNZlQ71seuBHS23JN0bjf70JxvuqpXjy3g1ePwe.

  1. password加在第一个title之前,是加密grub菜单
  2. password加在某一个title之中,是加密这个title,使在起引导加载内核时,提示输入密码.

实验4: 删除/boot/grub下的所有文件,并恢复,使启动时,没有任何人工干预能正常启动.

RHEL6启动流程

1.POST自检
2.BIOS把启动交给第一启动项—> 硬盘
3.MBR(Boot Loader 446字节 + 16*4 + 55aa 2字符)
4.Boot Loader
linux loader = lilo
GRUB
windows loader
作用:
1.提供启动菜单
2.加载内核
3.将引导转交给其他的Boot Loader

  1. windowslinux双系统实现:mbr中的Boot Loader一定要为grub
  2. stage1 446字节 基本引导功能 ,如判断启动分区的文件系统类型
  3. stage1.5 centos6:e2fs_stage1_5 centos7: xfs_stage1_5
  4. stage2 加载grub.conf 启动内核

5.启动init

  1. /etc/init/rcS.conf
  2. /etc/rc.d/sysinit
  3. /etc/fstab
  4. /etc/sysctl.conf
  5. /etc/mdadm.conf
  6. /etc/init/rc.conf
  7. /etc/rc.d/rc $runlevel
  8. /etc/rc.d/rcX.d/K... S...
  9. /etc/rc.d/rc.local
  10. /etc/init/tty.conf

生成initrd的方法
mkinitrd /boot/initrd-$(uname -r).img 笔记l - 图98%0A%09mkinitrd%20%2Fboot%2Finitramfs-#card=math&code=%28uname%20-r%29%0A%09mkinitrd%20%2Fboot%2Finitramfs-&height=20.919540229885058&width=296.0919540229885)(uname -r).img $(uname -r)

实验5:删除/boot下的所有文件,并恢复

  1. 1.resuce,并chroot
  2. 2.grub-install /dev/sda
  3. 3.mount /dev/cdrom /media
  4. cp /media/isolinux/vmlinux /boot
  5. mkinitrd /boot/initrd-$(uname -r).img $(uname -r)
  6. 4.vim /boot/grub/grub.conf
  7. default=0
  8. timeout=5
  9. title Centos 6.9
  10. root (hd0,0)
  11. kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=234f756b-b613-425b-af46-269c7cafd100 rhgb quiet
  12. initrd /initramfs-2.6.32-696.el6.x86_64.img

实验6:删除/etc/fstab 及/boot下的所有文件
1.进入rescue
2.mount /dev/sda2 /mnt/sysimage
3.blkid >> /mnt/sysimage/etc/fstab
chroot /mnt/sysimage
vim /etc/fstab
UUID=234f756b-b613-425b-af46-269c7cafd100 / ext4 defaults 0 1
UUID=e057a71b-a3c9-4758-8f39-61352a7133ad /boot ext4 defaults 0 2
UUID=a1f1baad-2dda-4873-9ff8-da9e090c5930 /app ext4 defaults 0 0
UUID=44582fb3-67e4-4b28-b4d3-41fce6fb00d4 swap swap defaults 0 0
4.重启,再次进入rescue,后chroot,grub -install /dev/sda
5.mount /dev/cdrom /media
6.rpm -ivh /media/Packages/kernel-2.6.32-696.el6.x86_64.rpm —force
7.vim /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/bird.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=234f756b-b613-425b-af46-269c7cafd100 rhgb quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img

实验7:删除/etc/fstab /etc/inittab(centos6 /etc/init/rcS.conf) /etc/rc.d/rc.sysinit /boot

  1. 1.进入rescue
  2. 2.mount /dev/sda2 /mnt/sysimage
  3. 3.blkid >> /mnt/sysimage/etc/fstab
  4. chroot /mnt/sysimage
  5. vim /etc/fstab
  6. UUID=234f756b-b613-425b-af46-269c7cafd100 / ext4 defaults 0 1
  7. UUID=e057a71b-a3c9-4758-8f39-61352a7133ad /boot ext4 defaults 0 2
  8. UUID=a1f1baad-2dda-4873-9ff8-da9e090c5930 /app ext4 defaults 0 0
  9. UUID=44582fb3-67e4-4b28-b4d3-41fce6fb00d4 swap swap defaults 0 0
  10. 4.重启,再次进入rescue,后chroot,grub -install /dev/sda
  11. 5.mount /dev/cdrom /media
  12. 6.rpm -ivh /media/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force
  13. 7.vim /boot/grub/grub.conf
  14. default=0
  15. timeout=5
  16. splashimage=(hd0,0)/grub/bird.xpm.gz
  17. hiddenmenu
  18. title CentOS 6 (2.6.32-696.el6.x86_64)
  19. root (hd0,0)
  20. kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=234f756b-b613-425b-af46-269c7cafd100 rhgb quiet
  21. initrd /initramfs-2.6.32-696.el6.x86_64.img
  22. 8.rpm -qf /etc/init/rcS.conf
  23. rpm -qf /etc/rc.d/rc.sysinit
  24. cd /app
  25. cp /media/Packages/initscripts-9.03.58-1.el6.centos.x86_64.rpm /app/
  26. rpm2cpio initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id
  27. cp etc/init/rcS.conf /etc/init
  28. cp etc/rc.d/rc.sysinit /etc/rc.d

实验8:删除/etc 恢复

  1. 1.找个正常在同版本机器把etc打包 tar jcvf etc.tar.bz2 /etc
  2. 2.部署一个vsftpd服务 yum -y install vsftpd ;service vsftpd start ; mv etc.tar.bz2 /var/ftp/pub
  3. 3.在问题机器 lftp ....
  4. 4.tar xvf etc.tar.bz2
  5. 5.恢复/etc/fstab
  6. 6.恢复网卡配置文件

第二十二天

Sys V /etc/init.d service daemon-name start chkconfig daemon on
sshd vsftpd httpd xinetd

Xinetd
telnet tftp

chkconfig xinetd类型的服务 on
作用是修改/etc/xinetd.d/下某个服务的配置文件,将disable=yes改为no并重启/etc/init.d/xinetd服务使之生效。
chkconfig sysV on
作用是修改/etc/rc.d/rcX.d下的K..改为 S..使之默认在2345级别自启动。

自制Linux

1.硬盘
虚拟机中操作
2.让新增的硬盘被识别
[root@centos6(nanyibo) ~]# echo ‘- - -‘ > /sys/class/scsi_host/host0/scan
3.分区
/boot
/
swap

  1. fdisk /dev/sdb

4.格式化并挂载
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb3
mkswap /dev/sdb2

  1. [root@centos6(nanyibo) ~]# mkdir /mnt/sysimage
  2. [root@centos6(nanyibo) ~]# mount /dev/sdb3 /mnt/sysimage/
  3. [root@centos6(nanyibo) ~]# mkdir /mnt/sysimage/boot
  4. [root@centos6(nanyibo) ~]# mount /dev/sdb1 /mnt/sysimage/boot/

5.安装grub、内核、ramdisk文件
[root@centos6(nanyibo) ~]# grub-install —root-directory=/mnt/sysimage /dev/sdb
[root@centos6(nanyibo) ~]# cp /boot/vmlinuz-2.6.32-696.el6.x86_64 /mnt/sysimage/boot/
[root@centos6(nanyibo) ~]# cp /boot/initramfs-2.6.32-696.el6.x86_64.img /mnt/sysimage/boot/

6.编写grub.conf
default=0
timeout=5
title CentOS 6 Custom (2.6.32-696.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=46e387c1-f2be-4caa-b864-7d3a09f23b30 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-696.el6.x86_64.img

7.拷贝程序和对应库文件

vim copycmd.sh

!/bin/bash

copy_cmd() {
local cmd_destdir=笔记l - 图99(dirname $(which $1))
if [ ! -d $cmd_destdir ];then
mkdir -pv $cmd_destdir
fi
cp -v $(which $1) $cmd_destdir
}

copy_libfile() {
ldd $(which 笔记l - 图100%20%7Cgrep%20-oE%20%22%2F.*%20%22%20%7C%20while%20read%20libfile%0A%20%20%20%20%20%20%20%20do%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20local%20lib_destdir%3D#card=math&code=1%29%20%7Cgrep%20-oE%20%22%2F.%2A%20%22%20%7C%20while%20read%20libfile%0A%20%20%20%20%20%20%20%20do%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20local%20lib_destdir%3D&height=20.919540229885058&width=416.7816091954023)destdir$(dirname 笔记l - 图101%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20local%20lib_destfile%3D#card=math&code=libfile%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20local%20lib_destfile%3D&height=20.919540229885058&width=180.22988505747128)destdir$libfile
if [ -e $lib_destfile ];then
continue
elif [ -d $lib_destdir ];then
cp -v $libfile $lib_destdir
else
mkdir -pv $lib_destdir
cp -v $libfile $lib_destdir
fi
done
}

destdir=/mnt/sysimage

if [ ! -d $destdir ];then
mkdir cmd” == quit ];then
exit
fi
which $cmd &> /dev/null || { echo $cmd not exist;continue; }
copy_cmd $cmd
copy_libfile $cmd
done

chmod +x copycmd.sh
./copycmd.sh 复制以下命令

  1. bash ls ifconfig ping hostname cat vi mount umount ps pstree mv touch cp insmod modprobe

8.拷贝一些需要的模块,比如网卡模块 e1000.ko
cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysimage/lib64/

9.创建根下的一级目录
mkdir {etc,dev,proc,sys,home,var,mnt,media,root,tmp,lib}

10.关掉旧系统,创建新的虚拟机,并使用已有的新建硬盘。启动

11.insmod /lib64/e1000.ko
12.ifconfig eth0 172.18.0.111/16
13.ping -c1 172.18.0.1

如果希望开机直接可以激活网卡。则把grub.conf中的init=/bin/bash替换为一个脚本,在脚本中编写所有需要的自启动项目。最后一行要为/bin/bash

/proc
内核参数
/etc/sysctl.conf
net.ipv4.ip_forward = 1 ip转发
/proc/sys/net/ipv4/ip_forward
net.ipv4.icmp_echo_ignore_all = 1 忽略ping
/proc/sys/net/ipv4/icmp_echo_ignore_all
sysctl -w vm.drop_caches=1
echo 1 > /proc/sys/vm/drop_caches

  1. hostname
  2. /proc/sys/kernel/hostname
  3. lscpu
  4. /proc/cpuinfo
  5. free
  6. /proc/meminfo
  7. fdisk/parted/gdisk
  8. /proc/partitions
  9. mount
  10. /proc/mounts

编译内核
1.下载内核 http://www.kernel.org linux-4.15.13.tar.xz
[root@centos6(nanyibo) ~]# tar xvf linux-4.15.13.tar.xz -C /usr/local/src/
[root@centos6(nanyibo) ~]# cp /boot/config-2.6.32-696.el6.x86_64 /usr/local/src/linux-4.15.13/.config

2.安装编辑时所需的要包
[root@centos6(nanyibo) linux-4.15.13]# yum -y groupinstall “Development Tools”
[root@centos6(nanyibo) linux-4.15.13]# yum -y install ncurses-devel
[root@centos6(nanyibo) linux-4.15.13]# yum -y install elfutils-libelf-devel
[root@centos6(nanyibo) linux-4.15.13]# yum -y install openssl-devel
3.make menuconfig
[root@centos6(nanyibo) linux-4.15.13]# make -j 8
4.安装内核模块
[root@centos6(nanyibo) linux-4.15.13]# make modules_install

5.安装内核
root@centos6(nanyibo) linux-4.15.13]# make install

模块管理
lsmod 列出已加载的所有模块
modinfo 模块名 列出指定模块的详细信息
modprobe
modprobe 模块名 加载指定的模块 自动在/lib/modules/$(uanmr -r) 目录中寻找指定的模块
modprobe -r 模块名 卸载指定的模块

insmod 模块路径 加载模块
rmmod 卸载模块

SELINUX

  1. setenforce 0|1 警告模式|强制模式
  2. getenforce 查看模式
  3. sestatus 查看Selinux 状态
  4. vim /etc/selinux/config
  5. SELINUX=enforcing
  6. 期望值
  7. yum -y install policycoreutils-python
  8. semanage fcontext -l 列出所有已设定的期望值
  9. semanage fcontext -l |grep '/var/www' 查看指定目录的期望值
  10. semanage fcontext -a -t httpd_sys_content_t '/app/website(/.*)?' 为指定目录设定期望值
  11. semanage fcontext -d -t httpd_sys_content_t '/app/website(/.*)?' 删除指定的期望值
  12. 端口号的期望值
  13. semanage port -l |grep http 查看
  14. semanage port -a -t http_port_t -p tcp 9527 增加端口号的期望值
  15. semanage port -d -t http_port_t -p tcp 9527 删除端口号的期望值

boolean
getsebool -a |grep ftp 查看布尔值
allow_ftpd_anon_write —> on
allow_ftpd_full_access —> off
allow_ftpd_use_cifs —> off
allow_ftpd_use_nfs —> off
ftp_home_dir —> off
ftpd_connect_db —> off
ftpd_use_fusefs —> off
ftpd_use_passive_mode —> off
httpd_enable_ftp_server —> off
tftp_anon_write —> off
tftp_use_cifs —> off
tftp_use_nfs —> off

  1. setsebool -P allow_ftpd_anon_write on -P表示永久生效
  2. setsebool -P allow_ftpd_anon_write=1
  3. semanage boolean -l -C 查看已修改过的所有布尔值
  4. 实验:配置vsftpd,实现匿名上传。
  5. 1. yum -y install vsftpd
  6. 2. vim /etc/vsftpd/vsftpd.conf
  7. anon_upload_enable=YES
  8. anon_mkdir_write_enable=YES
  9. service vsftpd restart
  10. 3. setfacl -m u:ftp:rwx /var/ftppub/
  11. 4. chcon -t public_content_rw_t /var/ftp/pub
  12. 5. setsebool -P allow_ftpd_anon_write on
  13. setsebool -P allow_ftpd_anon_write=1
  14. 实验:配置httpd开启用户家目录的访问
  15. 1. yum -y install httpd
  16. 2. vim /etc/httpd/conf.d/userdir.conf
  17. #UserDir disabled
  18. UserDir public_html
  19. 3. systemctl restart httpd
  20. 4. useradd nanyibo
  21. 5. cd ~nanyibo; mkdir public_html; echo hello world > publick_home/index.html
  22. 6. setfacl -m u:apache:x /home/nanyibo/
  23. 7. setsebool -P httpd_enable_homedirs=1
  24. client: curl http://192.168.153.7/~nanyibo/ 注意最后的/

作业:
1、启用SELinux策略并安装httpd服务,改变网站的默认主目录为/website,添加SELinux文件标签规则,使网站可访问
2、修改上述网站的http端口为9527,增加SELinux端口标签,使网站可访问
3、启用相关的SELinux布尔值,使上述网站的用户student的家目录可通过http访问
4、编写脚本selinux.sh,实现开启或禁用SELinux功能
5、编译新内核以实现ntfs的只读访问

第二十三天

awk ‘{print}’ /etc/passwd
echo 1 2 3 |awk ‘{print $1}’
awk ‘BEGIN{print “Hello World”}’
awk ‘BEGIN{print 3*(1+3)}’
awk -F: ‘{print $1”的uid是”$3”,shell是”$7}’ /etc/passwd
df |grep “/dev/sd” |awk ‘{print $5}’ |awk -F% ‘{print $1}’
或df |awk ‘$0~”/dev/sd”{print}’

内置变量
FS:输入字段分隔符
awk -v FS=’:’ ‘{print $1,$3}’ /etc/passwd

OFS:输出字段分隔符
awk -v FS=’:’ -v OFS=’:’ ‘{print $1,$3}’ /etc/passwd

RS:输入的记录分隔符
awk -v FS=”.” -v RS=” “ ‘{print $3}’ f1

ORS:输出的记录分隔符
awk -v FS=”.” -v RS=” “ -v ORS=”#” ‘{print $1}’ f1

NF:字段的数量
awk -F” “ ‘{print NF}’ /etc/fstab

NR:记录号
awk ‘{print NR,$0}’ /etc/fstab

FNR:各文件分别计数,行号
awk ‘{print FNR}’ /etc/fstab /etc/inittab

FILENAME:当前文件名
awk ‘{print FILENAME}’ /etc/fstab

ARGC:命令行参数的个数
awk ‘{print ARGC}’ /etc/fstab /etc/shadow

ARGV:数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[2]}’ /etc/fstab /etc/inittab

打印命令行的最后一个参数
awk ‘BEGIN {print ARGV[ARGC-1]}’ /etc/fstab /etc/inittab /etc/haha hi hello

自定义变量
awk -v test=”hello awk” ‘{print test}’ /etc/fstab
awk -v sex=male ‘{print sex}’ /etc/fstab
awk ‘{sex=”male”;print sex}’ /etc/fstab
awk ‘{sex=”male”;print sex,age;age=20}’

格式化输出
awk -F: ‘{printf “Username:%s UID:%s\n”,$1,$3}’ /etc/passwd

左对齐
awk -F: ‘{printf “Username:%-15s UID:%s\n”,$1,$3}’ /etc/passwd

%d输出十进制整数数字
awk -F: ‘{printf “Username:%-15s UID:%d\n”,$1,$3}’ /etc/passwd
%.f 保留到小数位
awk -F: ‘BEGIN{printf “%.d %.2f\n”,1.73333,3.1111}’

df |awk -v FS=% ‘$0 ~ “/dev/sd” {print NF>=10 {printf “DevName:%-10s Used:%s%%\n”,$1,$5}’

算术表达式
awk ‘BEGIN{print 2^5}’
awk ‘BEGIN{print 5%3}’
awk ‘BEGIN{n=2;print n+=2}’

模式匹配符::是否不匹配

awk ‘$0 ~ “^root” {print $0}’ /etc/passwd
awk -v FS=: ‘$3 == 0 {print $0}’ /etc/passwd

逻辑操作符:与&&,或||,非!

三目表达式 selector?if-true-expression:if-false-expression
awk -v FS=: ‘{$3>=1000?usertype=”Common User”:usertype=”Sys User”;printf “UserName:%-15s Type:%s\n”,$1,usertype}’ /etc/passwd

关系表达式
为非0时,即为真,才处理
为0或为空时,不处理

!0=1 !Num=0 (Num为任意非0的值)

[root@centos6(nanyibo) ~]# awk ‘BEGIN{print i++;print i}’
0
1

[root@centos6(nanyibo) ~]# awk ‘BEGIN{print ++i;print i}’
1
1

awk ‘i++{print i}’ /etc/passwd

awk ‘++i{print i}’ /etc/passwd

行范围
cat /boot/grub/grub.conf |awk ‘/default/,/hidden/‘
cat f1 |awk ‘NR>=2&&NR<=3’

awk -F: ‘BEGIN{printf “%-15s%s\n”,”USER”,”USERID”} {printf “%-15s%s\n”,$1,$3} END{print “End File”}’ /etc/passwd

awk -F: ‘NR==1{print “Hello World”}; {print $1,$3}’ /etc/passwd

打印奇数行
[root@centos6(nanyibo) ~]# seq 10 |awk ‘i=!i’
1
3
5
7
9
[root@centos6(nanyibo) ~]# seq 10 |awk ‘i=!i{print i}’
1
1
1
1
1
打印偶数行
[root@centos6(nanyibo) ~]# seq 10 |awk ‘!(i=!i)’
2
4
6
8
10
打印偶数行
[root@centos6(nanyibo) ~]# seq 10 |awk -v i=1 ‘i=!i’
2
4
6
8
10

awk -v FS=: ‘{$3>=1000?usertype=”Common User”:usertype=”Sys User”;printf “UserName:%-15s Type:%s\n”,$1,usertype}’ /etc/passwd
awk -v FS=: ‘{if($3>=1000){usertype=”Common User”}else{usertype=”Sys User”}printf “UserName:%-15s Type:%s\n”,$1,usertype}’ /etc/passwd

awk -v FS=: ‘{if($3>=1000){usertype=”Common User”}else if($3==0){usertype=”Super User”}else{usertype=”Sys User”}printf “UserName:%-15s Type:%s\n”,$1,usertype}’ /etc/passwd

awk ‘BEGIN{test=100;if(test>=90){print “very good”} else if(test>=60){print “good”}else {print “no pass”}}’

awk -F: ‘BEGIN{printf “%-13s%-3s%5s\n”,”姓名”,”工资”,”等级”}{if($3<300){dengji="low"}else if($3>=300 && $3<600){dengji=”soso”}else {dengji=”high”} {printf “%-15s%-6s%5s\n”,$1,$3,dengji}}’ /etc/passwd

cat /boot/grub/grub.conf |awk ‘/[6]*kernel/{i=1;while(i<=NF){print 笔记l - 图102i);i++}}’

[root@centos6(nanyibo) ~]# echo {1..10} |awk ‘{n=1;while(n<=NF){if($n%2==0){print $n,”oushuo”}else {print $n,”jishu”};n++}}’
1 jishu
2 oushuo
3 jishu
4 oushuo
5 jishu
6 oushuo
7 jishu
8 oushuo
9 jishu
10 oushuo

作业:
mage 100 male
lilin 90 female
yunzhen 85 female
xiaoxiao 45 male

计算男生平均成绩,女生平均成绩,总平均成绩,要求输出结果

姓名 分数 性别
mage 100 male
lilin 90 female
yunzhen 85 female
xiaoxiao 45 male
男生平均成绩:xx
女生平均成绩: xx
总平均成绩: xx

第二十四天

awk ‘/[7]*kernel/{for(i=1;i<=NF;i++){print 笔记l - 图103i)}}’ /boot/grub/grub.conf

从1加到100等于多少?
1.seq -s “+” 1000000 |bc
2.awk BEGIN’{for(i=1;i<=1000000;i++){sum+=i};print sum}’
3.awk BEGIN’{i=1;while(i<=1000000){sum+=i;i++};print sum}’
4.for ((i=1;i<=1000000;i++));do let sum+=i; done;echo $sum

计算1到100 所有奇数之和

[root@centos6 ~]# awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2 0)continue;sum+=i};print sum}’
2500
计算1到100 所有偶数之和
[root@centos6 ~]# awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2 1)continue;sum+=i};print sum}’
2550

仅显示uid为偶数的用户名和其uid
awk -v FS=: ‘{if($3%2!=0) next;print $1,$3}’ /etc/passwd
awk -v FS=: ‘{if($3%2!=0){next} else {print $1,$3}}’ /etc/passwd

数组
awk -F: ‘{line[$7]}END{for(i in line){print i,line[i]}}’ /etc/passwd
awk ‘{line[NF]}END{for(i in state) { print i,state[i]}}’

函数
awk ‘BEGIN{srand();print int(rand()*10000)}’

awk ‘BEGIN{print length(“hello”)

sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s
[root@centos7(nanyibo) ~]# echo “2018:08:29 10:08:30” |awk ‘sub(/:/,”-“,$1)’
2018-08:29 10:08:30

gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容
[root@centos7(nanyibo) ~]# echo “2018:08:29 10:08:30” |awk ‘gsub(/:/,”-“,$1)’
2018-08-29 10:08:30

对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
[root@centos7(nanyibo) ~]# echo “2018:08:29 10:08:30” |awk ‘gsub(/:/,”-“,$0)’
2018-08-29 10-08-30

awk ‘BEGIN{print strftime(“%Y-%m-%d %H:%M:%S”,systime())}’

[root@server Training]# netstat -tan |awk ‘/^tcp>/&& !($5 ~ “*”) {split($5,ip,”:”);count[ip[1]]++}END{for(i in count){print i,count[i]}}’
172.18.254.232 1
172.18.253.114 1
172.18.251.79 1
172.18.250.40 1
172.18.254.218 1
172.18.254.139 2
172.18.0.100 1

[root@centos7(nanyibo) ~]# awk ‘BEGIN{score=100;system(“name=zhangsan;echo $name score is “score )}’
zhangsan score is 100

作业 :
1、统计/etc/fstab文件中每个文件系统类型出现的次数
2、统计/etc/fstab文件中每个单词出现的次数
3、提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
4、解决DOS攻击生产案例:根据web日志或者或者网络连接数,监控当某个IP并发连接数在近5分钟内达到200,即调用防火墙命令封掉对应的IP,监控频率每隔5分钟。防火墙命令为:iptables -A INPUT -s IP -j REJECT

/var/log/httpd/access_log

POST
Boot 启动顺序
硬盘mbr
boot loader(grub stage1)
stage 1.5 xfs_stage_1_5
stage 2 grub2
/boot/grub2/grub.cfg
kernel initramfs
rootfs D ro root=UUI

init upstart systemd

/etc/inittab /etc/init/rcS.conf
/etc/init.d /etc/init.d
/etc/rc.d/rcX.d /etc/rc.d/rcX.d


命令:systemctl COMMAND name.service

启动:service name start ==> systemctl start name.service

停止:service name stop ==> systemctl stop name.service

重启:service name restart ==> systemctl restart name.service

状态:service name status ==> systemctl status name.service

init

init 0关机
init 1单用户
init 2没有nfs的多用户
init 3完整的多用户 multi-user.target
init 4unset
init 5带图型化的多用户
init 6重启

systemd targets

  • default.target /etc/systemd/system/default.target -> 软链接
    systemctl get-default
    systemctl set-default multi-user.target

multi-user.target /usr/lib/systemd/system/multi-user.target
该target要启动的服务 /etc/systemd/system/multi-user.target.wants

graphical.target /usr/lib/systemd/system/graphical.target
该target要启动的服务 /etc/systemd/system/graphical.target.wants
accounts-daemon.service initial-setup-reconfiguration.service rtkit-daemon.service udisks2.service
*
禁止自动和手动启动:
systemctl mask name.service

取消禁止:
systemctl unmask name.service

查看所有已经激活的服务(正在运行的服务):
systemctl list-units —type=service

查看所有服务
systemctl list-units —type service -a

查看所有服务的开机自启状态
systemctl list-unit-files —type service

查看某个target依赖于哪些target
systemctl list-dependencies graphical.target |grep target

重新加载配置
systemctl reload sshd.service

0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target

  • 查看默认target
    systemctl get-default
    设置默认target
    systemctl set-default graphical.target
    切换target
    init 5; initg 3
    systemctl isolate multi-user.taret
    查看当前所运行的target
    runlevel
    who -r
    systemctl list-units —type target

UEFi或BIOS初始化,运行POST开机自检
选择启动设备
引导装载程序, centos7是grub2
加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
加载initramfs驱动模块
加载内核选项
内核初始化,centos7使用systemd代替init
执行initrd.target所有单元,包括挂载/etc/fstab
从initramfs根文件系统切换到磁盘根目录
systemd执行默认target配置,配置文件/etc/systemd/system/default.target

实验:在centos6上编译安装httpd2.2,并配置sys V方式来管理启手动及自启动
1.下载源码 官网,教室的服务器
lftp 172.18.0.1
user thirty-three pass:thirty-three
get files/httpd-2.2.34.tar.bz2
exit
tar xvf httpd-2.2.34.tar.bz2
2.安装Development Tools
3.查看README INSTALL
4../configure —help
./configure —prefix=/app/apache22 —sysconfdir=/etc/apache22
dnf|yum install -y apr-devel apr-util-devel pcre-devel
5.make -j 2
6.make install
7.export PATH=$PATH:/app/apache22/bin 可把这行写入/etc/profile.d/*.sh 之后,再source该文件
8.apachectl start 启动服务
9.vim /app/apache22/htdocs/index.html
10.vim /etc/init.d/httpd

apachectl=/app/apache22/bin/apachectl
httpd=笔记l - 图104{PIDFILE-/var/run/httpd/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd22}

stop() {
echo -n $”Stopping $prog: “
/app/apache22/bin/apachectl stop &> /dev/null
success

}

11.chkconfig —add httpd
12.chkconfig httpd on
13.service httpd start
14.iptables -F
15.浏览器访问

实验:在centos7上编译安装httpd2.4,并配置Systemd方式来管理启手动及自启动
1.下载源码 官网,教室的服务器
lftp 172.18.0.1
user thirty-three pass:thirty-three
get files/httpd-2.4.27.tar.bz2
exit
tar xvf httpd-2.4.27.tar.bz2
2.安装Development Tools
3.查看README INSTALL
4../configure —help
./configure —prefix=/app/apache24 —sysconfdir=/etc/apache24
dnf|yum install -y apr-devel apr-util-devel pcre-devel
5.make -j 4
6.make install
7.export PATH=$PATH:/app/apache24/bin 可把这行写入/etc/profile.d/*.sh 之后,再source该文件
8.apachectl start 启动服务
9.vim /app/apache24/htdocs/index.html
10.vim /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP 2.4 Magedu Server
After=network.target

[Service]
Type=forking
ExecStart=/app/apache24/bin/apachectl start
ExecReload=/app/apache24/bin/httpd -k graceful
ExecStop=/app/apache24/bin/apachectl stop

[Install]
WantedBy=multi-user.target
11.systemctl start httpd
12.systemctl enable httpd
13.iptables -F
14.浏览器访问

在centos7中重置root密码
• 启动时任意键暂停启动
• 按e键进入编辑模式
• 将光标移动linux16开始的行,添加内核参数rd.break
• 按ctrl-x启动
• mount –o remount,rw /sysroot
• chroot /sysroot
• passwd root
• touch /.autorelabel
• exit
• reboot

为编译安装的httpd服务,实现service unit文件
破解centos7 口令
修改默认的启动内核为新编译内核
启动时临时禁用SELinux
启动时进入emergency模式
卸载编译安装的新内核

tcpdump -i eth1 -nn -X port 21
wireshark

telnet -> ssh
ftp -> sftp
pop -> pops
imap -> imaps
http -> https
smtp -> smtps

network file system sun solaris unix unix like 不安全
mahuateng@qq.com dinglei@163.com

  1. pop3s imaps ssl/tls https

smtp.qq.com smtp smtp.163.com

smtps

NFSv2 v3 v4 kerberos

nfs client -> nfS SERVER

nis -> ldaps

rsh -> ssh

活动目录
网络 邮件
http://www.icbc.com.cn/icbc/

第二十五天

对称: 1G的文件 加密后 2G,加密1分钟,解密要8分钟
非对称: 1G的文件 加密后 1G, 加密需4分钟,解密要64小时

md5 hash

2004年8月,在美国的加州 圣芭芭拉 国际密码大会 并没有被安排发言 山东大学 数学教授 王小云

[root@centos7(nanyibo) ~]# find /etc/sysconfig/ -type f -exec sha512sum {} ; > /app/all.log
[root@centos7(nanyibo) ~]# cat /app/all.log

1 2 3 5 7 11 13 17 19 23 29 31 37

Alice: a=5, p=23,x=6 (5^6)%23=8
Bob: a=5, p=23,y=15 (5^15)%23=19

gpg
对称加密
加密:gpg -c test.sh
解密:gpg -o test.sh -d test.sh.gpg

非对称加密
6,7: gpg —gen-key

[root@centos7(nanyibo) ~]# gpg —gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection?
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 1024
Requested keysize is 1024 bits
Please specify how long the key should be valid.
0 = key does not expire
= key expires in n days
w = key expires in n weeks
m = key expires in n months
y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: centos7
Email address:
Comment:
You selected this USER-ID:
“centos7”

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

6:gpg -a —export -o centos6.key 导出公钥

7:gpg —import centos6.key

7:gpg -e -r magedu letter.txt

7:scp letter.txt.gpg root@c6:/root

6:gpg -o xin.txt -d xin.txt.gpg

gpg —delete-keys centos6 删除指定的公钥
gpg —delete-secret-keys centos6 删除指定的私钥

openssl

对称加密:
加密:openssl enc -e -des3 -a -salt -in clear.txt -out clear.enc
解密:openssl enc -d -des3 -a -salt -in clear.enc -out f1.txt

CA中心部署:

根ca

[root@centos7(nanyibo) ~]# cd /etc/pki/CA/
[root@centos7(nanyibo) CA]# touch index.txt
[root@centos7(nanyibo) CA]# echo 00 > serial
[root@centos7(nanyibo) CA]# (umask 066;openssl genrsa -out private/cakey.pem -des3 2048)
[root@centos7(nanyibo) CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7300
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HeNan
Locality Name (eg, city) [Default City]:ZhengZhou
Organization Name (eg, company) [Default Company Ltd]:magedu.com
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server’s hostname) []:ca.magedu.com
Email Address []:

子ca
[root@centos6(nanyibo) ~]# cd /etc/pki/CA/
[root@centos6(nanyibo) CA]# touch index.txt
[root@centos6(nanyibo) CA]# echo 00 > serial
[root@centos6(nanyibo) CA]# (umask 066;openssl genrsa -out private/cakey.pem -des3 2048)
[root@centos6(nanyibo) CA]# openssl req -new -key private/cakey.pem -out subca.csr
[root@centos6(nanyibo) CA]# scp subca.csr root@c7:/etc/pki/CA

根ca
[root@centos7(nanyibo) CA]# openssl ca -in subca.csr -out certs/subca.crt -days 3650
[root@centos7(nanyibo) CA]# scp certs/subca.crt root@c6:/etc/pki/CA/cacert.pem

app
[root@rhel5(nanyibo) ~]# (umask 066;openssl genrsa -out rhel5.key 1024)
[root@rhel5(nanyibo) ~]# openssl req -new -key rhel5.key -out rhel5.csr
[root@rhel5(nanyibo) ~]# scp rhel5.csr root@192.168.153.6:/etc/pki/CA

子ca
[root@centos6(nanyibo) CA]# openssl ca -in rhel5.csr -out certs/rhel5.crt -days 365
[root@centos6(nanyibo) CA]# scp certs/rhel5.crt root@192.168.153.5:/root

https ftps pops

ftps sftp

telnet ftp

ssh

  1. ssh_config
  2. StrictHostKeyChecking ask/no 默认为ask,第一次连接某主机时,寻问yes/no是否接受公钥,如果设置为no,则直接接受,不寻问。

作业:建立CA,并使用另一个主机申请证书,用CA签名

第二十六天

ssh 默认端口 22
ssh username@ip
ssh -l username ip

  1. 192.168.153.7:22

C6:Client -> C7:server

  1. 192.168.0.1/24 172.18.0.2
  2. 172.18.0.1
  3. -b 192.168.153.6 指定客户端的来源地址

A——> C

  1. B---> C

A——>B ——->C

a:172.18.254.128 b:172.18.254.96 c:172.18.254.116

ssh -t root@172.18.254.96 ssh root@172.18.254.116

* ssh使用密钥免密码登录

[root@centos6(nanyibo) ~]# ssh-keygen
[root@centos6(nanyibo) ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.153.7

练习:centos6与centos7的root用户之间,相互ssh连接都不要密码

ssh服务端关闭密码登录
[root@centos6(nanyibo) ~]# vim /etc/ssh/sshd_config
PasswordAuthentication no

scp

scp -p /app/test.txt /etc/passwd root@192.168.153.7:/app/
scp root@192.168.153.6:/app/* /app

rsync

sftp

pssh

  1. 默认没有安装,需要通过epel源安装
  2. yum -y install pssh
  3. pssh -H 192.168.153.7 -H 172.18.254.218 -i hostname 默认通过密钥验证
  4. -A 使用密码验证
  5. pssh -H '192.168.153.7 172.18.254.218' -i hostname
  6. 可以将ip地址写入地址文件/root/ip.txt
  7. 192.168.153.7
  8. 172.18.254.218
  9. pssh -h ip.txt -i 'hostname'
  10. pssh -h ip.txt -o /app/hostout -i "hostname" 保存输出结果到本地

实验:把多个目标的selinux设置为开机默认关闭。
pssh -h ip.txt -i “sed -ri ‘s/(^SELINUX=).*/\1disabled/‘ /etc/selinux/config”

在远程主机执行脚本,则需先将脚本传到远程主机
vim /root/jiaoben.sh
pscp.pssh -h ip.txt /root/jiaoben.sh /app/
pssh -h ip.txt -i ‘/app/jiaoben.sh’

将远程主机的文件拷贝至本地
pslurp -h ip.txt -L /app /etc/passwd .

ssh端口转发

本地端口转发
实验1: c5 c6 c7
c7:client c6:踏板机 c5:server

c5:安装telnet-server
iptables -F
iptables -A INPUT -s 192.168.153.6 -p tcp —dport 23 -j ACCEPT
iptables -A INPUT -p tcp —dport 23 -j REJECT

c7:ssh -L 9527:192.168.153.5:23 -Nf 192.168.153.6
-L 启动本地端口转发
-N 不启用shell
-f 后台
telnet 127.0.0.1 9527

远程端口转发

实验2:smtp转发
c5:client c6:跳板机 c7:server

c7:在目标主机上配置smtp服务
[root@centos7(nanyibo) ~]# vim /etc/postfix/main.cf
inet_interfaces=all
systemctl restart postfix

c6:[root@centos6(nanyibo) ~]# ssh -R 9527:192.168.153.7:25 -fN 192.168.153.5

c5:telnet 127.0.0.1 9527

mail from:xxxx@xxxx.com
rctp to:root@centos7.magedu.com
data
hello world
.
quit

ssh实现科学上网

实验3:动态代理,在centos7上部署http服务,在centos7上写防火墙,禁止物理机192.168.153.1访问centos7上的web服务,但centos6可以访问。目标利用ssh -D 建立通道,再利用sock5 代理访问
C:\Windows\System32\drivers\etc

autoproxy

ssh -fND 1080 root@192.168.153.6

ssh服务端配置文件
/etc/ssh/sshd_config

StrictModes yes 默认为yes,则使用密钥登录时,authorized_keys的权限不能给grout,other写权限,或不能给group,other对该用户家目录的.ssh 目录有wx权限,如果有以上权限,则不能用密钥登录。改为no时,则没有限制。

PubkeyAuthentication yes 是否开启使用密钥登录

GatewayPorts yes 在ssh_config中写,则是在ssh -L时生效
GatewayPorts yes 在sshd_config中写,则是在ssh -R时生效

AllowUsersuser1 user2 user3
DenyUsers
AllowGroups
DenyGroups

作业:写一个计划任务脚本,每分钟检测一下,把连接本机ssh失败次数达10次的IP地址封掉。要求用awk做。

第二十七天

lftp 172.18.0.1:/pub/Sources/sources/dropbear/dropbear-2016.74.tar.bz2
tar xvf dropbear-2016.74.tar.bz2 -C /usr/local/src/
yum -y groupinstall “Development Tools”
yum -y install zlib-devel
./configure —prefix=/app/dropbear —sysconfdir=/etc/dropbear

aide
安装 yum -y install aide
配置 vim /etc/aide.conf
MAGEDU = p+u+g+sha512+m+a+c
/app/ MAGEDU
!/app/f3
生成数据库
aide —init或aide -i
数据库需改名 为/var/lib/aide/aide.db.gz

  1. 完成
  2. 尝试修改数据
  3. aide -C 进行校验不同
  4. aide -u 更新数据库,但不会覆盖原数据文件,需手工改名

sudo
hr,hr2 ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd ?* , !/usr/bin/passwd root

visudo 编辑/etc/sudoers
visudo -f /etc/sudoers.d/xxxx 编辑指定的子配置文件
sudo -V 查看详细信息
sudo -V |grep “timestamp” 获取 时间戳的位置 /var/run/sudo/ts

sudo -v 重新计时时间戳文件,以延长不输入密码的时间
sudo -k 强制下次使用sudo输入密码
sudo -K 直接删除时间戳文件,强制下次使用sudo输入密码
sudo -u testuser command 以指定用户的身份执行命令,默认为root

tcp wrappers

  1. 查看服务是否支持的方法
  2. ldd /PATH/TO/PROGRAM |grep libwrap.so
  3. strings PATH/TO/PROGRAM |grep libwrap.so
  4. at crontab
  5. at.deny at.allow
  6. cron.deny cron.allow
  7. hosts.allow hosts.deny
  8. ftp
  9. vsftpd
  10. vsftp
  11. 查看二进制的服务名
  12. rpm -ql openssh-server |grep bin
  13. vsftpd:ALL:spawn echo "$(date +%%F) login from client\:%a %c to %s %p" >> /app/ftp.log 写到allow表示允许写到deny表示拒绝
  14. vsftpd:ALL:twist echo "Bu Yao lian wo"
  15. 作业:

1,仅开放本机两个IP地址中的一个地址172.18.0.X上绑定的sshd和vsftpd服务给172.16.0.0/16网络中除了172.18.0.0/24网络中的主机之外的所有主机,但允许172.18.0.200访问,每次的用户访问都要记录于日志文件中注:其中X为学号

2.编写脚本/root/bin/checkip.sh,每5分钟检查一次,如果发现通过ssh登录失败次数超过10次,自动将此远程IP放入TcpWrapper的黑名单中予以禁止防问

第二十八天

实验1:pam_shells.so 模块

[root@centos7(nanyibo) ~]# useradd -s /bin/csh zhaoyun
[root@centos7(nanyibo) ~]# sed -i ‘$d’ /etc/shells
[root@centos7(nanyibo) ~]# vim /etc/pam.d/sshd
加到首行
auth required pam_shells.so

也可以将以上行,写入/etc/pam.d/login和/etc/pam.d/su下,使限制登录及su操作

实验2:pam_securetty.so 模块
使可以用root登录telnet
[root@centos7(nanyibo) ~]# vim /etc/securetty
最后加上
pts/X

作业:
1、限制centos用户只能够在工作时间通过ssh远程连接本机
2、限制只有admins组内的用户可ssh到本机

自动化安装.

ks6.cfg

platform=x86, AMD64, or Intel EM64T

version=DEVEL

Firewall configuration

firewall —disabled

Install OS instead of upgrade

install

Use network installation

url —url=”http://172.18.0.1/centos/6

Root password

rootpw —iscrypted 笔记l - 图105K0KV4lW3$cwQIPt3N20VDSdiCgLN0c0

System authorization information

auth —useshadow —passalgo=sha512

Use text mode install

text
firstboot —disable

System keyboard

keyboard us

System language

lang en_US

SELinux configuration

selinux —disabled

Installation logging level

logging —level=info

Reboot after installation

reboot

System timezone

timezone Asia/Shanghai

Network information

network —bootproto=dhcp —device=eth0 —onboot=on

System bootloader configuration

bootloader —location=mbr

Clear the Master Boot Record

zerombr

Partition clearing information

clearpart —all —initlabel

Disk partitioning information

part /boot —fstype=”ext4” —size=500
part / —fstype=”ext4” —size=20480
part /app —fstype=”ext4” —size=10240
part swap —fstype=”swap” —size=2048

  1. %post --interpreter=/bin/bash
  2. rm -rf /etc/yum.repos.d/*
  3. cat > /etc/yum.repos.d/mage.repo <<EOF
  4. [development]
  5. name=Centos 6
  6. baseurl=http://172.18.0.1/centos/6
  7. gpgcheck=0
  8. [epel]
  9. name=Fedora EPEL
  10. baseurl=http://172.18.0.1/fedora-epel/6/x86_64
  11. gpgcheck=0
  12. EOF
  13. cat > /etc/profile.d/mage.sh << 'EOF'
  14. export PS1="[\[\e[32m\]\u\[\e[36m\]@\h\[\e[31m\](nanyibo)\[\e[0m\] \W]\\$ "
  15. export EDITOR=vim
  16. EOF
  17. yum -y install vsftpd &> /dev/null
  18. cp /etc/passwd /var/ftp/pub
  19. chkconfig vsftpd on
  20. mkdir -m 700 /root/.ssh
  21. cat > /root/.ssh/authorized_keys << 'EOF'
  22. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2ly0GStxnA7/vlbA/h3VvDKwWKroAQJZllqFVxtQ06wA49dZHKKYUbKZScK3AhBFqdrIsI3RKkeT9sOsHC8oODIlN8K6ynkhNIGErIHJi8AcYG/8NR4AtFs9N+dlWsm+xh4FzQPZ/Sa0dPQpVQllaXJ93kKkTClZkuEBSV2EEFit/eMiOKTrBotuIrIP7ugw4b3evIwJI6lKroiZIKVHrIUUMOUJlERYd1BxfAtaj4c8nCoEAK5FMmzVRsZPVPmbtaXkmW4g8pZLv0KRcfiyie4m+ugvMf5ty7MVH8N9OgxXbhwSp0EDSRMwVXEp4pf+J1AG2/dFEvB4liHUHr5+1 root@centos7.magedu.com
  23. EOF
  24. %end
  25. %packages
  26. @base
  27. @chinese-support
  28. @internet-browser
  29. -ibus-table-cangjie
  30. -ibus-table-erbi
  31. -ibus-table-wubi
  32. %end

ks7.cfg

platform=x86, AMD64, or Intel EM64T

version=DEVEL

Install OS instead of upgrade

install

Keyboard layouts

keyboard ‘us’

Root password

rootpw —iscrypted 笔记l - 图106anqJJUHU$VI5qLGjC1w30LyuuV/wBw.

Use network installation

url —url=”http://172.18.0.1/centos/7

System language

lang en_US

System authorization information

auth —useshadow —passalgo=sha512

Use text mode install

text

SELinux configuration

selinux —disabled

Do not configure the X Window System

skipx

  1. # Firewall configuration
  2. firewall --disabled
  3. # Network information
  4. network --bootproto=dhcp --device=ens33
  5. # Reboot after installation
  6. reboot
  7. # System timezone
  8. timezone Asia/Shanghai
  9. # System bootloader configuration
  10. bootloader --location=mbr
  11. # Clear the Master Boot Record
  12. zerombr
  13. # Partition clearing information
  14. clearpart --all --initlabel
  15. # Disk partitioning information
  16. part / --fstype="xfs" --size=20480
  17. part /boot --fstype="xfs" --size=500
  18. part swap --fstype="swap" --size=2048
  19. %post --interpreter=/bin/bash
  20. rm -rf /etc/yum.repos.d/*
  21. cat > /etc/yum.repos.d/mage.repo <<EOF
  22. [development]
  23. name=Centos 7
  24. baseurl=http://172.18.0.1/centos/7
  25. gpgcheck=0
  26. [epel]
  27. name=Fedora EPEL
  28. baseurl=http://172.18.0.1/fedora-epel/7/x86_64
  29. gpgcheck=0
  30. EOF
  31. cat > /etc/profile.d/mage.sh << 'EOF'
  32. export PS1="[\[\e[32m\]\u\[\e[36m\]@\h\[\e[31m\](nanyibo)\[\e[0m\] \W]\\$ "
  33. export EDITOR=vim
  34. EOF
  35. yum -y install httpd &> /dev/null
  36. systemctl enable httpd
  37. echo 'Hello World' > /var/www/html/index.html
  38. mkdir -m 700 /root/.ssh
  39. cat > /root/.ssh/authorized_keys << 'EOF'
  40. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2ly0GStxnA7/vlbA/h3VvDKwWKroAQJZllqFVxtQ06wA49dZHKKYUbKZScK3AhBFqdrIsI3RKkeT9sOsHC8oODIlN8K6ynkhNIGErIHJi8AcYG/8NR4AtFs9N+dlWsm+xh4FzQPZ/Sa0dPQpVQllaXJ93kKkTClZkuEBSV2EEFit/eMiOKTrBotuIrIP7ugw4b3evIwJI6lKroiZIKVHrIUUMOUJlERYd1BxfAtaj4c8nCoEAK5FMmzVRsZPVPmbtaXkmW4g8pZLv0KRcfiyie4m+ugvMf5ty7MVH8N9OgxXbhwSp0EDSRMwVXEp4pf+J1AG2/dFEvB4liHUHr5+1 root@centos7.magedu.com
  41. EOF
  42. %end
  43. %packages
  44. @base
  45. @fonts
  46. @gnome-apps
  47. @gnome-desktop
  48. @input-methods
  49. @legacy-x
  50. @x11
  51. %end

part /boot —fstype=”ext4” —size=500
part pv.008002 —grow —size=200
volgroup vgmage —pesize=4096 pv.008002
logvol /app —fstype=ext4 —name=lvapp —vgname=vgmage —size=10240
logvol / —fstype=ext4 —name=lvroot —vgname=vgmage —size=20480
logvol swap —name=lvswap —vgname=vgmage —size=2048

linux ip=172.18.250.111 netmask=255.255.255.0 ks=ftp://172.18.0.1/pub/ks6.cfg

mkisofs -R -J -T -v —no-emul-boot —boot-load-size 4 —boot-info-table -V “CentOS 6.9 x86_64 boot” -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso /app/myiso

自制启动光盘

1.mkdir /app/myiso
2.mount /dev/cdrom /media
3.cp -a /media/isolinux /app/myiso/
4.cd /app/myiso/isolinux
5.vim isolinux.cfg
default vesamenu.c32

prompt 1

timeout 100

  1. display boot.msg
  2. menu background splash.jpg
  3. menu title Welcome to CentOS 6.9 Automatic Install!
  4. menu color border 0 #ffffffff #00000000
  5. menu color sel 7 #ffffffff #ff000000
  6. menu color title 0 #ffffffff #00000000
  7. menu color tabmsg 0 #ffffffff #00000000
  8. menu color unsel 0 #ffffffff #00000000
  9. menu color hotsel 0 #ff000000 #ffffffff
  10. menu color hotkey 7 #ffffffff #ff000000
  11. menu color scrollbar 0 #ffffffff #00000000
  12. label mini
  13. menu label Install an ^Mini system
  14. menu default
  15. kernel vmlinuz
  16. append initrd=initrd.img ks=ftp://172.18.254.96/pub/ks6-mini.cfg
  17. label desktop
  18. menu label Install an ^Desktop system
  19. kernel vmlinuz
  20. append initrd=initrd.img ks=ftp://172.18.254.96/pub/ks6-desktop.cfg
  21. label local
  22. menu label Boot from ^local drive
  23. localboot 0xffff

6.mkisofs -R -J -T -v —no-emul-boot —boot-load-size 4 —boot-info-table -V “CentOS 6.9 x86_64 boot” -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso /app/myiso

7.sz /root/boot.iso

在vmware中将dvd替换为boot.iso 后启动虚拟机

制作自启动u盘

dd if=/root/boot.iso /dev/sdb

制作全功能iso

1.mkdir /app/fulliso
2.mount /dev/cdrom /media/
3.cp -a /media/* /app/fulliso/
4.cp -a /media/.treeinfo /media/.discinfo /app/fulliso/
5.cd /app/fulliso; find -name TRANS.TBL -exec rm -rf {} ;
6.rm -rf repodata ; mkdir repodata
7.cp /media/repodata/43d8fd068164b0f042845474d6a22262798b9f0d1f49ad1bf9f95b953089777d-c6-x86_64-comps.xml repodata/
8.createrepo -g repodata/43d8fd068164b0f042845474d6a22262798b9f0d1f49ad1bf9f95b953089777d-c6-x86_64-comps.xml ./
9.vim ks6-mini.cfg ks6-desktop.cfg 安装源来自cdrom
10.vim /app/fulliso/isolinux/isolinux.cfg

  1. label mini
  2. menu label Install an ^Mini system
  3. menu default
  4. kernel vmlinuz
  5. append initrd=initrd.img ks=cdrom:/ks6-mini.cfg
  6. label desktop
  7. menu label Install an ^Desktop system
  8. kernel vmlinuz
  9. append initrd=initrd.img ks=cdrom:/ks6-desktop.cfg
  10. label local
  11. menu label Boot from ^local drive
  12. localboot 0xffff

11.mkisofs -R -J -T -v —no-emul-boot —boot-load-size 4 —boot-info-table -V “CentOS 6.9 autoinstall” -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/centos6auto.iso /app/fulliso/

12.sz /root/centos6auto.iso

13.在vmware中使用新iso安装

dhcp服务安装

  1. yum -y install dhcp

2.cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf

3.vim /etc/dhcp/dhcpd.conf
subnet 192.168.153.0 netmask 255.255.255.0 {
range 192.168.153.100 192.168.153.199;
option routers 192.168.153.6;
}
4.vim /etc/sysconfig/dhcpd
DHCPDARGS=eth1
5./etc/init.d/dhcpd configtest
6./etc/init.d/dhcpd start
7.ss -unl |grep 67

8.在客户端上测试,注意关闭vmware自身的dhcp服务。 注意,不要用桥接的网卡做dhcp

第二十九天

实验1:在centos6上部署pxe网络安装环境

1.yum -y install dhcp vsftpd tftp

2.cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf

3.vim /etc/dhcp/dhcpd.conf
subnet 192.168.153.0 netmask 255.255.255.0 {
option domain-name “magedu.org”;
option domain-name-servers 192.168.153.6;
range 192.168.153.100 192.168.153.199;
option routers 192.168.153.6;
next-server 192.168.153.6;
filename “pxelinux.0”;

  1. }

4.chkconfig dhcpd on ;service dhcpd start

5.mount /dev/cdrom /var/ftp/pub/dvd

6.system-config-kickstart 生成ks6.cfg并放入/var/ftp/pub/ks6-mini.cfg和ks6-desktop.cfg

7.chkconfig vsftpd on; service vsftpd start

8.chkconfig tftp on; chkconfig xinetd on; service xinetd start

9.cp /media/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot
cp /usr/share/syslinux/{pxelinux.0,menu.c32} /var/lib/tftpboot
mkdir /var/lib/tftpboot/pxelinux.cfg
cp /media/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
vim /var/lib/tftpboot/pxelinux.cfg/default
default menu.c32
label mini
menu label Install Centos 6.9 ^Mini system
menu default
kernel vmlinuz
append initrd=initrd.img ks=ftp://192.168.153.6/pub/ks6-mini.cfg
label desktop
menu label Install Centos 6.9 ^Desktop system
kernel vmlinuz
append initrd=initrd.img ks=ftp://192.168.153.6/pub/ks6-desktop.cfg

实验2:在centos7上部署pxe安装环境

1.关闭防火墙和selinux,静态配置充当dhcp服务器的网卡
[root@centos7(nanyibo) ~]# systemctl disable firewalld.service
[root@centos7(nanyibo) ~]# systemctl stop firewalld.service
[root@centos7(nanyibo) ~]# setenforce 0
[root@centos7(nanyibo) ~]# vim /etc/selinux/config
SELINUX=disabled
[root@centos7(nanyibo) ~]# nmcli connection modify ens34 autoconnect yes ipv4.method manual ipv4.addresses 192.168.153.7/24
[root@centos7(nanyibo) ~]# nmcli connection up ens34

2.安装相关的软件包
[root@centos7(nanyibo) ~]# yum -y install httpd tftp-server dhcp syslinux system-config-kickstart

3.配置文件共享服务httpd和yum源
[root@centos7(nanyibo) ~]# mkdir -p /var/www/html/centos/7
[root@centos7(nanyibo) ~]# mount /dev/cdrom /var/www/html/centos/7
[root@centos7(nanyibo) ~]# systemctl enable httpd
[root@centos7(nanyibo) ~]# systemctl start httpd

4.准备kickstart文件
[root@centos7(nanyibo) ~]# system-config-kickstart 过程略 centos5:base centos7:development
[root@centos7(nanyibo) ~]# mkdir /var/www/html/ks
[root@centos7(nanyibo) ~]# mv ks7-* /var/www/html/ks/
[root@centos7(nanyibo) ~]# ls /var/www/html/ks/
ks7-desktop.cfg ks7-mini.cfg

5.tftp服务
[root@centos7(nanyibo) ~]# systemctl enable tftp.socket
[root@centos7(nanyibo) ~]# systemctl start tftp.socket

6.dhcp服务
[root@centos7(nanyibo) ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
[root@centos7(nanyibo) ~]# vim /etc/dhcp/dhcpd.conf
subnet 192.168.153.0 netmask 255.255.255.0 {
range 192.168.153.100 192.168.153.150;
option domain-name-servers 192.168.153.7;
option domain-name “magedu.com”;
option routers 192.168.153.7;
default-lease-time 600;
max-lease-time 7200;
next-server 192.168.153.7;
filename “pxelinux.0”;
}
[root@centos7(nanyibo) ~]# systemctl start dhcpd
[root@centos7(nanyibo) ~]# systemctl enable dhcpd

7.配置pxe
[root@centos7(nanyibo) ~]# cd /var/lib/tftpboot/
[root@centos7(nanyibo) tftpboot]# cp /usr/share/syslinux/{pxelinux.0,menu.c32} .
[root@centos7(nanyibo) tftpboot]# cp /var/www/html/centos/7/isolinux/{vmlinuz,initrd.img} .
[root@centos7(nanyibo) tftpboot]# mkdir pxelinux.cfg
[root@centos7(nanyibo) tftpboot]# cp /var/www/html/centos/7/isolinux/isolinux.cfg pxelinux.cfg/default
[root@centos7(nanyibo) tftpboot]# vim pxelinux.cfg/default
default menu.c32
timeout 100

  1. menu title CentOS 7.5 PXE Auto Install
  2. label mini
  3. menu label Auto Install CentOS 7 ^Mini
  4. menu default
  5. kernel vmlinuz
  6. append initrd=initrd.img ks=http://192.168.153.7/ks/ks7-mini.cfg
  7. label desktop
  8. menu label Auto Install CentOS 7 ^Desktop
  9. kernel vmlinuz
  10. append initrd=initrd.img ks=http://192.168.153.7/ks/ks7-desktop.cfg
  11. label manual
  12. menu label ^Manual Install CentOS 7 ^Desktop
  13. kernel vmlinuz
  14. append initrd=initrd.img
  15. label local
  16. menu label Boot from ^local drive
  17. localboot 0xffff
  18. menu end

[root@centos7(nanyibo) tftpboot]# tree .
.
├── initrd.img
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│ └── default
└── vmlinuz

实验3:在centos7实现pxe安装centos6和centos7

1.分别准备centos6和centos7的yum源
[root@centos7(nanyibo) ~]# mkdir /var/www/html/centos/6
在vmware上操作,增加一个光驱,并把centos6的iso加载上去
[root@centos7(nanyibo) ~]# echo ‘- - -‘ > /sys/class/scsi_host/host2/scan
[root@centos7(nanyibo) ~]# mount /dev/sr1 /var/www/html/centos/6/

2.准备centos6的kickstart文件
[root@centos7(nanyibo) ks]# ls
ks6-desktop.cfg ks6-mini.cfg ks7-desktop.cfg ks7-mini.cfg

3.拷贝centos6的内核文件
[root@centos7(nanyibo) ~]# cd /var/lib/tftpboot/
[root@centos7(nanyibo) tftpboot]# mkdir centos{6,7}
[root@centos7(nanyibo) tftpboot]# mv vmlinuz initrd.img centos7/
[root@centos7(nanyibo) tftpboot]# cp /var/www/html/centos/6/isolinux/{vmlinuz,initrd.img} centos6/
[root@centos7(nanyibo) tftpboot]# vim pxelinux.cfg/default
default menu.c32
timeout 100

  1. menu title CentOS PXE Auto Install
  2. label mini6
  3. menu label Auto Install CentOS 6 ^Mini
  4. menu default
  5. kernel centos6/vmlinuz
  6. append initrd=centos6/initrd.img ks=http://192.168.153.7/ks/ks6-mini.cfg
  7. label desktop6
  8. menu label Auto Install CentOS 6 ^Desktop
  9. kernel centos6/vmlinuz
  10. append initrd=centos6/initrd.img ks=http://192.168.153.7/ks/ks6-desktop.cfg
  11. label mini7
  12. menu label Auto Install CentOS 7 ^Mini
  13. kernel centos7/vmlinuz
  14. append initrd=centos7/initrd.img ks=http://192.168.153.7/ks/ks7-mini.cfg
  15. label desktop7
  16. menu label Auto Install CentOS 7 ^Desktop
  17. kernel centos7/vmlinuz
  18. append initrd=centos7/initrd.img ks=http://192.168.153.7/ks/ks7-desktop.cfg
  19. label manual6
  20. menu label ^Manual Install CentOS 6 ^Desktop
  21. kernel centos6/vmlinuz
  22. append initrd=centos6/initrd.img
  23. label manual7
  24. menu label ^Manual Install CentOS 7 ^Desktop
  25. kernel centos7/vmlinuz
  26. append initrd=centos7/initrd.img
  27. label local
  28. menu label Boot from ^local drive
  29. localboot 0xffff
  30. menu end

1.yum -y install cobbler dhcp
2.systemctl enable cobblerd.service && systemctl start cobblerd.service
3.systemctl enable httpd && systemctl start httpd
4.systemctl enable tftp.socket && systemctl start tftp.socket
5.setenforce 0 && iptables -F
6.vim /etc/cobbler/settings
server 192.168.153.7
next_server 192.168.153.7
default_password_crypted: “笔记l - 图107Vso.3yL6$sduKsVLmoLrUJDY3MedHP.”
通过openssl passwd -1
manage_dhcp: 1
vim /etc/cobbler/dhcp.template
subnet 192.168.153.0 netmask 255.255.255.0 {
option routers 192.168.153.7;
option domain-name-servers 192.168.153.7;
option subnet-mask 255.255.255.0;
range dynamic-bootp 192.168.153.100 192.168.153.200;
default-lease-time 21600;
max-lease-time 43200;
next-server $next_server;

systemctl restart cobblerd.service
cobbler sync

7.mount /dev/sr0 /media/dvd6
mount /dev/sr1 /media/dvd7
cobbler import —path=/media/dvd6 —name=centos6.9
cobbler import —path=/media/dvd7 —name=centos7.5

cobbler distro list
ls /var/www/cobbler/ks_mirror/

  1. [root@centos7(nanyibo) ~]# cobbler distro report |grep Kickstart
    Kickstart Metadata : {‘tree’: ‘http://@@http_server@@/cblr/links/centos7.5-x86_64'}
    通过以上查询的结果来编写kickstart文件中的url,如下
    url —url=”http://@@http_server@@/cblr/links/centos7.5-x86_64
    cp ks7.cfg /var/lib/cobbler/kickstarts/
    cobbler profile add —name=centos7.5-mini —distro=centos7.5-x86_64 —kickstart=/var/lib/cobbler/kickstarts/ks7.cfg

taobao

DNS

FQDN (Fully Qualified Domain Name): 同时带有主机名和zone的名称 www.baidu.com.

. 根域名
com. 一级域名
baidu.com. 二级域名
www.baidu.com. 三级域名

  1. com 盈利的商业域名 magedu.com huel.edu .gov .net .org 非盈利的组织域名
  2. mi.com jd.com

magedu.com

qq.com
www.qq.com
music.qq.com
v.qq.com
mail.qq.com
lol.qq.com
tga.qq.com

客户端从指定的dns直接获取的解析叫做权威应答
客户端通过指定的dns从其他渠道获得的解析叫做非权威应答

非权威应答:对于Dns自己没有,从别处问,都叫做递归查询: 转发查询
迭代查询

mail.qq.com

mail.163.com

dinglei@163.com

/etc/name.conf 全局配置文件,决定了dns的工作方式

/var/named dns 数据文件,决定了如何解析记录
www.magedu.com

* 实验1:在centos7上部署dns实现对magedu.com的正向解析及对192.168.153的反向解析
1.
[root@centos7(nanyibo) ~]# yum -y install bind
2.
[root@centos7(nanyibo) ~]# vim /etc/named.conf
listen-on port 53 { any; };
// listen-on-v6 port 53 { ::1; };
allow-query { any; };
……
include “/etc/named.magedu.zones”;

  1. [root@centos7(nanyibo) ~]# cp -p /etc/named.rfc1912.zones /etc/named.magedu.zones
    [root@centos7(nanyibo) ~]# vim /etc/named.magedu.zones
    zone “magedu.com” IN {
    type master;
    file “magedu.com.zone”;
    };

  1. zone "153.168.192.in-addr.arpa" IN {
  2. type master;
  3. file "192.168.153.zone";
  4. };

[root@centos7(nanyibo) ~]# named-checkconf
4.
[root@centos7(nanyibo) ~]# cd /var/named/
[root@centos7(nanyibo) named]# cp -p named.localhost magedu.com.zone
[root@centos7(nanyibo) named]# vim magedu.com.zone
$TTL 1D
@ IN SOA @ admin.magedu.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
magedu.com. NS ns1.magedu.com.
ns1.magedu.com. 3600 IN A 192.168.153.7
www A 192.168.153.6

[root@centos7(nanyibo) named]# cp -p magedu.com.zone 192.168.153.zone
[root@centos7(nanyibo) named]# vim 192.168.153.zone
$TTL 1D
@ IN SOA magedu.com. admin.magedu.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ NS ns1.magedu.com.
7 PTR ns1.magedu.com.
6 PTR www.magedu.com.

  1. [root@centos7(nanyibo) ~]# named-checkzone magedu.com /var/named/magedu.com.zone
    zone magedu.com/IN: loaded serial 0
    OK
    [root@centos7(nanyibo) ~]# named-checkzone 153.168.192.in-addr.arpa /var/named/192.168.153.zone
    zone 153.168.192.in-addr.arpa/IN: loaded serial 0
    OK

[root@centos7(nanyibo) ~]# rndc reload
server reload successful

[root@centos7(nanyibo) ~]# systemctl restart named

6.客户端测试
[root@centos6(nanyibo) ~]# vim /etc/resolv.conf
nameserver 192.168.153.7
[root@centos6(nanyibo) ~]# nslookup

www.magedu.com
Server: 192.168.153.7
Address: 192.168.153.7#53

Name: www.magedu.com
Address: 192.168.153.6

192.168.153.6
Server: 192.168.153.7
Address: 192.168.153.7#53

6.153.168.192.in-addr.arpa name = www.magedu.com.

dig测试
[root@centos6(nanyibo) ~]# dig -t ns magedu.com @192.168.153.7
[root@centos6(nanyibo) ~]# dig www.magedu.com @192.168.153.7
[root@centos6(nanyibo) ~]# dig -x 192.168.153.7 @192.168.153.7

客户端缓存
linux客户端无缓存
win客户端有缓存,查看方法
win+r cmd
ipconfig/displaydns 查看缓存
ipconfig/flushdns 清空缓存

泛域名解析
*.magedu.com. A 192.168.153.6

chroot
centos6: yum -y install bind-chroot
centos7: yum -y install bind-chroot
systemctl stop named
cp -a /etc/named. /var/named/chroot/etc
cp -a /var/named/
/var/named/chroot/var/named
systemctl start named-chroot

动态dns更新

指定的zone语句块中:Allow-update {any;};
chmod770 /var/named
setsebool -P named_write_master_zones on
nsupdate

server 127.0.0.1
zone magedu.com
update add ftp.magedu.com 88888 IN A 8.8.8.8
send
update delete www.magedu.com A
send

测试:dig ftp.magedu.com @127.0.0.1
ll /var/named/magedu.com.zone.jnl
cat /var/named/magedu.com.zone

* 实验2:DNS的主从

1.yum -y install bind
2.vim /etc/name.conf
3.vim /etc/name.rfc1912.zones
zone “magedu.com” IN {
type slave;
masters { 192.168.153.7; };
file “slaves/magedu.com.ZONE”;
};
4.service named restart

在主dns上应该设置allow-transfer来确保只有授权的机器才能做从dns
allow-transfer { 192.168.153.6; };

dig -t axfr magedu.com @192.168.153.7

  • 子域委派

三种方式:
1.子域和父域在一个文件里。

2.子域和父域在同一个机器上。不用委派,直接创建

3.子域和父域不在同一个机器上,要子域委派

zz.magedu.com
bj.magedu.com

www.magedu.com 1.1.1.1
www.zz.magedu.com 2.2.2.2
www.bj.magedu.com 3.3.3.3

1.在父dns上做委派
zz NS ns.zz.magedu.com.
bj NS ns.bj.magedu.com.
ns.zz A 192.168.153.6
ns.bj A 172.18.251.125

/etc/named.conf

  1. dnssec-enable no;
  2. dnssec-validation no;

2.在zz
[root@centos6(nanyibo) ~]# vim /etc/named.rfc1912.zones
zone “zz.magedu.com” IN {
type master;
file “zz.magedu.com.zone”;
};
[root@centos6(nanyibo) ~]# vim /var/named/zz.magedu.com.zone
$TTL 1D
@ IN SOA ns.zz.magedu.com. admin.zz.magedu.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.zz.magedu.com.
ns A 192.168.153.6
www A 2.2.2.2
[root@centos6(nanyibo) ~]# service named restart

3.在bj上配置
[root@centos7 ~]#vim /etc/named.rfc1912.zones
zone “bj.magedu.com” IN {
type master;
file “bj.magedu.com.zone”;
};

[root@centos7 named]#cp -p named.localhost bj.magedu.com.zone

[root@centos7 named]#vim bj.magedu.com.zone
$TTL 1D
@ IN SOA ns.bj.magedu.com. admin.bj.magedu.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.bj.magedu.com.
ns A 172.18.251.125
www A 3.3.3.3
[root@centos7 named]#systemctl restart named

作业:
1.主从dns
2.子域委派,部署magedu.com zz.magedu.com bj.magedu.com

实验:DNS模拟根实现,及主辅同步

六台机器

client:192.168.153.5
caching-only: 192.168.153.10
.: 192.168.153.9
com: 192.168.153.8
magedu.com: master 192.168.153.7 slave 192.168.153.6

1.除client以外,所有机器安装bind,并都清空防火墙和关闭selinux。
所有安装bind的主机配置name.conf,修改2个any,2个no,除caching-only以外,都把递归设置为no。
2.除root以外,所有机器修改named.ca,内容如下
. 518400 IN NS a.root-servers.net.
a.root-servers.net. 3600000 IN A 192.168.153.9

3.配置root
a. name.conf中删除name.ca的项目
b. rfc1912文件
zone “.” IN {
type master;
file “root.zone”;
};
c. root.zone
$TTL 1D
@ IN SOA ns. admin. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.
ns. A 192.168.153.9
com. NS ns.com.
ns.com. A 192.168.153.8
d.启动named

4.配置com
a. rfc1912文件
zone “com” IN {
type master;
file “com.zone”;
};
b. com.zone
$TTL 1D
@ IN SOA ns.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.com.
ns A 192.168.153.8
magedu.com. NS ns1.magedu.com.
magedu.com. NS ns2.magedu.com.
ns1.magedu.com. A 192.168.153.7
ns2.magedu.com. A 192.168.153.6
c.启动named

5.配置主magedu.com
a. rfc1912文件
zone “magedu.com” IN {
type master;
file “magedu.com.zone”;
};

  1. b. magedu.com.zone
  2. $TTL 1D
  3. @ IN SOA ns1.magedu.com. rname.invalid. (
  4. 2018091301 ; serial
  5. 1D ; refresh
  6. 1H ; retry
  7. 1W ; expire
  8. 3H ) ; minimum
  9. NS ns1.magedu.com.
  10. NS ns2.magedu.com.
  11. ns1 A 192.168.153.7
  12. ns2 A 192.168.153.6
  13. www A 1.1.1.1
  14. ftp A 2.2.2.2
  15. * A 10.10.10.10
  16. c.启动named

6.配置从magedu.com
a. rfc1912文件
zone “magedu.com” IN {
type slave;
masters { 192.168.153.7; };
file “slaves/MAGEDU.COM.ZONE”;
};
b. 启动named

7.client修改/etc/resolv.conf
nameserver 192.168.153.10 #指向缓存caching-only

测试,可以反复的给主、从增加防火墙策略来测试查询www.magedu.com可以自动在主从间切换
iptables -A INPUT -p udp —dport 53 -j REJECT
iptables -F 删除

注意:测试时要清空caching-server上的缓存 rndc flush

acl
在named.conf中定义
acl beijing {
192.168.153.5;
172.18.0.0/16;
};
acl zhengzhou {
192.168.153.6;
};

主从同步
解决在主 allow-transfer { 192.168}

在主dns上生成tsig公私钥对

1.在主dns上生成包含密钥字符串的钥匙文件
[root@dns_magedu(nanyibo) ~]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave
2.读取生成的文件,复制其中的加密字符串
[root@dns_magedu(nanyibo) ~]# cat Kmaster-slave.+157+20659.key
master-slave. IN KEY 512 3 157 JSWJNylimpeBp49z5mXhPg==
把JSWJNylimpeBp49z5mXhPg== 复制
3.编写密钥文件
[root@dns_magedu(nanyibo) ~]# vim /etc/transfer.key
key “master-slave” {
algorithm hmac-md5;
secret “JSWJNylimpeBp49z5mXhPg==”;
};
设置权限为440,owner为root,group为named
4.编写named.conf
include “/etc/transfer.key”;
options {
……
allow-transfer { key master-slave; };
……
}

5.将密钥文件发往从dns
[root@dns_magedu(nanyibo) ~]# rsync -pogv /etc/transfer.key root@192.168.153.6:/etc/

6.在从dns上配置启用密钥
[root@centos6(nanyibo) ~]# vim /etc/named.conf
include “/etc/transfer.key”;
options {

}
server 192.168.153.7 {
keys { master-slave; };
};

7.重启服务named。可以下载zone文件,但不能使用dig -t axfr。

注意:主从之间时间要同步

DNS视图:view 不同的client查询相同的记录返回不同的结果。
named.conf

view bjview {
match-clients { beijing; };
include “/etc/named.bj.zones”;
};
view zzview {
match-clients { zhengzhou; };
include “/etc/named.zz.zones”;
};

cat /etc/named.bj.zones
zone “example.com” IN {
type master;
file “example.com.zone”;
};
cat /etc/named.zz.zones
zone “example.com” IN {
type master;
file “example.com.ZONE”;
};

cat /var/named/example.com.zone
$TTL 1D
@ IN SOA ns.example.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.example.com.
ns A 192.168.153.10
www A 100.100.100.100

cat /var/named/example.com.ZONE
$TTL 1D
@ IN SOA ns.example.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.example.com.
ns A 192.168.153.10
www A 200.200.200.200

/etc/nsswitch.conf
hosts: files dns 决定了域名解析的顺序 hosts -> dns

CNAME:
music.magedu.com. CNAME music.qq.com.

MX:邮件交换记录

笔记l - 图108 A 192.168.0.$

转发dns

全局转发:
vim /etc/named.conf
options {
……
forward only|first;默认是first
forwarders { x.x.x.x; };
……
};

only: 本机有的结果优先,本机查不到,则交给转发。转发也查不到,则结束,报告查不到。
first: 本机有的结果优先,本机查不到,则交给转发。转发查不到(包含转发自己的以及转发迭代的),则本机再迭代。

特定区域转发:

zone “alibaba.com” {
type forward;
forwarders { 192.168.153.11; };
};

编译dns
1.解压
tar xvf bind-9.12.1.tar.gz -C /usr/local/src/
2.useradd -u 25 -r -m -d /var/named -s /sbin/nologin named
3.yum -y groupinstall “development tools”
4../configure —prefix=/app/bind9 —sysconfdir=/etc/bind9 —without-openssl
5.make && make install
6.vim /etc/profile.d/mage.sh
export PATH=/app/bind9/sbin:$PATH
7.vim /etc/bind9/named.conf
options {
directory “/var/named”;
};
zone “.” {
type hint;
file “named.ca”;
};
zone “test.com” {
type master;
file “test.com.zone”;
};
8.vim /var/named/named.ca
. 518400 IN NS a.root-servers.net.
a.root-servers.net. 3600000 IN A 192.168.153.9

9.vim /var/named/test.com.zone
$TTL 1d
@ IN SOA ns.test.com. admin (1 1d 10m 1w 1d)
NS ns.test.com.
ns A 192.168.153.10
www A 123.123.123.123

10.named -u named -f &

11.rndc支持
rndc-confgen -r /dev/urandom > /etc/bind9/rndc.conf

12.tail /etc/bind9/rndc.conf >> /etc/bind9/named.conf 并去除#

13.killall -SIGHUP named

14.rndc reload

dig
-t ns
soa
a
ptr = -x
axfr
mx

host
-t ns
soa
……
host www.magedu.com 192.168.153.11

nslookup

server 192.168.153.11
Default server: 192.168.153.11
Address: 192.168.153.11#53
www.magedu.com
Server: 192.168.153.11
Address: 192.168.153.11#53

Non-authoritative answer:
Name: www.magedu.com
Address: 1.1.1.2

server 192.168.153.10
Default server: 192.168.153.10
Address: 192.168.153.10#53
www.magedu.com
Server: 192.168.153.10
Address: 192.168.153.10#53

Non-authoritative answer:
Name: www.magedu.com
Address: 1.1.1.1

nslookup>
server IP: 指明使用哪个DNS server进行查询
set q=RR_TYPE: 指明查询的资源记录类型
NAME: 要查询的名称

bind有四个内置的acl:
none: 没有一个主机
any: 任意主机
localhost: 本机
localnet: 本机的IP同掩码运算后得到的网络地址

注意:只能先定义,后使用;因此一般定义在配置文件中,处于options的前面

dns的压力测试
1.[root@caching-server(nanyibo) ~]# cd /usr/local/src/bind-9.12.1/contrib/queryperf/

2.[root@caching-server(nanyibo) queryperf]# ./configure

3.[root@caching-server(nanyibo) queryperf]# make

4.[root@caching-server(nanyibo) queryperf]# cp queryperf /app/bind9/sbin/

5.写一个测试文件
[root@caching-server(nanyibo) ~]# tail /app/ceshidns.txt
www.aa.com A
test.com NS
test.com A
www.b.com A
a.com NS
www.magedu.com A
www.aa.com A
test.com NS
test.com A
www.b.com A
[root@caching-server(nanyibo) ~]# wc -l /app/ceshidns.txt
210240 /app/ceshidns.txt

6.[root@caching-server(nanyibo) ~]# queryperf -d /app/ceshidns.txt

通过dig的status状态来了解故障问题原因

DNS报错:
NOERROR:正常,无报错
SERVFAIL: DNS主机可以连接,但如果查询的结果不在DNS本机,而需要递归(转发和换代),而递归的远程DNS无法连接,则会显示该报错。
NXDOMAIN:该域找到,但没有这笔记录
REFUSED: allow-query中,没有允许这台客户端

打开日志功能

rndc querylog

作业:

实验:DNS模拟根实现,及主辅同步

八台机器

client:192.168.153.5
caching-only: 192.168.153.10 caching-only: 192.168.153.11
.: 192.168.153.9
com: 192.168.153.8
magedu.com: master 192.168.153.7 slave 192.168.153.6
转发dns: 192.168.153.12

在7,6上部署magedu.com域 ,7为主,6为从,并且配置视图功能,来自10的caching解析www.magedu.com时,返回结果1.1.1.1 来自11的caching解析www.magedu.com时返回1.1.1.2

保证,客户端只需把dns指向10及11.然后通过iptables 禁用10的dns访问,来测试出通过备用dns 11查出1.1.1.1.2

在12上部署alibaba.com域,在10,11上对该域做局部转发,模式first。

lamp

  1. L:linux A:apache M:mysql(mariadb) P:Php/Perl/Python

lnmp
N:Nginx

预习:数据库三大范式
SQL语言
lamp
1,3,5,6 ,1

mysql

实验1:在centos6上安装mysql
1.yum -y install mysql-server mysql

实验2:在centos6上安装二进制的mariadb

1.从downloads.mariadb.org 下载所需版本的mariadb的二进制包 mariadb-10.3.9-linux-x86_64.tar.gz

2.创建所需用户及组
[root@centos6(nanyibo) ~]# groupadd -g 36 -r mysql
[root@centos6(nanyibo) ~]# useradd -u 36 -r -g mysql -m -d /app/dbdata -s /sbin/nologin mysql

3.准备dbdata 建议做到lvm上
[root@centos6(nanyibo) ~]# fdisk /dev/sda
[root@centos6(nanyibo) ~]# partx -a /dev/sda
[root@centos6(nanyibo) ~]# pvcreate /dev/sda6
[root@centos6(nanyibo) ~]# vgcreate vgmysql /dev/sda6
[root@centos6(nanyibo) ~]# lvcreate -l +100%FREE -n lvmysql vgmysql
[root@centos6(nanyibo) ~]# mkfs.ext4 /dev/vgmysql/lvmysql
[root@centos6(nanyibo) ~]# vim /etc/fstab
/dev/vgmysql/lvmysql /app/dbdata ext4 defaults 0 0
[root@centos6(nanyibo) ~]# mount -a
[root@centos6(nanyibo) ~]# chown mysql.mysql /app/dbdata
[root@centos6(nanyibo) ~]# chmod 700 /app/dbdata

4.解压二进制目录
[root@centos6(nanyibo) ~]# tar -xvf mariadb-10.2.14-linux-x86_64.tar.gz -C /usr/local/

[root@centos6(nanyibo) ~]# cd /usr/local/
[root@centos6(nanyibo) local]# ln -sv mariadb-10.2.14-linux-x86_64 mysql
mysql' ->mariadb-10.2.14-linux-x86_64’

5.创建配置文件
[root@centos6(nanyibo) local]# cd /usr/local/mysql/
[root@centos6(nanyibo) mysql]# mkdir /etc/mysql
[root@centos6(nanyibo) mysql]# cp support-files/my-huge.cnf /etc/mysql/my.cnf
[root@centos6(nanyibo) mysql]# vim /etc/mysql/my.cnf
[mysqld]
……
datadir = /app/dbdata
innodb_file_per_table = on
skip_name_resolve = on
……

6.创建数据库
[root@centos6(nanyibo) mysql]# scripts/mysql_install_db —datadir=/app/dbdata —user=mysql

7.配置启动脚本
[root@centos6(nanyibo) mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@centos6(nanyibo) mysql]# chkconfig —add mysqld
[root@centos6(nanyibo) mysql]# chkconfig mysqld on
[root@centos6(nanyibo) mysql]# service mysqld restart
MariaDB server PID file could not be found! [FAILED]
Starting MariaDB.180710 18:00:14 mysqld_safe Logging to ‘/var/log/mysqld.log’.
180710 18:00:14 mysqld_safe Starting mysqld daemon with databases from /app/dbdata
[ OK ]

8.配置环境变量PATH
[root@centos6(nanyibo) ~]# vim /etc/profile.d/mage.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@centos6(nanyibo) ~]# source /etc/profile.d/mage.sh

9.初始化mysql
[root@centos6(nanyibo) ~]# mysql_secure_installation

基本语句

MariaDB [(none)]> select user();
+————————+
| user() |
+————————+
| root@localhost |
+————————+
1 row in set (0.00 sec)

MariaDB [(none)]> select version();
+——————————-+
| version() |
+——————————-+
| 10.2.14-MariaDB-log |
+——————————-+
1 row in set (0.00 sec)

查看有哪些databases

MariaDB [(none)]> show databases;
+——————————+
| Database |
+——————————+
| information_schema |
| mysql |
| performance_schema |
| test |
+——————————+
4 rows in set (0.01 sec)

创建数据库
MariaDB [test]> create database magedb;
Query OK, 1 row affected (0.01 sec)

MariaDB [test]> show databases;
+——————————+
| Database |
+——————————+
| information_schema |
| magedb |
| mysql |
| performance_schema |
| test |
+——————————+
5 rows in set (0.00 sec)

DDL (create drop alter)

MariaDB [m33student]> create table student (id tinyint unsigned primary key, name varchar(20) not null, age tinyint unsigned,sex char(1) default “m” );
Query OK, 0 rows affected (0.05 sec)

MariaDB [m33student]> desc student;
+———-+——————————-+———+——-+————-+———-+
| Field | Type | Null | Key | Default | Extra |
+———-+——————————-+———+——-+————-+———-+
| id | tinyint(3) unsigned | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| sex | char(1) | YES | | m | |
+———-+——————————-+———+——-+————-+———-+
4 rows in set (0.02 sec)

MariaDB [m33student]> create table student2 (id tinyint unsigned, lesson varchar(20) not null default “linux” , score tinyint unsigned, primary key (id,lesson));
Query OK, 0 rows affected (0.02 sec)

MariaDB [m33student]> desc student2
-> ;
+————+——————————-+———+——-+————-+———-+
| Field | Type | Null | Key | Default | Extra |
+————+——————————-+———+——-+————-+———-+
| id | tinyint(3) unsigned | NO | PRI | NULL | |
| lesson | varchar(20) | NO | PRI | linux | |
| score | tinyint(3) unsigned | YES | | NULL | |
+————+——————————-+———+——-+————-+———-+
3 rows in set (0.00 sec)

MariaDB [m33student]> drop table student2;
Query OK, 0 rows affected (0.04 sec)

MariaDB [m33student]> alter table student add phone char(11) after name;
Query OK, 0 rows affected (0.05 sec)

查看索引
MariaDB [m33student]> show indexes from student\G;

增加唯一性约束
MariaDB [m33student]> alter table student add unique key (phone);

删除列
MariaDB [m33student]> alter table student drop phone;

创建索引
MariaDB [m33student]> create index age_index on student(phone);

DML

insert
MariaDB [m33student]> insert into student values (1,’liuxin’,’18768896428’,22,default);
Query OK, 1 row affected (0.02 sec)

MariaDB [m33student]> insert into student (id,name) values (2,’zhangxinglei’);
Query OK, 1 row affected (0.02 sec)

MariaDB [m33student]> insert into student (name,id) values (‘zhangxuechao’,3);
Query OK, 1 row affected (0.01 sec)

一次性插入多行
MariaDB [m33student]> insert into student (id,name,sex) values (4,’meiwenjun’,’f’),(5,’chenhaiyan’,’f’),(6,’fanguodong’,default);

使用查询语句创建表 as可以省略
MariaDB [m33student]> create table emp as select * from student;

删除表中的所有行
MariaDB [m33student]> delete from lady;
Query OK, 4 rows affected (0.01 sec)

通过查询结果来插入行
MariaDB [m33student]> insert into lady select * from student where sex=’m’;
Query OK, 2 rows affected (0.02 sec)

update

MariaDB [m33student]> update student set phone=’18438613802’ where id=2;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [m33student]> update emp set phone=’18438613802’ ;
Query OK, 6 rows affected (0.02 sec)
Rows matched: 6 Changed: 6 Warnings: 0

delete

MariaDB [m33student]> delete from emp where id=1;
Query OK, 1 row affected (0.02 sec)

MariaDB [m33student]> delete from emp;
Query OK, 6 rows affected (0.03 sec)

create table lesson (id tinyint unsigned, lesson varchar(20) not null default “linux” , score tinyint unsigned, primary key (id,lesson));

MariaDB [m33student]> select * from student;
+——+———————+——————-+———+———+
| id | name | phone | age | sex |
+——+———————+——————-+———+———+
| 1 | liuxin | 18768896428 | 22 | m |
| 2 | zhangxinglei | 18438613802 | NULL | m |
| 3 | zhangxuechao | NULL | NULL | m |
| 4 | meiwenjun | NULL | NULL | f |
| 5 | chenhaiyan | NULL | NULL | f |
| 6 | fanguodong | NULL | NULL | m |
| 10 | weishiyan | 11515151511 | 18 | f |
+——+———————+——————-+———+———+
7 rows in set (0.00 sec)

MariaDB [m33student]> select name mingzi,phone from student;
+———————+——————-+
| mingzi | phone |
+———————+——————-+
| liuxin | 18768896428 |
| zhangxinglei | 18438613802 |
| zhangxuechao | NULL |
| meiwenjun | NULL |
| chenhaiyan | NULL |
| fanguodong | NULL |
| weishiyan | 11515151511 |
+———————+——————-+
7 rows in set (0.00 sec)

MariaDB [m33student]> select id,score+10 score from lesson;
+——+———-+
| id | score |
+——+———-+
| 1 | 100 |
| 2 | 105 |
+——+———-+
2 rows in set (0.00 sec)

rhel 7.0 7.1 7.3
mysql 5.5-1 5.5-2 5.5-2

函数

单行函数
字符串型
upper
lower
concat
select concat(name,’ age is ‘,age),gender from students;
insert替换函数(列名,从第几位开始,替换几位,替换的内容)
MariaDB [hellodb]> select name,insert(phone,4,4,’’) phone from students;
+————————+——————-+
| name | phone |
+————————+——————-+
| Hou Yi | 1512972 |
| Ya Se | 1512972 |
| An Qila | 1359929 |
| Da Ji | 1359929 |
| Sun Shangxiang | 1359929 |
length(name) 长度
lpad(phone,15,’‘)
rpad(phone,15,’
‘)
replace(name,’Liu’,’Li’)
substr(phone,5) 从第5位开始取到最后
substr(phone,5,3) 从第5位开始取,往后一共取3位
数字型
abs(-20); 取绝对值
mod(10,3); 取模
ceil(9.2);取不小于X的最小整数
floor(3.6) 取不大于X的最大整数
round 四舍五入
round(3.41111) 得3
round(3.41111,2) 得3.41
truncate 截断
truncate(3.111111,0) 得3
truncate(113.119911,3) 得113.119
truncate(113.119911,-1) 得110

日期型
select now(); 显示当前的时间
select curdate(); 显示当前的日期
select curtime(); 显示当前的时间
select year(birthday); 显示指定日期的年
select month(birthday); 显示指定日期的月
select day(birthday); 显示指定日期是几号
select dayname(now()); 显示指定日期是周几

字符转日期
str_to_date(‘24-11-1700’,’%d-%m-%Y’) 字符转日期
日期转字符
select date_format(birthday,’%Y年%m月%d日’) 生日 from students;

null函数
ifnull(score,0)
coalesce(score,0)
其他函数
MariaDB [hellodb]> select user();
+————————+
| user() |
+————————+
| root@localhost |
+————————+
1 row in set (0.00 sec)

  1. MariaDB [hellodb]> select version;
  2. ERROR 1054 (42S22): Unknown column 'version' in 'field list'
  3. MariaDB [hellodb]> select version();
  4. +----------------+
  5. | version() |
  6. +----------------+
  7. | 5.5.56-MariaDB |
  8. +----------------+
  9. 1 row in set (0.00 sec)
  10. MariaDB [hellodb]> select database();
  11. +------------+
  12. | database() |
  13. +------------+
  14. | hellodb |
  15. +------------+
  16. 1 row in set (0.00 sec)

case else

select courseid,case courseid
-> when 2 then score+10
-> when 3 then score+0
-> when 4 then score+20
-> else score
-> end
-> as score
-> from scores;

多行函数(聚合函数、组函数)

count() 返回表中满足where条件的行的数量,如没有Where条件,列出所有行的总数
MariaDB [hellodb]> Select count() from scores where score > 50;
+—————+
| count(
) |
+—————+
| 14 |
+—————+
MariaDB [hellodb]> select count(distinct classid) from students;
+————————————-+
| count(distinct classid) |
+————————————-+
| 7 |
+————————————-+
1 row in set (0.00 sec)

max() min() avg() sum()
select max(score) from scores;

select courseid,sum(score) scoreall from scores group by courseid;

算平均值时,注意null不会参与组函数,所以要先用ifnull将null转为0,如下
MariaDB [hellodb]> select avg(ifnull(score,0)) from scores;
+———————————+
| avg(ifnull(score,0)) |
+———————————+
| 73.0588 |
+———————————+
1 row in set (0.00 sec)

MariaDB [hellodb]> select courseid,avg(score) from scores group by courseid;

select courseid,avg(nullif(score,0)) as avg from scores group by courseid where avg>60; 错误

select courseid,avg(nullif(score,0)) as avg from scores group by courseid having avg>60; 对的

where发生在group by 之前,所以不能对group by 后的结果进行筛选,而要用having

select from students limit 6 取前6行,即1-6行
select
from students limit 6,3 取6行后的3行,即7,8,9行

练习

导入hellodb.sql生成数据库

(1)在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄
MariaDB [hellodb]> select Name,age from students where age>25 and gender=’m’;
(2)以ClassID为分组依据,显示每组的平均年龄
MariaDB [hellodb]> select classid ,avg(age) age from students group by classid having classid is not null;
(3)显示第2题中平均年龄大于30的分组及平均年龄
MariaDB [hellodb]> select classid ,avg(age) age from students group by classid having age>30 and classid is not null;
(4)显示以L开头的名字的同学的信息
MariaDB [hellodb]> select from students where name like ‘L%’;
(5)显示TeacherID非空的同学的相关信息
MariaDB [hellodb]> select
from students where TeacherID is NOT NULL;
(6)以年龄排序后,显示年龄最大的前10位同学的信息
MariaDB [hellodb]> select from students order by age desc limit 10;
(7)查询年龄大于等于20岁,小于等于25岁的同学的信息
mysql> select
from students where age >= 20 and age <=25;
mysql> select * from students where age between 20 and 25;

多表连接
* 内连接 inner join
select s.name student_name,c.class class from students s inner join classes c on s.classid=c.classid;
自然连接 natural join 基于同名列
select s.name student_name,c.class class from students s natural join classes c ;

  1. 非等值连接
  2. select s.name student_name,s.salary salary,sa.grade from students s,salgrade sa where s.salary between sa.losal and sa.hisal;
  3. using
  4. select s.name student_name,c.class class from students s join classes c using (classid);
  5. 自连接
  6. select s.name student_name,a.name admin_name from students s join students a on s.classadminid=a.stuid;
  7. 外连接
  8. 左外连接
  9. select s.name student_name,t.name teacher_name from students s left join teachers t on s.teacherid=t.tid;
  10. 右外连接
  11. select s.name student_name,t.name teacher_name from students s right join teachers t on s.teacherid=t.tid;
  12. 三表连接
  13. 取出学生名和所学的课程名
  14. select s.name as student_name, co.course as course from students s join coc c on s.classid=c.classid join courses co on c.courseid=co.courseid;

作业:
导入hellodb.sql,以下操作在students表上执行

1、以ClassID分组,显示每班的同学的人数
2、以Gender分组,显示其年龄之和
3、以ClassID分组,显示其平均年龄大于25的班级
4、以Gender分组,显示各组中年龄大于25的学员的年龄之和
5、显示前5位同学的姓名、课程及成绩
6、显示其成绩高于80的同学的名称及课程;
7、求前8位同学每位同学自己两门课的平均成绩,并按降序排列
8、显示每门课程课程名称及学习了这门课的同学的个数
9、显示其年龄大于平均年龄的同学的名字
10、显示其学习的课程为第1、2,4或第7门课的同学的名字
11、显示其成员数最少为3个的班级的同学中年龄大于同班同学平均年龄的同学
12、统计各班级中年龄大于全校同学平均年龄的同学

第三十四天

内连接 交集:仅查看有老师的学员和有学员的老师的信息

MariaDB [hellodb]> select s.name student_name,t.name teacher_name from students s inner join teachers t on s.teacherid=t.tid;
+————————+———————-+
| student_name | teacher_name |
+————————+———————-+
| Sun Shangxiang | Liu Bang |
| Hou Yi | Wu Zetian |
| Da Ji | Cheng Jisihan |
+————————+———————-+
3 rows in set (0.00 sec)

左外连接 显示所有学员信息,包含有老师的学员和没老师的学员
MariaDB [hellodb]> select s.name student_name,t.name teacher_name from students s left join teachers t on s.teacherid=t.tid;

右外连接 显示所有的老师信息,包含有学员的老师,和没学员的老师
MariaDB [hellodb]> select s.name student_name,t.name teacher_name from students s right join teachers t on s.teacherid=t.tid;

左外连接 仅显示没老师的学员
MariaDB [hellodb]> select s.name student_name,t.name teacher_name from students s left join teachers t on s.teacherid=t.tid where t.name is null;

右外连接 仅显示没学员的老师
MariaDB [hellodb]> select s.name student_name,t.name teacher_name from students s right join teachers t on s.teacherid=t.tid where s.name is null;

并集 显示所有老师和学员
select s.name student_name,t.name teacher_name from students s left join teachers t on s.teacherid=t.tid
-> union
-> select s.name student_name,t.name teacher_name from students s right join teachers t on s.teacherid=t.tid;

并集 仅显示没老师的学员和没学员的老师
MariaDB [hellodb]> select * from (select s.name student_name,t.name teacher_name from students s left join teachers t on s.teacherid=t.tid union select s.name student_name,t.name teacher_name from students s right join teachers t on s.teacherid=t.tid) as a where student_name is null or teacher_name is null;

迪卡尔乘积 交叉连接
MariaDB [hellodb]> select s.name student_name,t.name teacher_name from students s cross join teachers t ;

子查询

在子查询中,如果子查询得出多个值,那么要在括号外写上any(some),all,in。

any 大于最小值
all 大于最大值
< any 小于最大值
< all 小于最小值

练习:把后羿的年龄改为与凯同岁。
update students st set age=(select age from (select * from students) a where name=’Kai’) where name=’hou yi’;

作业:
导入hellodb.sql,以下操作在students表上执行
1、以ClassID分组,显示每班的同学的人数
MariaDB [hellodb]> select classid,count(stuid) student_count from students group by classid having classid is not null;

2、以Gender分组,显示其年龄之和
MariaDB [hellodb]> select gender,sum(age) from students group by gender;

3、以ClassID分组,显示其平均年龄大于25的班级
MariaDB [hellodb]> select classid,avg(age) age from students group by classid having avg(age) > 25 and classid is not null;

4、以Gender分组,显示各组中年龄大于25的学员的年龄之和
MariaDB [hellodb]> select gender,sum(age) sum_age from students where age > 25 group by gender;

5、显示前5位同学的姓名、课程及成绩
MariaDB [hellodb]> select s.name ,c.course,sc.score from (select * from students limit 5) as s left join scores sc on sc.stuid=s.stuid left join courses c on sc.courseid=c.courseid;

6、显示其成绩高于80的同学的名称及课程;
mysql> select s.name student_name,sc.score,c.course course from students s join scores sc on s.stuid=sc.stuid join courses c on sc.courseid=c.courseid where sc.score>80;

7、求前8位同学每位同学自己两门课的平均成绩,并按降序排列
MariaDB [hellodb]> select s.name,avg(sc.score) avg_score from (select * from students limit 8) s join scores sc on s.stuid=sc.stuid group by s.stuid order by avg_score desc;

8、显示每门课程课程名称及学习了这门课的同学的个数
MariaDB [hellodb]> select c.course course,count(s.stuid) count from students s join coc co on s.classid=co.classid join courses c on co.courseid=c.courseid group by c.course;

9、显示其年龄大于平均年龄的同学的名字
MariaDB [hellodb]> select name,age from students where age > (select avg(age) from students);

10、显示其学习的课程为第1、2,4或第7门课的同学的名字
MariaDB [hellodb]> select s.name,c.courseid from students s join coc c on s.classid=c.classid where c.courseid in (1,2,4,7);

11、显示其成员数最少为3个的班级的同学中年龄大于同班同学平均年龄的同学
MariaDB [hellodb]> select s.name student_name,age from students s join (select classid from students group by classid having classid is not null and count(stuid) > 3) as c on s.classid=c.classid group by s.classid having age > avg(s.age);

12、统计各班级中年龄大于全校同学平均年龄的同学
MariaDB [hellodb]> select classid,name as student_name,age from students where age > (select avg(age) from students) and classid is not null order by classid;

视图:
简单视图:单张表
复杂视图:多张,子查询
物化视图:

MariaDB [hidb]> create view v1_students as select name,age from students;
MariaDB [hidb]> create view v3_students as select name,age from students where age > 40 with check option;

MariaDB [hidb]> show create view v3students\G;
**
1. row _**
View: v3_students
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=root@localhost SQL SECURITY DEFINER VIEW v3_students AS select students.Name AS name,students.Age AS age from students where (students.Age > 40) WITH CASCADED CHECK OPTION
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

复杂视图:
MariaDB [hidb]> create view v4_students as select s.name student_name,t.name teacher_name from students s join teachers t on s.teacherid=t.tid;

MariaDB [hidb]> update v4_students set teacher_name=’Tie Muzhen’ where student_name=’da ji’;

MariaDB [hidb]> create view v5_students as select classid,count(stuid) student_count from students group by classid having classid is not null;
Query OK, 0 rows affected (0.01 sec)

MariaDB [hidb]> select * from v5_students;
+————-+———————-+
| classid | student_count |
+————-+———————-+
| 1 | 4 |
| 2 | 3 |
| 3 | 4 |
| 4 | 4 |
| 5 | 1 |
| 6 | 4 |
| 7 | 3 |
+————-+———————-+
7 rows in set (0.01 sec)

MariaDB [hidb]> update v5_students set student_count=10 where classid=7;
ERROR 1288 (HY000): The target table v5_students of the UPDATE is not updatable

不能修改数据的视图:

1.select 子句中包括distinct
2.select 子句中包含组函数
3.select 子句中包含group by
4.select 子句中包含union

查看指定的视图信息
MariaDB [hidb]> show create view v3_students\G;

查看所有的视图信息
MariaDB [hidb]> select * from information_schema.views\G;

删除视图

MariaDB [hidb]> drop view v1_students;

MariaDB [mysql]> CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN “Hello World!”;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> select simplefun();
+———————+
| simplefun() |
+———————+
| Hello World! |
+———————+
1 row in set (0.00 sec)

查看所有函数的信息
MariaDB [mysql]> show function status\G;

查看指定自定义函数的定义
MariaDB [mysql]> show create function simplefun\G;
1. row
Function: simplefun
sql_mode:
Create Function: CREATE DEFINER=root@localhost FUNCTION simplefun() RETURNS varchar(20) CHARSET latin1
RETURN “Hello World!”
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)

ERROR: No query specified

带参数的自定义函数
MariaDB [mysql]> delimiter //
MariaDB [mysql]> CREATE FUNCTION addTwoNumber(x SMALLINT UNSIGNED, Y SMALLINT UNSIGNED)
-> RETURNS SMALLINT BEGIN
-> DECLARE a, b SMALLINT UNSIGNED;
-> SET a = x, b =y;
-> RETURN a+b;
-> END//
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> delimiter ;
MariaDB [mysql]> select addtwonumber(10,20);
+——————————-+
| addtwonumber(10,20) |
+——————————-+
| 30 |
+——————————-+
1 row in set (0.00 sec)

查看所有的自定义函数

MariaDB [mysql]> show function status\G;

删除自定义函数

MariaDB [mysql]> drop function simplefun2;
Query OK, 0 rows affected (0.00 sec)

ariaDB [mysql]> delimiter //
MariaDB [mysql]> create procedure showtime()
-> begin
-> select now();
-> end//
Query OK, 0 rows affected (0.00 sec)

查看指定的存储过程创建
show create procedure showtime\G;

删除存储过程
MariaDB [mysql]> drop procedure showtime;

触发器trigger
MariaDB [hellodb]> create table student_info(
-> stu_id int(11) primary key auto_increment,
-> stu_name varchar(255) default null);
Query OK, 0 rows affected (0.01 sec)

MariaDB [hellodb]> create table student_count( student_count int(11) default 0);
Query OK, 0 rows affected (0.02 sec)

Empty set (0.00 sec)

MariaDB [hellodb]> insert into student_count values (0);
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> create trigger trigger_student_count_insert after insert on student_info for each row update student_count set student_count=student_count+1;
Query OK, 0 rows affected (0.01 sec)

MariaDB [hellodb]> create trigger trigger_student_count_delete after delete on student_info for each row update student_count set student_count=student_count-1;
Query OK, 0 rows affected (0.01 sec)

查看trigger信息
MariaDB [hellodb]> SHOW TRIGGERS\G;

删除trigger
DROP TRIGGER trigger_name;

DDL(create drop alter)

DML(insert update delete)

DQL(select)

DCL(grant revoke)

mysql -u root -h localhost

root@localhost
root@127.0.0.1
root@192.168.153.7
root@172.18.0.100

root@192.168.%.%
root@192.168.153.%

创建帐户
MariaDB [mysql]> create user liuxin@’192.168.153.7’ identified by ‘centos’;

删除帐户

MariaDB [(none)]> drop user liuxin@’192.168.153.7’;

修改密码
方法一
set password for root@’localhost’=password(“redhat”);
方法二
update mysql.user set password=password(“zhongqiukuaile”) where host=’localhost’;

重置mysql管理员帐户root@localhost
vim /etc/my.cnf
[mysqld]
skip_grant_tables

systemctl restart mariadb.service

mysql -u root 直接可免密码登录

update mysql.user set password=password(“zhongqiukuaile”) where host=’localhost’;

再把/etc/my.cnf还原,再重启服务 ,完成

授权
grant all on hellodb.* to root@’192.168.153.6’;

grant all on hellodb.view_student to root@’192.168.153.6’;

grant select,insert on hellodb.view_student to root@’192.168.153.6’;

grant all on . to root@’192.168.153.6’ identified by ‘redhat123’; 创建用户与授权一步到位

只授权某些字段
grant select(stuid,name,gender) on hellodb.students to root@’192.168.153.6’ WITH GRANT OPTION

查看授权
MariaDB [(none)]> show grants for root@’192.168.153.6’;

回收授权
revoke select,insert on hellodb.view_student from root@’192.168.153.6’;

第三十五天

修改用户名
MariaDB [mysql]> rename user zhangsan@’192.168.153.%’ to lisi@’192.168.153.7’;
Query OK, 0 rows affected (0.00 sec)

约束
查看所有约束
select * from information_schema.table_constraints\G;

非空约束

  1. 建表时指定
  2. create table t2(id int(10) not null,name varchar(5));
  3. 已存在的表增加约束
  4. alter table t2 modify name varchar(5) not null;
  5. 删除非空约束
  6. alter table t2 modify name varchar(5);

唯一性约束
create table t3(userid int(10) unique,name varchar(10));

复合唯一性约束
create table t_user(
-> user_id int(10),
-> user_name varchar(30),
-> id_card varchar(18),
-> constraint un_userid_idcard unique(user_id,id_card)
-> );

alter table t6 modify id int unique;
alter table t6 add constraint un_t6_name unique(name);
alter table t6 drop index un_t6_name;

主键约束
建表时添加
create table test1(user_id int(10) primary key,name varchar(10));
删除主键
alter table test1 drop primary key;
表存在时增加主键
alter table test1 modify user_id int(10) primary key;
alter table test1 add constraint test1_user_id_pk primary key (user_id);

  1. 复合主键
  2. create table test2 (
  3. -> user_id int(10),
  4. -> user_name varchar(30),
  5. -> age tinyint unsigned,
  6. -> constraint test2_userid_username_pk primary key (user_id,user_name)
  7. -> );
  8. 在一张表上不能创建多个主键
  9. 外键

CREATE TABLE students (
StuID int(10) unsigned NOT NULL AUTO_INCREMENT,
Name varchar(50) NOT NULL,
Age tinyint(3) unsigned NOT NULL,
Gender enum(‘F’,’M’) NOT NULL,
ClassID tinyint(3) unsigned DEFAULT NULL,
TeacherID int(10) unsigned DEFAULT NULL,
PRIMARY KEY (StuID),
KEY hello_fk (ClassID),
CONSTRAINT hello_fk FOREIGN KEY (ClassID) REFERENCES classes (ClassID)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

  1. 给现有表增加外键
  2. alter table students add constraint mage_stu_class_fk foreign key(classid) references classes(classid);
  3. alter table students add constraint mage_stu_class_fk foreign key (classid) references classes (classid) on delete cascade;
  4. alter table students add constraint mage_stu_class_fk foreign key (classid) references classes (classid) on delete set null;
  5. alter table students add constraint mage_stu_class_fk foreign key (classid) references classes (classid) on update cascade;
  6. 自增长
  7. 增加
  8. alter table students modify id int(10) unsigned auto_increment;
  9. 删除
  10. alter table students modify id int(10) unsigned ;
  11. 检查约束
  12. mysql中不支持.
  13. https://mariadb.com/kb/en/library/full-list-of-mariadb-options-system-and-status-variables/
  14. 系统变量
  15. set sql_mode='tranditional';
  16. 使用索引
  17. 查看指定表上的所有索引
  18. show indexes from students\G;
  19. 创建索引
  20. create index index_age on students(age);
  21. 查看是否使用索引
  22. explain select * from students where age=20\G
  23. 统计索引使用的次数
  24. set global userstat=1;
  25. exit重连
  26. show index_statistics;

第三十六天

DAS
Direct-Attached Storage 直连存储
Storage-Area Network 存储区域网络 iscsi
Network Attached Storage 网络附加存储 FTP,CIFS,NFS

ftp

在centos7当中ftp用户的根目录不能有w权限
listen_port (Default: 21) FTP命令通道的监
connect_from_port_20 (Default: YES) 是否允许主动传输
ftp_data_port (Default: 20) 主动模式使用的端口
pasv_min_port=9527 (Default: 0) 被动模式,服务端开启的随机端口的最小值
pasv_max_port=9529 (Default: 0) 被动模式,服务端开启的随机端口的最大值
anonymous_enable=YES (Default: YES) 是否开启匿名用户
local_enable=NO (Default: NO) 是否开启Linux本地用户登录
local_root=(Default: (none)) 非匿名用户登录时所在的目录,默认是各自的家目录
write_enable=NO (Default: NO) 是否允许Linux本地用户上传文件
local_umask=022 (Default: 077) 本地用户上传文件的默认权限
anon_upload_enable=YES (Default: NO) 是否允许匿名用户上传,如启动,还需让ftp用户对/var/ftp/pub及其他需要上传的目录设置wx权限
anon_mkdir_write_enable=YES (Default: NO) 是否允许匿名用户创建目录,如启动,还需让ftp用户对/var/ftp/pub及其他需要上传的目录设置wx权限
no_anon_password=YES (Default: NO) 使用ftp客户端登录匿名时,是否密码,如为NO,即默认,则需要输入任意密码,如为YES,直接登录,不用输入。
anon_world_readable_only (Default: YES) 匿名用户下载文件时,文件一定要other上也有r权限。
anon_other_write_enable=YES (Default: NO) 匿名用户是否可以删除及重命名
anon_umask (Default: 077) 匿名用户上传时的默认权限。
chown_uploads=YES (Default: NO) 匿名用户上传文件的所属人是否要更改。如YES,则更改为chown_username所指定的
chown_username (Default: root)
chown_upload_mode=0755 (Default: 0600)在chown_uploads生效的前提下,设置匿名用户的上传权限,一旦设置anon_umask失效。且权限一定要权限4位
guest_enuable (Defalt: NO) 所有的非匿名用户都映射为了guest用户
guest_username (Default: ftp) guest用户是谁,默认ftp
chroot_local_user=YES 将linux系统用户的根目录设置为家目录,注意在Centos7中该目录对用户不能有w权限,当为YES时,所有人都不能越狱,当为NO时,所有人都能越狱。
chroot_list_enable=YES 越狱例外,下一行一定要有。当上一行为YES是,为白名单,当为NO时,为黑名单
chroot_list_file=/etc/vsftpd/chroot_list
xferlog_enable=YES (Default: no) 是否开启上传、下载日志
xferlog_std_format (Default: no) 是否使用wuftp格式
xferlog_file (Default: /var/log/xferlog) xferlog的存放路径
dual_log_enable (Default: NO) 是否同时开启vsftpd格式的日志,该格式记录信息更多,不只upload/downloads
vsftpd_log_file (Default: /var/log/vsftpd.log) vsftpd格式日志的存放路径
ftpd_banner (Default: none) 登录时的欢迎信息。不是所有客户端都可见
banner_file Default: (none) 登录时的欢迎信息。不是所有客户端都可见,当该行存在时,则优先于ftpd_banner
dirmessage_enable (Default: NO) 每进入一个目录时,如果该目录下有.message文件,则将其内容展现出来,不是所有客户端都可见
message_file (Default: .message)
userlist_enable=YES (Default: NO) 是否启用用户过滤功能。如YES,则开启,过滤文件由userlist_file决定
userlist_file (Default: /etc/vsftpd/user_list) 过滤文件路径
userlist_deny (Default: YES) 当该值为YES时userlist为黑名单,反之为白名单
/etc/vsftpd/ftpuser 固定是黑名单,写入其中的用户一定不能登录ftp
max_clients (Default: 2000) 允许同时登录的客户端请求数
nopriv_user (Default: nobody) 客户端建立命令通道时,服务端与之连接的进程的所属用户
anon_max_rate (Default: 0) 匿名用户上传和下载的最大速度,单位字节。
local_max_rate (Default: 0) Linux本地用户上传和下载的最大速度,单位字节。
connect_timeout (Default: 60) 主动模式数据连接超时时长
accept_timeout (Default: 60) 被动模式数据连接超时时长
data_connection_timeout (Default: 300) 数据连接无数据传输时的超时时长
idle_session_timeout (Default: 300) 无命令操作超时时长
ascii_upload_enable=NO
ascii_download_enable=NO

实验:在centos6中以非独立方式运行vsftpd

1.yum -y install vsftpd xinetd
2.vim /etc/vsftpd/vsftpd.conf
listen=NO
3.vim /etc/xinetd.d/vsftpd
service ftp
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_failure += USERID
disable = no
}
4.
[root@centos6(nanyibo) ~]# service xinetd restart
[ OK ]
[root@centos6(nanyibo) ~]# chkconfig xinetd on

实验:FTPS

1.生成证书
[root@centos7(nanyibo) ~]# cd /etc/pki/tls/certs/
[root@centos7(nanyibo) certs]# make vsftpd.pem
[root@centos7(nanyibo) certs]# cp vsftpd.pem /etc/vsftpd/

2.编辑配置文件
[root@centos7(nanyibo) ~]# vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES
allow_anon_ssl=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/vsftpd/vsftpd.pem

3.重启服务,用客户端测试

实验:ftp的虚拟用户
1.生成用户文件
[root@centos7(nanyibo) ~]# vim ftpvusers
meiwenjun
redhat
chenfangyuan
redhat
chaoyuanning
redhat

[root@centos7(nanyibo) ~]# db_load -T -t hash -f ftpvusers /etc/vsftpd/ftpvusers.db
[root@centos7(nanyibo) ~]# cd /etc/vsftpd/
[root@centos7(nanyibo) ~]# chmod 600 ftpvusers.db

2.创建虚拟用户
[root@centos7(nanyibo) ~]# useradd -d /var/ftpsite -s /sbin/nologin ftpvuser
[root@centos7(nanyibo) ~]# chmod u-w /var/ftpsite/

3.编辑主配置文件
[root@centos7(nanyibo) ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=ftpvuser
pam_service_name=vsftpd.vuser

4.编辑pam文件
[root@centos7(nanyibo) ~]# vim /etc/pam.d/vsftpd.vuser
auth required pam_userdb.so db=/etc/vsftpd/ftpvusers
account required pam_userdb.so db=/etc/vsftpd/ftpvusers

5.配置子配置文件
user_config_dir=/etc/vsftpd/configdir

mkdir /etc/vsftpd/configdir
vim chenfangyuan
anon_max_rate=102400

6.重启服务,使生效

作业:

部署一个vsftpd服务,要求如下
1.创建虚拟用户,名为liubei,guanyu,zhangfei,要求用户在本地不存在。密码均设置为centos
2.liubei登录会自动到/var/ftpdir/liubei目录
guanyu登录会自动到/var/ftpdir/guanyu目录
zhangfei登录会自动到/var/ftpdir/zhangfei目录
3.要求用户对各自目录下的uploads目录有上传权限,而其他目录则仅访问。且用户只能自己访问各自的目录,其他用户不准备在ftp客户端 使用cd跳出其指定目录
4.用户上传的文件,自己也可以下载,用户上传文件的默认权限为644。
5.限制三个用户的上传及下载速度均为128KB/S

anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=YES
anon_world_readable_only=NO
anon_other_write_enable=YES
anon_umask=022
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/configdir
guest_enable=YES
guest_username=ftpvuser
pam_service_name=vsftpd.vuser
dirmessage_enable=YES
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
xferlog_enable=YES
xferlog_std_format=YES
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
connect_from_port_20=YES
xferlog_file=/var/log/xferlog

子配置文件
anon_max_rate=128000
anon_upload_enable=YES
local_root=/var/ftpsite/chenfangyuan
allow_writeable_chroot=YES

实现基于mysql验证的vsftpd虚拟用户

1.安装pam_mysql
在centos6,可通过epel源直接yum安装yum -y install pam_mysql
在centos7,需要下载源码包,手工编译安装
yum -y groupinstall “Development tools”
yum -y install mariadb-devel pam-devel openssl-devel

  1. 下载pam_mysql-0.7RC1.tar.gz并解压
  2. tar xvf pam_mysql-0.7RC1.tar.gztar.gz -C /usr/local/src/
  3. cd /usr/local/src/pam_mysql-0.7RC1/
  4. ./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/securit
  5. 安装
  6. make && make install

2.安装数据库

3.创建数据库
MariaDB [(none)]> create database ftpdb;
grant all on ftpdb.* to ftpuser@’%’ identified by ‘centos’;

4.使用创建的mysql帐户登录数据库
mysql -uftpuser -h 192.168.153.7 -pcentos
MariaDB [ftpdb]> create table ftpvusers (
-> id int unsigned auto_increment primary key,
-> username char(30),
-> password char(48));
Query OK, 0 rows affected (0.03 sec)

  1. MariaDB [ftpdb]> insert into ftpvusers (username,password) values ('lishuyang',password('centos')),('wangyapeng',password('centos'));

5.配置vsftpd连接mysql用的pam模块
vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=ftpuser passwd=centos host=192.168.153.7 db=ftpdb table=ftpvusers usercolumn=username pas
swdcolumn=password crypt=2
account required pam_mysql.so user=ftpuser passwd=centos host=192.168.153.7 db=ftpdb table=ftpvusers usercolumn=username
passwdcolumn=password crypt=2

6.安装vsftpd
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.mysql

ftp
lftp
wget

wget —ftp-user=fanguodong —ftp-password=123 ftp://192.168.153.7/pub/bigfile -P /root/guodong1.txt

lftpget -c 断点续传

axel -n 50

centos6,centos7 rpcbind
centos5及之前 portmap

第三十八天

NFS
server:
[root@centos7(nanyibo) ~]# systemctl restart nfs
[root@centos7(nanyibo) ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

[root@centos7(nanyibo) ~]# vim /etc/exports
/app/nfsdir1 *(sync)
[root@centos7(nanyibo) ~]# vim /etc/exports.d/dir2.exports
/app/nfsdir2 192.168.153.6(sync)

[root@centos7(nanyibo) ~]# exportfs -r

client:
[root@centos6(nanyibo) ~]# showmount -e 192.168.153.7
Export list for 192.168.153.7:
/app/nfsdir1 *

[root@centos6(nanyibo) ~]# mount 192.168.153.7:/app/nfsdir1 /mnt/nfs1

ro
rw
all_squash 所有人(除root)都被镇压
no_all_squash 所有人(除root)都不被镇压,默认
root_squash root被镇压为nfsnobody,默认
no_root_squash root不被镇压
sync 立即同步
async 异步
anonuid=48 如被镇压,则uid被镇压为指定的uid
anongid=48 如被镇压,则gid被镇压为指定的gid

实验:使用NFS,NIS,AUTOFS实现用户帐号及家目录的漫游。

NIS

  1. [root@centos7(nanyibo) ~]# yum -y install ypserv ypbind yp-tools

2.配置nisdomain
[root@centos7(nanyibo) ~]# vim /etc/sysconfig/network
NISDOMAIN=nan

[root@centos7(nanyibo) ~]# nisdomainname nan

3.配置nis服务的主配置文件
[root@centos7(nanyibo) ~]# vim /etc/ypserv.conf
127.0.0.1:::none
192.168.153.0/255.255.255.0:::none
::*:deny

4.启动nis服务
[root@centos7(nanyibo) ~]# systemctl restart ypserv
[root@centos7(nanyibo) ~]# systemctl enable ypserv

5.创建用户

[root@centos7(nanyibo) ~]# useradd -u 2001 -d /app/homedir/liang liang
[root@centos7(nanyibo) ~]# useradd -u 2000 -d /app/homedir/liuwentao liuwentao
[root@centos7(nanyibo) ~]# for n in {1..5};do useradd -d /app/homedir/nisuser 笔记l - 图109n;echo centos |passwd —stdin nisuser$n;done

并设置密码

[root@centos7(nanyibo) ~]# echo centos |passwd —stdin liuwentao; echo centos |passwd —stdin passwd liang

6.nis生成数据库
[root@centos7(nanyibo) ~]# /usr/lib64/yp/ypinit -m
ctrl+d
y

7.在客户端用setup配置来连接到nis服务,客户端需要确保ypbind安装

NFS

[root@centos7(nanyibo) ~]# yum -y install nfs-utils
[root@centos7(nanyibo) ~]# vim /etc/exports.d/mage.exports
/app/homedir *(rw,sync)
[root@centos7(nanyibo) ~]# systemctl restart nfs

autofs

1.安装autofs
yum -y install autofs
2.配置主配置文件
[root@centos6(nanyibo) ~]# vim /etc/auto.master
/app/homedir /etc/auto.mage —timeout=10

[root@centos6(nanyibo) ~]# vim /etc/auto.mage

    1. -fstype=nfs 192.168.153.7:/app/homedir/&

3.重启autofs服务
[root@centos6(nanyibo) ~]# service autofs restart

实验:在centos7中autofs 可以使用绝对路径以避免基名的上一级目录的原始内容被覆盖

[root@centos7(nanyibo) ~]# vim /etc/auto.master
/- /etc/auto.home

[root@centos7(nanyibo) ~]# vim /etc/auto.home
/home/cdrom -fstype=iso9660 :/dev/cdrom

[root@centos7(nanyibo) ~]# systemctl restart autofs

配置伪根

创建伪装目录
[root@centos7(nanyibo) ~]# mkdir -p /nfsroot/dir{1..2}

进行bind的挂载
[root@centos7(nanyibo) ~]# mount -B /app/nfsdir1 /nfsroot/dir1/
[root@centos7(nanyibo) ~]# mount -B /app/nfsdir2 /nfsroot/dir2/

[root@centos7(nanyibo) ~]# vim /etc/exports
/nfsroot (rw,fsid=0,crossmnt)
/nfsroot/dir1
(rw)
/nfsroot/dir2 *(ro)

[root@centos7(nanyibo) ~]# systemctl restart autofs.service

[root@centos6(nanyibo) ~]# mount 192.168.153.7:/nfsroot/dir1 /mnt/nfs1/

ftp 跨平台服务

NFS 不是跨平台的服务 类unix

linux文件共享服务器 windows

cifs
smb

samba 3.0
4.0
AD ldap

smbpasswd 非交互式设置密码 (echo redhat;echo redhat) |smbpasswd -a baigujing

[global]
workgroup = WORKGROUP 工作组
security = user
server string = Windows 7 Ultimate 6.1 伪装服务名
hosts allow = 172.18. 192.168.153. 客户端可访问的列表
log file = /var/log/samba/%I.log
log level = 2
max log size = 50
config file = /etc/samba/smb.%U.conf
[shared]
comment = Magedu M33 File Server
path = /common
browseable = no
writeable = no
write list = smbadmin, @xiyou

valid users = smb1,smbadmin

public = yes
force create mode = 0775
force directory mode = 0777

客户端挂载
vim /etc/fstab
//172.18.254.96/shared /mnt/ cifs credentials=/etc/samba.txt 0 0

vim /etc/samba.txt
username=wukong
password=redhat

chmod 400 /etc/samba.txt

chcon -Rt samba_share_t /common

smb多用户挂载(仅centos7支持)

server:
useradd -s /sbin/nologin xiaofan
useradd -s /sbin/nologin xiaochen
smbpasswd -a xiaofan
smbpasswd -a xiaochen

  1. 创建共享目录 ,建议用lvm
  2. mkdir /app/smbshared
  3. chcon -t samba_share_t /app/smbshared
  4. setfacl -m u:xiaofan:rwx /app/smbshared
  5. setfacl -m u:xiaochen:rwx /app/smbshared
  6. vim /etc/samba/smb.conf
  7. [gongxiang]
  8. comment = Magedu M33 Gongxiang
  9. path = /app/smbshare
  10. browseable = yes
  11. writeable = no
  12. write list = xiaofan,xiaochen
  13. public = yes
  14. systemctl restart smb

client
yum -y install cifs-utils
vim /etc/multiuser
username=smb1 选择权限低但可以登录的用户
password=redhat

  1. vim /etc/fstab
  2. //172.18.254.96/gongxiang /mnt/ cifs credentials=/etc/multiuser,multiuser,sec=ntlmssp 0 0
  3. mount -a
  4. useradd xiaofan
  5. useradd xiaochen
  6. su - xiaofan
  7. cifscreds add 172.18.254.96

实验:创建baisuzhen,xuxian,fahai,xiaoqing,xushilin,guanyin 六个用户
1.要求以上六个用户都可以浏览并访问目标主机的共享目录leifengta,匿名用户可访问但不可浏览。大小2GB。未来可自动扩展

2.baisuzhen,xuxian,xushilin 可以在该共享目录下创建及删除文件,且彼此之间创建的文件,可以相互修改,其他用户不可创建文件。

3.xuxian,xushilin最多能各自创建200M的数据,且不能删除其他人创建的文件,baisuzhen不受限制.

4.六个用户各自都 有一个以自己名字为名的共享目录,仅自己可见可访问可创建,他人不可见,guanyin对所有目录均有完整权限。

  1. [root@centos7(nanyibo) ~]# for username in baisuzhen xuxian fahai xiaoqing xushilin guanyin ;do useradd -s /sbin/nologin $username ; (echo redhat;echo redhat) |smbpasswd -a $username ;done
    [root@centos7(nanyibo) ~]# mkdir /app/baishezhuan
    [root@centos7(nanyibo) ~]# fdisk /dev/sda
    [root@centos7(nanyibo) ~]# partprobe /dev/sda
    [root@centos7(nanyibo) ~]# pvcreate /dev/sda6
    [root@centos7(nanyibo) ~]# vgcreate vgbaishe /dev/sda6
    [root@centos7(nanyibo) ~]# lvcreate -l +100%FREE -n lvbaishe vgbaishe
    [root@centos7(nanyibo) ~]# mkfs.ext4 /dev/vgbaishe/lvbaishe
    [root@centos7(nanyibo) ~]# vim /etc/fstab
    /dev/vgbaishe/lvbaishe /app/baishezhuan ext4 defaults,usrquota 0 0
    [root@centos7(nanyibo) ~]# mount -a
    [root@centos7(nanyibo) ~]# setfacl -m u:baisuzhen:rwx /app/baishezhuan/
    [root@centos7(nanyibo) ~]# setfacl -m u:xuxian:rwx /app/baishezhuan/
    [root@centos7(nanyibo) ~]# setfacl -m u:xushilin:rwx /app/baishezhuan/

[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
config file = /etc/samba/conf.d/%U.conf

[leifengta]
comment = xi hu leifengta
path = /app/baishezhuan
public = yes
browseable = no
writeable = no

[root@centos7(nanyibo) conf.d]# groupadd baishezhuan
[root@centos7(nanyibo) conf.d]# usermod -aG baishezhuan baisuzhen
[root@centos7(nanyibo) conf.d]# usermod -aG baishezhuan xuxian
[root@centos7(nanyibo) conf.d]# usermod -aG baishezhuan xushilin
[root@centos7(nanyibo) conf.d]# chgrp baishezhuan /app/baishezhuan
[root@centos7(nanyibo) conf.d]# chmod g+s /app/baishezhuan/
[root@centos7(nanyibo) conf.d]# chown baisuzhen /app/baishezhuan/
[root@centos7(nanyibo) conf.d]# chmod o+t /app/baishezhuan/

[root@centos7(nanyibo) samba]# mkdir conf.d
[root@centos7(nanyibo) samba]# cd conf.d/
[root@centos7(nanyibo) conf.d]# vim baisuzhen.conf
[leifengta]
comment = xi hu leifengta
path = /app/baishezhuan
browseable = yes
writeable = yes
force create mode = 0664

  1. [baisuzhen]
  2. comment = baisuzhen
  3. path = /app/common/baisuzhen
  4. browseable = yes
  5. writeable = yes

[root@centos7(nanyibo) conf.d]# vim xiaoqing.conf
[leifengta]
comment = xi hu leifengta
path = /app/baishezhuan
browseable = yes
writeable = no
[xiaoqing]
comment = xiaoqing
path = /app/common/xiaoqing
browseable = yes
writeable = yes

[root@centos7(nanyibo) conf.d]# cat guanyin.conf
[leifengta]
comment = xi hu leifengta
path = /app/baishezhuan
browseable = yes
writeable = no
[baisuzhen]
comment = baisuzhen
path = /app/common/baisuzhen
browseable = yes
writeable = yes
[fahai]
comment = fahai
path = /app/common/fahai
browseable = yes
writeable = yes
[xiaoqing]
comment = xiaoqing
path = /app/common/xiaoqing
browseable = yes
writeable = yes
[xushilin]
path = /app/common/xushilin
browseable = yes
writeable = yes
[xuxian]
comment = xuxian
path = /app/common/xuxian
browseable = yes
writeable = yes
[guanyin]
comment = guanyin
path = /app/common/guanyin
browseable = yes
writeable = yes

[root@centos7(nanyibo) ~]# quotacheck -cum /app/baishezhuan/
[root@centos7(nanyibo) ~]# quotaon /app/baishezhuan/
[root@centos7(nanyibo) ~]# edquota -u xuxian
Filesystem blocks soft hard inodes soft hard
/dev/mapper/vgbaishe-lvbaishe 4 0 200M 1 0 0
[root@centos7(nanyibo) ~]# edquota -p xuxian xushilin

[root@centos7(nanyibo) common]# mkdir baisuzhen xiaoqing fahai xuxian xushilin guanyin
[root@centos7(nanyibo) common]# chown baisuzhen baisuzhen/
[root@centos7(nanyibo) common]# chown fahai fahai/
[root@centos7(nanyibo) common]# chown guanyin guanyin/
[root@centos7(nanyibo) common]# chown xiaoqing xiaoqing/
[root@centos7(nanyibo) common]# chown xushilin xushilin/
[root@centos7(nanyibo) common]# chown xuxian xuxian/
[root@centos7(nanyibo) common]# chmod 700
[root@centos7(nanyibo) common]# setfacl -m u:guanyin:rwx

第四十天

冷备份:
systemctl stop mariadb.service
tar Jcvf /mysql/backup/all-$(date +%F_%T).tar.xz /mysql/data
破坏
恢复 rm -rf /mysql/data/*
tar xvf /mysql/backup/all-2018-10-10_14:20:33.tar.xz -C /
systemctl restart mariadb.service

基于lvm的热备

1.创建基于lvm的数据库
fdisk /dev/sda
partprobe
pvcreate …
vgcreate …
lvcreate
mkfs
mount
chown mysql.mysql -R /mysql
vim /etc/my.cnf
datadir=/mysql/data
log_bin=/mysql/logbin
mysql < hellodb_innodb.sql

2.备份
MariaDB [hellodb]> flush tables with read lock;

MariaDB [hellodb]> flush logs;
Query OK, 0 rows affected (0.03 sec)

MariaDB [hellodb]> show master status;
+———————-+—————+———————+—————————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+———————-+—————+———————+—————————+
| logbin.000008 | 245 | | |
+———————-+—————+———————+—————————+
1 row in set (0.00 sec)

3.创建lvm快照
[root@centos7(nanyibo) data]# lvcreate -n lvdata_snap -L 1G -s -p r /dev/vgmysql/lvdata
4.解锁
MariaDB [hellodb]> unlock tables;

5.增加新数据

6.挂载lvm快照
[root@centos7(nanyibo) data]# mount -o nouuid,norecovery /dev/vgmysql/lvdata_snap /mysql/lvmbackup/

[root@centos7(nanyibo) data]# cp -a /mysql/lvmbackup /mysql/backup/lvm $(date +%F%T)

6.卸载并删除lvm快照
[root@centos7(nanyibo) data]# umount /mysql/lvmbackup/
[root@centos7(nanyibo) data]# lvremove /dev/vgmysql/lvdata_snap

7.模拟崩溃

8.恢复
[root@centos7(nanyibo) data]# systemctl stop mariadb.service
[root@centos7(nanyibo) data]# cp -a /mysql/backup/lvm_2018-10-10_15:17:14/* /mysql/data/
[root@centos7(nanyibo) data]# systemctl start mariadb.service

9.关闭远程的客户访问
vim /etc/my.cnf
skip_networking
重启服务 systemctl restart mariadb.service


iptables -A INPUT -p tcp —dport 3306 -j DROP

10.从二进制文件中恢复
[root@centos7(nanyibo) data]# mysqlbinlog —start-position=245 /mysql/logbin.000004 > /root/bin.sql
[root@centos7(nanyibo) data]# mysqlbinlog /mysql/logbin.000005 >> /root/bin.sql
[root@centos7(nanyibo) data]# mysqlbinlog /mysql/logbin.000006 >> /root/bin.sql

11.从bin.sql中导入来恢复

[root@centos7(nanyibo) data]# mysql < /root/bin.sql

12.恢复客户访问
vim /etc/my.cnf
注释或删除该行skip_networking
重启服务 systemctl restart mariadb.service


iptables -D INPUT -p tcp —dport 3306 -j DROP

mysqldump逻辑备份
[root@centos7(nanyibo) ~]# mysqldump -A -F —single-transaction —master-data=2 > /mysql/backup/fullbak $(date +%F%T).sql
[root@centos7(nanyibo) ~]# ls /mysql/backup/fullbak_2018-10-10_17:25:40.sql
/mysql/backup/fullbak_2018-10-10_17:25:40.sql

产生新数据

查看/mysql/backup/fullbak_2018-10-10_17:25:40.sql 获取二进制文件信息
[root@centos7(nanyibo) ~]# scp /mysql/backup/fullbak_2018-10-10_17:25:40.sql /mysql/logbin/mysql-bin.000014 root@172.18.251.127:/root/
[root@fanfan ~]#iptables -A INPUT -p tcp —dport 3306 -j REJECT
[root@fanfan ~]#mysql < fullbak_2018-10-10_17:25:40.sql
[root@fanfan ~]#mysqlbinlog —start-position=245 mysql-bin.000014 > bin.sql
[root@fanfan ~]#mysql < bin.sql
[root@fanfan ~]#iptables -D INPUT -p tcp —dport 3306 -j REJECT

实验:部分数据误删除的恢复
1.备份
[root@centos7(nanyibo) ~]# mysqldump -A -F —single-transaction —master-data=2 > /mysql/backup/fullbak $(date +%F%T).sql
[root@centos7(nanyibo) ~]# ls /mysql/backup/fullbak_2018-10-10_17:25:40.sql
/mysql/backup/fullbak_2018-10-10_17:25:40.sql

2.产生新数据
MariaDB [hellodb]> insert into students values (26,’Chen Fangyuan’,15,’F’,null,null);
MariaDB [hellodb]> drop table students;
MariaDB [hellodb]> insert into teachers values (5,’Nan Laoshi’,18,’M’);

3.恢复
查看/mysql/backup/fullbak_2018-10-10_17:25:40.sql 获取二进制文件信息

[root@fanfan ~]#mysql < fullbak_2018-10-10_17:25:40.sql
[root@fanfan ~]#mysqlbinlog —start-position=245 mysql-bin.000014 > bin.sql
编辑bin.sql,将其中错误的操作注释或删除,如

DROP TABLE students / generated by server /

保存退出后,导入bin.sql
[root@fanfan ~]#mysql < bin.sql

第四十一天

实验:xtrabackup进行增量备份及还原

1.备份
mkdir /mysql/backup/{full,inc{1,2}}
全备
innobackupex /mysql/backup/full
产生第一次的新数据
第一次增量
innobackupex —incremental /mysql/backup/inc1 —incremental-basedir=/mysql/backup/full/2018-10-12_11-14-47/
产生第二次的新数据
innobackupex —incremental /mysql/backup/inc2 —incremental-basedir=/mysql/backup/inc1/2018-10-12_11-16-04/
备份完成,备份后再产生一次新数据

2.破坏

3.还原 restore
systemctl stop mariadb.service
rm /mysql/data/* -rf
innobackupex —apply-log —redo-only /backup/full/2018-10-12_11-14-47/
innobackupex —apply-log —redo-only /backup/full/2018-10-12_11-14-47/ —incremental-dir=/backup/inc1/2018-10-12_11-16-04/
innobackupex —apply-log /backup/full/2018-10-12_11-14-47/ —incremental-dir=/backup/inc2/2018-10-12_11-17-00/
innobackupex —copy-back /backup/full/2018-10-12_11-14-47/
chown -R mysql.mysql /mysql/data
systemctl restart mariadb.service

4.通过二进制日志恢复 recovery
先读取最后一次增量备份目录下的xtrabackup_binlog_info,获取需要恢复的二进制日志的起始位置
mysqlbinlog —start-position=8057 /mysql/logbin/mysql-bin.000003 > /root/bin.sql
mysql < /root/bin.sql

实验:单表备份。

centos7默认提供的mariadb5.5不支持,需要使用二进制安装mariadb

1.二进制安装,略

配置文件中一定要配置innodb_file_per_table
2.导入数据
mysql < hellodb_innodb.sql

3.安装xtrabackup,略

4.mkdir /mysql/backup/

5.备份表
innobackupex —include=”hellodb.students” /mysql/backup

6.导入表定义的sql
mysql -e “show create table hellodb.students” > /mysql/backup/2018-10-12_11-51-09/hellodb/students.sql

7.破坏,删除表
mysql -e “drop table hellodb.students”

8.还原
innobackupex —apply-log —export /mysql/backup/2018-10-12_11-51-09

9.调整sql
use hellodb;
CREATE TABLE students (\n StuID int(10) unsigned NOT NULL AUTO_INCREMENT,\n Name varchar(50) NOT NULL,\n Age tinyint(3) unsigned NOT NULL,\n Gender enum(‘F’,’M’) NOT NULL,\n ClassID tinyint(3) unsigned DEFAULT NULL,\n TeacherID int(10) unsigned DEFAULT NULL,\n PRIMARY KEY (StuID)\n) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

10.导入表结构
mysql < students.sql

11.discard禁用该表的表空间
mysql -e “alter table hellodb.students discard tablespace”;

12.将复份文件拷入数据目录
cd /mysql/backup/2018-10-12_11-51-09/hellodb/
cp students.cfg students.exp students.ibd /mysql/data/hellodb/

13.激活数据文件
mysql -e “alter table hellodb.students import tablespace”;

CHANGE MASTER TO
MASTER_HOST=’192.168.153.7’,
MASTER_USER=’repluser’,
MASTER_PASSWORD=’centos’,
MASTER_PORT=3306,
MASTER_LOG_FILE=’master-bin.000003’,
MASTER_LOG_POS=7771,
MASTER_CONNECT_RETRY=10;

主从复制

实验:一主一从
1.编辑配置文件
[root@master(nanyibo) ~]# vim /etc/my.cnf
[mysqld]
server_id=1
datadir=/mysql/data
log_bin=/mysql/logbin/master-bin
innodb_file_per_table

[mysql]
prompt=’Master [\d]> ‘
2.启动数据库
[root@master(nanyibo) ~]# systemctl restart mariadb.service

3.创建用户
Master [(none)]> grant replication slave on . to repluser@’192.168.153.%’ identified by ‘centos’;

4.查询当前二进制日志位置
Master [(none)]> show master status;
+—————————-+—————+———————+—————————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————————-+—————+———————+—————————+
| master-bin.000003 | 401 | | |
+—————————-+—————+———————+—————————+
1 row in set (0.00 sec)

5.导入数据
[root@master(nanyibo) ~]# mysql < hellodb_innodb.sql

6.编辑从服务器的配置文件
[root@slave(nanyibo) ~]# vim /etc/my.cnf
[mysqld]
server_id=2
datadir=/mysql/data
innodb_file_per_table

[mysql]
prompt=’Slave [\d]> ‘

[root@slave(nanyibo) ~]# systemctl restart mariadb.service
Slave [(none)]> CHANGE MASTER TO
-> MASTER_HOST=’192.168.153.7’,
-> MASTER_USER=’repluser’,
-> MASTER_PASSWORD=’centos’,
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE=’master-bin.000003’,
-> MASTER_LOG_POS=401,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.06 sec)
CHANGE MASTER TO
MASTER_HOST=’172.18.251.86’,
MASTER_USER=’repluser’,
MASTER_PASSWORD=’centos’,
MASTER_PORT=3306,
MASTER_LOG_FILE=’master-log.000002’,
MASTER_LOG_POS=79568,
MASTER_CONNECT_RETRY=10;

Slave [(none)]> start slave;
show slave status\G;

如果要停止 stop slave; 清空 reset slave all;

实验:如果主服务器已经运行一段时间,有了很多数据,可以先把备份拷到从服务器还原,之后再开启主从同步以后的数据。

1.主服务器配置
server_id=1
datadir=/mysql/data
log_bin=/mysql/logbin/master-bin
innodb_file_per_table

[root@master(nanyibo) ~]# systemctl restart mariadb.service

2.产生大量数据

3.备份主服务器
[root@master(nanyibo) ~]# mysqldump -A -F —single-transaction —master-data=1 > /mysql/backup/all.sql

4.备份后产生一些新数据

5.将备份all.sql拷贝到从服务器

6.编辑从服务器
[mysqld]
server_id=2
datadir=/mysql/data
innodb_file_per_table

[root@slave(nanyibo) ~]# systemctl restart mariadb.service

7.编辑all.sql修改change master to的内容如下:
CHANGE MASTER TO
MASTER_HOST=’192.168.153.7’,
MASTER_USER=’repluser’,
MASTER_PASSWORD=’centos’,
MASTER_PORT=3306,
MASTER_LOG_FILE=’master-bin.000004’,
MASTER_LOG_POS=245,
MASTER_CONNECT_RETRY=10;

8.导入all.sql
[root@slave(nanyibo) ~]# mysql < all.sql

9.Slave [hellodb]> start slave;

实验:配置主从级联复制

master.magedu.com:192.168.153.7
cascade.magedu.com:192.168.153.17
slave1.magedu.com:192.168.153.27
slave2.magedu.com:192.168.153.37

1.配置主服务器
[root@master(nanyibo) ~]# vim /etc/my.cnf
[mysqld]
server_id=1
datadir=/mysql/data
log_bin=/mysql/logbin/master-bin
innodb_file_per_table

[root@master(nanyibo) ~]# systemctl restart mariadb.service

Master [(none)]> show master status;
+—————————-+—————+———————+—————————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————————-+—————+———————+—————————+
| master-bin.000004 | 245 | | |
+—————————-+—————+———————+—————————+
1 row in set (0.00 sec)

Master [(none)]> grant replication slave on . to repluser@’192.168.153.%’ identified by ‘centos’;
Query OK, 0 rows affected (0.01 sec)

2.配置级联服务器
[mysqld]
server_id=2
datadir=/mysql/data
innodb_file_per_table
socket=/var/lib/mysql/mysql.sock
log_bin=/mysql/logbin/cascade-bin
log_slave_updates

[root@cascade(nanyibo) ~]# mkdir /mysql/logbin
[root@cascade(nanyibo) ~]# chown -R mysql.mysql /mysql/

Cascade [(none)]> CHANGE MASTER TO
-> MASTER_HOST=’192.168.153.7’,
-> MASTER_USER=’repluser’,
-> MASTER_PASSWORD=’centos’,
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE=’master-bin.000004’,
-> MASTER_LOG_POS=245,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.07 sec)

Cascade [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

3.配置从服务器
[mysqld]
server_id=3
datadir=/mysql/data
read_only
socket=/var/lib/mysql/mysql.sock

Slave1 [(none)]> CHANGE MASTER TO
-> MASTER_HOST=’192.168.153.17’,
-> MASTER_USER=’repluser’,
-> MASTER_PASSWORD=’centos’,
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE=’cascade-bin.000001’,
-> MASTER_LOG_POS=482,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.05 sec)

Slave1 [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)

从2配置同上。

实验:主主复制

主1:
auto_increment_offset=1
auto_increment_increment=2

CHANGE MASTER TO
MASTER_HOST=’192.168.153.17’,
MASTER_USER=’repluser’,
MASTER_PASSWORD=’centos’,
MASTER_PORT=3306,
MASTER_LOG_FILE=’master2-bin.000003’,
MASTER_LOG_POS=245,
MASTER_CONNECT_RETRY=10;

主2:
auto_increment_offset=2
auto_increment_increment=2

CHANGE MASTER TO
MASTER_HOST=’192.168.153.7’,
MASTER_USER=’repluser’,
MASTER_PASSWORD=’centos’,
MASTER_PORT=3306,
MASTER_LOG_FILE=’master1-bin.000001’,
MASTER_LOG_POS=245,
MASTER_CONNECT_RETRY=10;

半同步:
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’

Master [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

CHANGE MASTER TO
MASTER_HOST=’192.168.153.7’,
MASTER_USER=’repluser’,
MASTER_PASSWORD=’centos’,
MASTER_PORT=3306,
MASTER_LOG_FILE=’master-bin.000003’,
MASTER_LOG_POS=7771,
MASTER_CONNECT_RETRY=10;

第四十二天

主从同步加密:

ca.magedu.com: 192.168.153.37
master.magedu.com: 192.168.153.7
slave.magedu.com: 192.168.153.27

ca中心
每台机器创建mkdir /etc/my.cnf.d/ssl
[root@ca(nanyibo) ssl]# cd /etc/my.cnf.d/ssl
先生成ca中心的公私钥
[root@ca(nanyibo) ssl]# openssl genrsa 2048 > cakey.pem
[root@ca(nanyibo) ssl]# openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650

生成master的公私钥
[root@ca(nanyibo) ssl]# openssl req -newkey rsa:2048 -days 365 -nodes -keyout master.key > master.csr
[root@ca(nanyibo) ssl]# openssl x509 -req -in master.csr -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt

生成slave的公私钥
[root@ca(nanyibo) ssl]# openssl req -newkey rsa:2048 -days 365 -nodes -keyout slave.key > slave.csr
[root@ca(nanyibo) ssl]# openssl x509 -req -in slave.csr -CA cacert.pem -CAkey cakey.pem -set_serial 02 > slave.crt

[root@ca(nanyibo) ssl]# scp -p cacert.pem master. root@192.168.153.7:/etc/my.cnf.d/ssl/
[root@ca(nanyibo) ssl]# scp -p cacert.pem slave.
root@192.168.153.27:/etc/my.cnf.d/ssl/

配置master
[root@master(nanyibo) ~]# vim /etc/my.cnf
[mysqld]
server_id=1
datadir=/mysql/data
log_bin=/mysql/logbin/master-bin
innodb_file_per_table
socket=/var/lib/mysql/mysql.sock
ssl=ON
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem
ssl-cert=/etc/my.cnf.d/ssl/master.crt
ssl-key=/etc/my.cnf.d/ssl/master.key

[root@master(nanyibo) ~]# systemctl restart mariadb.service

Master [(none)]> show variables like ‘%ssl%’;
+———————-+———————————————+
| Variable_name | Value |
+———————-+———————————————+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/my.cnf.d/ssl/cacert.pem |
| ssl_capath | |
| ssl_cert | /etc/my.cnf.d/ssl/master.crt |
| ssl_cipher | |
| ssl_key | /etc/my.cnf.d/ssl/master.key |
+———————-+———————————————+
7 rows in set (0.00 sec)

Master [(none)]> grant replication slave on . to repluser@’192.168.153.%’ identified by ‘centos’ require ssl;
Query OK, 0 rows affected (0.00 sec)

从服务器配置
[root@slave1(nanyibo) ~]# vim /etc/my.cnf
增加
ssl=ON
[root@slave1(nanyibo) ~]# systemctl restart mariadb.service
Slave1 [(none)]> CHANGE MASTER TO
-> MASTER_HOST=’192.168.153.7’,
-> MASTER_USER=’repluser’,
-> MASTER_PASSWORD=’centos’,
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE=’master-bin.000005’,
-> MASTER_LOG_POS=506,
-> MASTER_CONNECT_RETRY=10,
-> MASTER_SSL=1,
-> MASTER_SSL_CA=’/etc/my.cnf.d/ssl/cacert.pem’,
-> MASTER_SSL_CERT=’/etc/my.cnf.d/ssl/slave.crt’,
-> MASTER_SSL_KEY=’/etc/my.cnf.d/ssl/slave.key’;
Query OK, 0 rows affected (0.02 sec)

Slave1 [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

从设置的第二种方法:
Slave1 [(none)]> CHANGE MASTER TO
-> MASTER_HOST=’192.168.153.7’,
-> MASTER_USER=’repluser’,
-> MASTER_PASSWORD=’centos’,
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE=’master-bin.000005’,
-> MASTER_LOG_POS=595,
-> MASTER_CONNECT_RETRY=10,
-> MASTER_SSL=1;
Query OK, 0 rows affected (0.06 sec)

Slave1 [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

永久关闭Selinux和防火墙
节点上开机自启动mariadb-server

实验:mha高可用

mha_manager.magedu.com:192.168.153.7
master.magedu.com:192.168.153.17
slave1.magedu.com:192.168.153.27
slave2.magedu.com:192.168.153.37

配置时间同步
先配置ntpServer
[root@mha_manager(nanyibo) ~]# vim /etc/ntp.conf
restrict 127.0.0.1
restrict ::1
restrict 192.168.153.0 mask 255.255.255.0

server 127.127.1.0

[root@mha_manager(nanyibo) ~]# systemctl restart ntpd
[root@mha_manager(nanyibo) ~]# systemctl enable ntpd

其他主机配置ntpclient
[root@master(nanyibo) ~]# vim /etc/ntp.conf 该设置在下次启动才生效
server 192.168.153.7 iburst
[root@master(nanyibo) ~]# ntpdate 192.168.153.7

配置ssh的等效性
[root@mha_manager(nanyibo) ~]# cd .ssh/
[root@mha_manager(nanyibo) .ssh]# ssh-keygen
[root@mha_manager(nanyibo) .ssh]# ssh-copy-id localhost
[root@mha_manager(nanyibo) ~]# rsync -rav /root/.ssh root@192.168.153.17:/root/
[root@mha_manager(nanyibo) ~]# rsync -rav /root/.ssh root@192.168.153.27:/root/
[root@mha_manager(nanyibo) ~]# rsync -rav /root/.ssh root@192.168.153.37:/root/
另外配置ssh首次连接某主机不要询问yes
[root@mha_manager(nanyibo) ~]# vim /etc/ssh/ssh_config
StrictHostKeyChecking no
另外三个主机同上设置

配置主服务器
[root@master(nanyibo) ~]# vim /etc/my.cnf
[mysqld]
server_id=1
datadir=/mysql/data
innodb_file_per_table
socket=/var/lib/mysql/mysql.sock
log_bin=/mysql/logbin/master-bin
binlog_format=row
skip_name_resolve

[root@master(nanyibo) ~]# systemctl restart mariadb.service
+—————————-+—————-+
| Log_name | File_size |
+—————————-+—————-+
| master-bin.000001 | 245 |
+—————————-+—————-+
1 row in set (0.00 sec)

Master [(none)]> grant replication slave on . to repluser@’192.168.153.%’ identified by ‘centos’;
Query OK, 0 rows affected (0.00 sec)

配置从服务器
[root@slave1(nanyibo) ~]# vim /etc/my.cnf
[mysqld]
server_id=2
datadir=/mysql/data
log_bin=/mysql/logbin/slave-log
read_only=1
relay_log_purge=0
skip_name_resolve=1

[root@slave1(nanyibo) ~]# systemctl restart mariadb.service

Slave1 [(none)]> CHANGE MASTER TO
-> MASTER_HOST=’172.18.251.22’,
-> MASTER_USER=’repluser’,
-> MASTER_PASSWORD=’centos’,
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE=’master-bin.000003’,
-> MASTER_LOG_POS=400 ,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.03 sec)

CHANGE MASTER TO
MASTER_HOST=’172.18.251.22’,
MASTER_USER=’repluser’,
MASTER_PASSWORD=’centos’,
MASTER_PORT=3306,
MASTER_LOG_FILE=’master-bin.000003’,
MASTER_LOG_POS=400,
MASTER_CONNECT_RETRY=10;

Slave1 [(none)]> start slave;
Query OK, 0 rows affected (0.02 sec)

Slave2的配置同上。

配置mha
创建mha统一管理帐号
Master [(none)]> grant all on . to mhauser@’172.18.251.%’ identified by ‘centos’;
Query OK, 0 rows affected (0.00 sec)

安装mha软件包,需要epel源
[root@mha_manager(nanyibo) ~]# yum -y localinstall mha4mysql-*

在其他三个节点上安装node
[root@master(nanyibo) ~]# yum -y localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
[root@slave1(nanyibo) ~]# yum localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
[root@slave2(nanyibo) ~]# yum localinstall mha4mysql-node-0.56-0.el6.noarch.rpm

配置mha
[root@mha_manager(nanyibo) ~]# mkdir /etc/mha
[root@mha_manager(nanyibo) ~]# vim /etc/mha/app1.conf
[server default]
user=mhauser
password=centos
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
master_binlog_dir=/mysql/logbin
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1

[server1]
hostname=192.168.153.17
candidate_master=1
[server2]
hostname=192.168.153.27
candidate_master=1
[server3]
hostname=192.168.153.37

进行检查
[root@mha_manager(nanyibo) ~]# masterha_check_ssh —conf=/etc/mha/app1.conf
[root@mha_manager(nanyibo) ~]# masterha_check_repl —conf=/etc/mha/app1.conf

运行mha
[root@mha_manager(nanyibo) ~]# nohup masterha_manager —conf=/etc/mha/app1.conf > mharun.log &

模拟故障,直接关掉主

在切换成功后,再开启旧的主,将旧的主设置为从。

[root@master(nanyibo) ~]# vim /etc/my.cnf
增加以下两行
read_only=ON
relay_log_purge=0

[root@master(nanyibo) ~]# systemctl restart mariadb.service

Master [(none)]> CHANGE MASTER TO
-> MASTER_HOST=’192.168.153.27’,
-> MASTER_USER=’repluser’,
-> MASTER_PASSWORD=’centos’,
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE=’slave-log.000003’,
-> MASTER_LOG_POS=245,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.05 sec)

Master [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

实验:实现galera高可用

1.配置yum

[base]
name=Centos 笔记l - 图110releasever/
gpgcheck=0

[epel]
name=Fedora EPEL
baseurl=http://172.18.0.1/fedora-epel/![](https://g.yuque.com/gr/latex?releasever%2F#card=math&code=releasever%2F&height=20.919540229885058&width=85.28735632183908)basearch/
gpgcheck=0

[mariadb]
name=Mariadb
baseurl=http://172.18.0.1/centos/Mariadb/
gpgcheck=0
~
在每个节点安装
[root@galera1(nanyibo) ~]# yum -y install MariaDB-Galera-server
[root@galera2(nanyibo) ~]# yum -y install MariaDB-Galera-server
[root@galera3(nanyibo) ~]# yum -y install MariaDB-Galera-server

在每个节点配置以下文件
[root@galera1(nanyibo) ~]# vim /etc/my.cnf.d/server.cnf
[galera]

Mandatory settings

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=”gcomm://192.168.153.17,192.168.153.27,192.168.153.37”
binlog_format=row
wsrep_node_address=192.168.153.17

启动服务
任选一个节点进行首次启动
[root@galera2(nanyibo) ~]# /etc/init.d/mysql start —wsrep-new-cluster
其他节点启动无需加选项
[root@galera1(nanyibo) ~]# /etc/init.d/mysql start
[root@galera3(nanyibo) ~]# /etc/init.d/mysql start

mysqlslap -a —concurrency=10,20 —number-of-queries 1000 —iterations=5 —engine=myisam,innodb —debug-info

Web Server

Prefork
StartServers 5 启动服务时开启几个子进程
MinSpareServers 5 最少的空闲进程数
MaxSpareServers 10 最多的空闲进程数
MaxRequestWorkers 256 最多的并发请求数

Worker
ServerLimit 16 最大的进程数
StartServers 3 启动服务时开启几个子进程
MaxRequestWorkers 150 最多的并发请求数
MinSpareThreads 25 最少空闲的线程数
MaxSpareThreads 75 最多空闲的线程数
ThreadsPerChild 25 每个子进程的线程数

event

/etc/http/conf/httpd.conf
/etc/http/conf.d/.conf
/etc/http/conf.modules.d/
.conf

实验1:在centos7安装rpm包的httpd
[root@centos7(nanyibo) ~]# yum -y install httpd
[root@centos7(nanyibo) ~]# systemctl start httpd
[root@centos7(nanyibo) ~]# vim /var/www/html/index.html

Welcome to magedu.com
实验2:实现基于ip的访问控制
[root@centos7(nanyibo) ~]# vim /etc/httpd/conf/httpd.conf

Require all granted
Require not ip 192.168.153.7

以上内容写在之中

实现白名单

Require ip 192.168.153.7

实现黑名单

Require all granted
Require not ip 192.168.153.7

实验3:了解index, followsymlinks
options
index选项,如果开启,则访问的目录下如果没有index.html,index.php,则会将目录下的文件名列出。(非下载站点,勿开启)
followsymlinks,如果开启,可以访问软链接

实验4:基于AllowOverride实现认证
[root@centos7(nanyibo) html]# vim /etc/httpd/conf/httpd.conf


AllowOverride none
AuthType Basic
AuthName “Please login”
AuthUserfile “/etc/httpd/conf/.htpasswd”
Require user xiaofan

Require valid-user

[root@centos7(nanyibo) ~]# htpasswd -b -c -m /etc/httpd/conf/.htpasswd xiaofan centos
Adding password for user xiaofan
[root@centos7(nanyibo) ~]# htpasswd -b -m /etc/httpd/conf/.htpasswd xiaochen centos
Adding password for user xiaochen

实现组


AllowOverride none
AuthType Basic
AuthName “Please login”
AuthUserfile “/etc/httpd/conf/.htpasswd”
AuthGroupfile “/etc/httpd/conf/.htgroup”
Require group xiaofanzhijia

[root@centos7(nanyibo) ~]# vim /etc/httpd/conf/.htgroup
xiaofanzhijia: xiaofan xiaochen

实验5:虚拟主机
基于端口
[root@centos7(nanyibo) ~]# vim /etc/httpd/conf.d/vhost.conf
Listen 8080
Listen 9090


DocumentRoot “/app/website1”


Require all granted



DocumentRoot “/app/website2”


Require all granted

基于ip
[root@centos7(nanyibo) ~]# vim /etc/httpd/conf.d/vhost.conf


DocumentRoot “/app/website1”


Require all granted



DocumentRoot “/app/website2”


Require all granted


[root@centos7(nanyibo) ~]# ifconfig ens34:0 192.168.153.17/24
[root@centos7(nanyibo) ~]# ifconfig ens34:1 192.168.153.27/24

基于域名的虚拟主机


ServerName www.baidu.com
DocumentRoot “/app/website1”
CustomLog “logs/www.baidu.com_access_log” combined


Require all granted



ServerName bbs.baidu.com
DocumentRoot “/app/website2”
CustomLog “logs/bbs.baidu.com_access_log” combined


Require all granted

实验6:实现https

[root@centos7(nanyibo) ~]# yum -y install mod_ssl
[root@centos7(nanyibo) ~]# cd /etc/pki/CA
[root@centos7(nanyibo) ~]# (umask 066;openssl genrsa -out private/cakey.pem 4096)
[root@centos7(nanyibo) ~]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
[root@centos7(nanyibo) ~]# touch index.txt
[root@centos7(nanyibo) ~]# echo 00 > serial
[root@centos7(nanyibo) ~]# mkdir /etc/httpd/conf.d/ssl
[root@centos7(nanyibo) ~]# cd /etc/httpd/conf.d/ssl
[root@centos7(nanyibo) ~]# (umask 066;openssl genrsa -out httpd.key 1024)
[root@centos7(nanyibo) ~]# openssl req -new -key httpd.key -out httpd.csr
[root@centos7(nanyibo) ~]# openssl ca -in httpd.csr -out httpd.crt -days 365
[root@centos7(nanyibo) ~]# cp /etc/pki/CA/cacert.pem .
[root@centos7(nanyibo) ~]# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key
SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem
[root@centos7(nanyibo) ~]# vim /etc/httpd/conf.d/vhost.conf


ServerName www.baidu.com
DocumentRoot “/app/website1”
CustomLog “logs/www.baidu.com_access_log” combined


Require all granted

基于端口
虚拟机 vmware xen kvm hyper-v virtualbox

httpd
虚拟主机

baidu
sina
qq

http://192.168.153.7:80
http://192.168.153.7
http://192.168.153.17
http://192.168.153.107

www.baidu.com

www.sina.com.cn

www.qq.com

10月19日复习

1.使用status功能查看httpd服务的状态


ServerName www.magedu.com
DocumentRoot “/app/website1”
CustomLog “logs/www.magedu.com_access_log” combined


Require all granted


SetHandler server-status
Require ip 192.168.153

2.curl

web browser : Internel Explorer、Firefox、Chrome、Safari

links elinks curl

curl
-A 伪装客户端信息
curl -A “Safari 10.0” http://www.magedu.com
-e 伪装来源
curl -A “Safari 10.0” -e “http://www.baidu.com/search?hellohttp://www.magedu.com
-k 不验证证书的合法性
-H 指定首部的host
curl -H “host:book.magedu.com” http://192.168.153.7
-I 仅查看首部
curl -I www.microsoft.com

3.压力测试

ab -c 1200 -n 1500 http://www.magedu.com/messages

静态页面

动态站点
在服务端运行 php
在浏览器上运行 js

实验一:基于lamp搭建wordpress blog

  1. [root@centos7(nanyibo) ~]# yum -y install httpd php mariadb-server php-mysql
    [root@centos7(nanyibo) ~]# systemctl stop firewalld; setenforce 0
    [root@centos7(nanyibo) ~]# vim /etc/httpd/conf.d/vhost.conf

    ServerName blog.magedu.com
    DocumentRoot “/app/blog/htdocs”
    CustomLog “logs/blog.magedu.com_access_log” combined

    Require all granted


    [root@centos7(nanyibo) ~]# systemctl restart httpd
    [root@centos7(nanyibo) ~]# vim /etc/my.cnf
    [mysqld]
    ……
    skip_name_resolve
    [root@centos7(nanyibo) ~]# systemctl restart mariadb
    [root@centos7(nanyibo) blog]# mkdir -pv /app/blog
    [root@centos7(nanyibo) blog]# tar xvf wordpress-4.9.4-zh_CN.tar.gz -C /app/blog/
    [root@centos7(nanyibo) blog]# mv wordpress wordpress-4.9.4
    [root@centos7(nanyibo) blog]# ln -sv wordpress-4.9.4 htdocs
    [root@centos7(nanyibo) blog]# ll
    total 4
    lrwxrwxrwx. 1 root root 15 Oct 19 15:32 htdocs -> wordpress-4.9.4
    drwxr-xr-x. 5 nobody nfsnobody 4096 Feb 8 2018 wordpress-4.9.4

[root@centos7(nanyibo) ~]# cd /app/blog/
[root@centos7(nanyibo) blog]# setfacl -m u:apache:rwx htdocs/

[root@centos7(nanyibo) ~]# mysql

MariaDB [(none)]> create database wpdb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on wpdb.* to ‘wpuser’@’192.168.153.%’ identified by ‘wppass’;
Query OK, 0 rows affected (0.02 sec)

编辑windows的hosts
win+r 打开运行:notepad C:\Windows\System32\drivers\etc\hosts
192.168.153.7 blog.magedu.com

[root@centos7(nanyibo) ~]# vim /etc/hosts
192.168.153.7 blog.magedu.com

在浏览器输入域名blog.magedu.com开始安装。

实验二:基于php-fpm模式的lamp搭建phpmyadmin及discuz

[root@centos7(nanyibo) ~]# yum -y install httpd php-fpm php-mysql mariadb-server
[root@centos7(nanyibo) ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip_name_resolve
[root@centos7(nanyibo) ~]# systemctl restart mariadb
[root@centos7(nanyibo) ~]# systemctl stop firewalld
[root@centos7(nanyibo) ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@centos7(nanyibo) ~]# setenforce 0
[root@centos7(nanyibo) ~]# vim /etc/selinux/config
SELINUX=disabled

[root@centos7(nanyibo) ~]# vim /etc/php-fpm.d/www.conf
listen = 0.0.0.0:9000

[root@centos7(nanyibo) ~]# mkdir /var/lib/php/session
[root@centos7(nanyibo) ~]# chown apache.apache /var/lib/php/session
[root@centos7(nanyibo) ~]# systemctl restart php-fpm
[root@centos7(nanyibo) ~]# ss -ntl |grep 9000
LISTEN 0 128 :9000 :*

[root@centos7(nanyibo) ~]# vim /etc/httpd/conf.d/pma.conf
DirectoryIndex index.php

  1. <VirtualHost *:80>
  2. ServerName pma.magedu.com
  3. DocumentRoot /vhosts/pam/htdocs
  4. ProxyRequests Off
  5. ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.153.7:9000/vhosts/pam/htdocs/$1
  6. <Directory "/vhosts/pam/htdocs">
  7. Options None
  8. AllowOverride None
  9. Require all granted
  10. </Directory>
  11. </VirtualHost>

[root@centos7(nanyibo) ~]# cd /vhosts/pam/

[root@centos7(nanyibo) pam]# unzip phpMyAdmin-4.0.10.20-all-languages.zip
[root@centos7(nanyibo) pam]# ln -sv phpMyAdmin-4.0.10.20-all-languages htdocs
‘htdocs’ -> ‘phpMyAdmin-4.0.10.20-all-languages’
[root@centos7(nanyibo) pam]# ll
total 4
lrwxrwxrwx. 1 root root 34 Oct 19 17:27 htdocs -> phpMyAdmin-4.0.10.20-all-languages
drwxr-xr-x. 9 root root 4096 Mar 28 2017 phpMyAdmin-4.0.10.20-all-languages

[root@centos7(nanyibo) htdocs]# cp config.sample.inc.php config.inc.php
[root@centos7(nanyibo) htdocs]# vim config.inc.php
笔记l - 图111i][‘host’] = ‘192.168.153.7’;

[root@centos7(nanyibo) htdocs]# yum -y install php-mbstring
[root@centos7(nanyibo) htdocs]# systemctl restart php-fpm
[root@centos7(nanyibo) htdocs]# mysql

MariaDB [(none)]> grant all on . to ‘root’@’192.168.153.7’ identified by ‘magedu’ with grant option;
Query OK, 0 rows affected (0.00 sec)

通过浏览器输入pma.magedu.com可访问到phpmyadmin并用以上创建的帐户来登录。

安装discuz

[root@centos7(nanyibo) ~]# cd /etc/httpd/conf.d
[root@centos7(nanyibo) conf.d]# cp pma.conf bbs.conf
[root@centos7(nanyibo) conf.d]# vim bbs.conf
DirectoryIndex index.php


ServerName bbs.magedu.com
DocumentRoot /vhosts/bbs/htdocs
ProxyRequests Off
ProxyPassMatch ^/(.*.php)$ fcgi://192.168.153.7:9000/vhosts/bbs/htdocs/$1


Options None
AllowOverride None
Require all granted

在windows的hosts中修改
192.168.153.7 bbs.magedu.com
[root@centos7(nanyibo) conf.d]# mkdir /vhosts/bbs -pv
mkdir: created directory ‘/vhosts/bbs’
[root@centos7(nanyibo) ~]# mkdir /vhosts/bbs/discuz-x3.3
[root@centos7(nanyibo) ~]# mv Discuz_X3.3_SC_UTF8.zip /vhosts/bbs/discuz-x3.3
[root@centos7(nanyibo) ~]# cd /vhosts/bbs/discuz-x3.3
[root@centos7(nanyibo) discuz-x3.3]# unzip Discuz_X3.3_SC_UTF8.zip
[root@centos7(nanyibo) ~]# cd /vhosts/bbs/
[root@centos7(nanyibo) bbs]# ln -s discuz-x3.3/upload htdocs
[root@centos7(nanyibo) bbs]# ll
total 0
drwxr-xr-x. 5 root root 80 Oct 19 17:41 discuz-x3.3
lrwxrwxrwx. 1 root root 18 Oct 19 17:42 htdocs -> discuz-x3.3/upload
[root@centos7(nanyibo) bbs]# setfacl -R -m u:apache:rwx htdocs/

通过phpmyadmin为discuz创建数据库及用户并授权。然后在浏览器上输入bbs.magedu.com进行安装discuz

10月23日

实验1:源码编译安装httpd2.4

1.安装前准备,安装所需要的rpm包
[root@centos7(nanyibo) ~]# yum -y groupinstall “Development Tools”
[root@centos7(nanyibo) ~]# yum -y install pcre-devel apr-devel apr-util-devel openssl-devel

  1. [root@centos7(nanyibo) ~]# tar xvf httpd-2.4.35.tar.bz2 -C /usr/local/src/
    [root@centos7(nanyibo) ~]# cd /usr/local/src/httpd-2.4.35/srclib/
    [root@centos7(nanyibo) srclib]# tar xvf apr-1.6.5.tar.gz
    [root@centos7(nanyibo) srclib]# tar xvf apr-util-1.6.1.tar.gz
    [root@centos7(nanyibo) srclib]# mv apr-util-1.6.1 apr-util
    [root@centos7(nanyibo) srclib]# mv apr-1.6.5 apr

[root@centos7(nanyibo) ~]# cd /usr/local/src/httpd-2.4.35/
[root@centos7(nanyibo) httpd-2.4.35]# ./configure —prefix=/app/httpd24 —sysconfdir=/etc/httpd24 —enable-so —enable-ssl —enable-cgi —enable-rewrite —with-zlib —with-pcre —enable-modules=most —enable-mpms-shared=all —with-mpm=prefork —with-included-apr

[root@centos7(nanyibo) httpd-2.4.35]# make -j 2 && make install
[root@centos7(nanyibo) ~]# useradd -r -u 48 -c “Apache” -d /usr/share/httpd -s /sbin/nologin apache
[root@centos7(nanyibo) ~]# vim /etc/httpd24/httpd.conf
User apache
Group apache
[root@centos7(nanyibo) ~]# /app/httpd24/bin/apachectl restart
[root@centos7(nanyibo) ~]# ps -ef |grep httpd
root 46711 1 0 09:36 ? 00:00:00 /app/httpd24/bin/httpd -k start
apache 46880 46711 0 09:44 ? 00:00:00 /app/httpd24/bin/httpd -k start
apache 46881 46711 0 09:44 ? 00:00:00 /app/httpd24/bin/httpd -k start
apache 46882 46711 0 09:44 ? 00:00:00 /app/httpd24/bin/httpd -k start
apache 46883 46711 0 09:44 ? 00:00:00 /app/httpd24/bin/httpd -k start
apache 46884 46711 0 09:44 ? 00:00:00 /app/httpd24/bin/httpd -k start
root 46886 1812 0 09:44 pts/0 00:00:00 grep —color=auto httpd

配置systemd来管理httpd24
先手动关闭httpd24

[root@centos7(nanyibo) ~]# /app/httpd24/bin/apachectl stop

[root@centos7(nanyibo) ~]# cd /usr/lib/systemd/system
[root@centos7(nanyibo) system]# cp sshd.service httpd24.service
[root@centos7(nanyibo) system]# vim httpd24.service
[Unit]
Description=The Apache HTTP 2.4.35 Server
After=network.target

[Service]
Type=forking
ExecStart=/app/httpd24/bin/apachectl start
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/app/httpd24/bin/apachectl stop
Restart=on-failure

[Install]
WantedBy=multi-user.target
[root@centos7(nanyibo) ~]# systemctl daemon-reload

[root@centos7(nanyibo) ~]# systemctl start httpd24
[root@centos7(nanyibo) ~]# systemctl enable httpd24

2.安装mariadb-server
[root@centos7(nanyibo) ~]# yum -y install mariadb-server mariadb-devel

3.源码编译安装php

一、以模块化安装php-7.2.11

[root@centos7(nanyibo) ~]# yum -y install libmcrypt-devel bzip2-devel libxml2-devel

[root@centos7(nanyibo) ~]# tar xvf php-7.2.11.tar.bz2 -C /usr/local/src/

[root@centos7(nanyibo) ~]# cd /usr/local/src/php-7.2.11/

[root@centos7(nanyibo) ~]#./configure
—prefix=/app/php
—enable-mysqlnd
—with-mysqli=mysqlnd
—with-openssl
—with-pdo-mysql=mysqlnd
—enable-mbstring
—with-freetype-dir
—with-jpeg-dir
—with-png-dir
—with-zlib
—with-libxml-dir=/usr
—enable-xml
—enable-sockets
—with-apxs2=/app/httpd24/bin/apxs
—with-config-file-path=/etc
—with-config-file-scan-dir=/etc/php.d
—disable-fileinfo

[root@centos7(nanyibo) php-7.2.11]# make -j 2 && make install
[root@centos7(nanyibo) php-7.2.11]# cp php.ini-production /etc/php.ini
[root@centos7(nanyibo) ~]# vim /etc/httpd24/httpd.conf
DirectoryIndex index.php index.html

  1. AddType application/x-httpd-php .php
  2. AddType application/x-httpd-php-source .phps

[root@centos7(nanyibo) ~]# /app/httpd24/bin/httpd -t
Syntax OK
[root@centos7(nanyibo) ~]# systemctl restart httpd24

[root@centos7(nanyibo) ~]# vim /app/httpd24/htdocs/info.php
通过浏览器访问 http://192.168.153.7/info.php

配置mysql
[root@centos7(nanyibo) ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve=ON
[root@centos7(nanyibo) ~]# systemctl start mariadb.service

[root@centos7(nanyibo) ~]# mysql

MariaDB [(none)]> create database wpdb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on wpdb.* to ‘wpuser’@’localhost’ identified by ‘wppass’;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> grant all on wpdb.* to ‘wpuser’@’127.0.0.1’ identified by ‘wppass’;
Query OK, 0 rows affected (0.00 sec)

[root@centos7(nanyibo) ~]# vim /app/httpd24/htdocs/conn.php
二、以php-fpm安装php-5.6.38

[root@centos7(nanyibo) ~]# tar xvf php-5.6.38.tar.bz2 -C /usr/local/src/
[root@centos7(nanyibo) ~]# cd /usr/local/src/php-5.6.38/
[root@centos7(nanyibo) php-5.6.38]# ln -sv /usr/lib64/mysql/libmysqlclient.so /usr/lib
[root@centos7(nanyibo) ~]# ./configure —prefix=/app/php56 \

—with-mysql=/usr
—with-openssl
—with-mysqli=/usr/bin/mysql_config
—enable-mbstring
—with-png-dir
—with-jpeg-dir
—with-freetype-dir
—with-zlib
—with-libxml-dir=/usr
—enable-xml
—enable-sockets
—enable-fpm
—with-mcrypt
—with-config-file-path=/etc/php56
—with-config-file-scan-dir=/etc/php56/php.d
—with-bz2

[root@centos7(nanyibo) php-5.6.38]# make -j 2 && make install
[root@centos7(nanyibo) ~]# cd /app/php56/etc/
[root@centos7(nanyibo) etc]# cp php-fpm.conf.default php-fpm.conf
[root@centos7(nanyibo) etc]# vim php-fpm.conf
pid = run/php-fpm.pid
error_log = log/php-fpm.log
pm.status_path = /status
ping.path = /ping
ping.response = pong
pm.max_children = 50

[root@centos7(nanyibo) ~]# mkdir /etc/php56
[root@centos7(nanyibo) ~]# cp /usr/local/src/php-5.6.38/php.ini-production /etc/php56/php.ini
[root@centos7(nanyibo) ~]# cp /usr/local/src/php-5.6.38/sapi/fpm/php-fpm.service /usr/lib/systemd/system
[root@centos7(nanyibo) ~]# vim /usr/lib/systemd/system/php-fpm.service
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/app/php56/var/run/php-fpm.pid
ExecStart=/app/php56/sbin/php-fpm —nodaemonize —fpm-config /app/php56/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
[root@centos7(nanyibo) ~]# systemctl daemon-reload
[root@centos7(nanyibo) ~]# systemctl start php-fpm.service
[root@centos7(nanyibo) ~]# ss -tnl |grep -w 9000
LISTEN 0 128 127.0.0.1:9000 :

[root@centos7(nanyibo) ~]# vim /etc/httpd24/httpd.conf
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

LoadModule php7_module modules/libphp7.so

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

ProxyRequests Off
ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/app/httpd24/htdocs/$1

[root@centos7(nanyibo) ~]# /app/httpd24/bin/httpd -t
Syntax OK
[root@centos7(nanyibo) ~]# systemctl restart httpd24

通过浏览器访问 http://192.168.153.7/info.php

安装wordpress
[root@centos7(nanyibo) ~]# tar xvf wordpress-4.9.4-zh_CN.tar.gz -C /app/httpd24/

[root@centos7(nanyibo) ~]# cd /app/httpd24/

[root@centos7(nanyibo) httpd24]# rm htdocs -rf

[root@centos7(nanyibo) httpd24]# ln -sv wordpress htdocs
‘htdocs’ -> ‘wordpress’

[root@centos7(nanyibo) httpd24]# setfacl -m u:apache:rwx htdocs

php加速 xcache

[root@centos7(nanyibo) ~]# tar xvf xcache-3.2.0.tar.bz2 -C /usr/local/src/
[root@centos7(nanyibo) ~]# cd /usr/local/src/xcache-3.2.0/
[root@centos7(nanyibo) xcache-3.2.0]# /app/php56/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
[root@centos7(nanyibo) xcache-3.2.0]# ./configure —enable-xcache —with-php-config=/app/php56/bin/php-config
[root@centos7(nanyibo) xcache-3.2.0]# make && make install
[root@centos7(nanyibo) ~]# mkdir /etc/php56/php.d
[root@centos7(nanyibo) ~]# cp /usr/local/src/xcache-3.2.0/xcache.ini /etc/php56/php.d
[root@centos7(nanyibo) ~]# vim /etc/php56/php.d/xcache.ini
extension = /app/php56/lib/php/extensions/no-debug-non-zts-20131226/xcache.so
[root@centos7(nanyibo) ~]# systemctl restart php-fpm.service

iptables -L
-nL
-vnL
-nL —line-number

iptables -P INPUT DROP #也可以设置为ACCEPT,不能为REJECT
iptables -F 清空所有策略,但不会影响链上的默认策略

iptables -A 追加策略
iptables -I 插入策略 INPUT 2

iptables -D INPUT -s 192.168.153.1 -j REJECT
iptables -D INPUT 100

iptables -R INPUT 2 -p tcp —dport 8080 -j ACCEPT

模块

icmp模块

  1. icmp-type 8 请求
  2. icmp-type 0 回应
  3. [root@ansible(nanyibo) ~]# iptables -A INPUT -p icmp -j REJECT
  4. [root@ansible(nanyibo) ~]# iptables -A OUTPUT -p icmp -j REJECT
  5. [root@ansible(nanyibo) ~]# iptables -I OUTPUT 1 -p icmp --icmp-type 8 -j ACCEPT
  6. [root@ansible(nanyibo) ~]# iptables -I INPUT 1 -p icmp --icmp-type 0 -j ACCEPT

multiport模块

  1. [root@ansible(nanyibo) ~]# iptables -R INPUT 1 -p tcp -m multiport --dport 21:23,80,53 -j ACCEPT

iprange模块

  1. [root@ansible(nanyibo) ~]# iptables -I INPUT 1 -p tcp --dport 22 -m iprange --src-range 192.168.153.101-192.168.153.103 -j ACCEPT

ipset模块
[root@ansible(nanyibo) ~]# ipset create httplist hash:net maxelem 10000
[root@ansible(nanyibo) ~]# ipset add httplist 192.168.153.101
[root@ansible(nanyibo) ~]# ipset add httplist 192.168.153.102
[root@ansible(nanyibo) ~]# iptables -I INPUT 1 -p tcp —dport 80 -m set —match-set httplist src -j ACCEPT
[root@ansible(nanyibo) ~]# iptables -I OUTPUT 1 -p tcp —sport 80 -m set —match-set httplist dst -j ACCEPT

string&time

  1. [root@ansible(nanyibo) html]# iptables -I INPUT 1 -m string --algo bm --string "google" -j REJECT
  2. [root@ansible(nanyibo) ~]# iptables -R INPUT 1 -m time --timestart 7:00 --timestop 8:55 --weekdays Mon,Thu -m string --algo bm --string "baidu" -j REJECT

connlimit

  1. [root@ansible(nanyibo) ~]# iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 1 -j REJECT

limit

  1. [root@ansible(nanyibo) ~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 8 -j ACCEPT

状态跟踪
[root@ansible(nanyibo) ~]# modprobe nf_conntrack_ftp
[root@ansible(nanyibo) ~]# iptables -I INPUT -p tcp —dport 21 -m state —state NEW -j ACCEPT
[root@ansible(nanyibo) ~]# iptables -I INPUT 2 -m state —state ESTABLISHED,RELATED -j ACCEPT

日志
-j LOG
[root@ansible(nanyibo) ~]# iptables -I INPUT -p tcp —dport 80 -j LOG —log-prefix “new connection:”

网络防火墙

实验环境:

Firewall router: hostname firewall.magedu.com inside ip:192.168.153.7 outsite ip: 10.10.10.7

inside hostname: inside.magedu.com ip:192.168.153.101
outside hostname:outside.magedu.com ip:10.10.10.102

改ip略

在firewalld上开启ip转发
[root@firewall(nanyibo) ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

[root@firewall(nanyibo) ~]# sysctl -p
net.ipv4.ip_forward = 1

在inside
[root@inside(nanyibo) ~]# route add default gw 192.168.153.7

在outside
[root@outside(nanyibo) ~]# route add default gw 10.10.10.7

只允许inside ping outside 不允许outside ping inside

方法一:
[root@firewall(nanyibo) ~]# iptables -A FORWARD -j REJECT
[root@firewall(nanyibo) ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp —icmp-type 8 -j ACCEPT
[root@firewall(nanyibo) ~]# iptables -I FORWARD -d 192.168.153.0/24 -s 10.0.0.0/8 -p icmp —icmp-type 0 -j ACCEPT

方法二:
[root@firewall(nanyibo) ~]# iptables -A FORWARD -j REJECT
[root@firewall(nanyibo) ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp —icmp-type 8 -j ACCEPT
[root@firewall(nanyibo) ~]# iptables -I FORWARD -m state —state ESTABLISHED -j ACCEPT

方法三:
[root@firewall(nanyibo) ~]# iptables -A FORWARD -j REJECT
[root@firewall(nanyibo) ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp -m state —state NEW -j ACCEPT
[root@firewall(nanyibo) ~]# iptables -I FORWARD -m state —state ESTABLISHED -j ACCEPT

NAT

SNAT

[root@firewall(nanyibo) ~]# iptables -t nat -A POSTROUTING -s 192.168.153.0/24 -j SNAT —to-source 172.18.254.96

[root@firewall(nanyibo) ~]# iptables -t nat -A POSTROUTING -s 192.168.153.0/24 -j MASQUERADE

DNAT

[root@firewall(nanyibo) ~]# iptables -t nat -A PREROUTING -d 172.18.254.96 -p tcp —dport 80 -j DNAT —to-destination 192.168.153.101:9527

Ansible

ansible.magedu.com: 192.168.153.7 centos7
node1.magedu.com: 192.168.153.101 centos7
node2.magedu.com: 192.168.153.102 centos7
node3.magedu.com: 192.168.153.103 centos6

[root@ansible(nanyibo) ~]# yum install ansible

ansible-doc
-l 列出所有的模块

  1. module_name 查看指定模块的帮助文档
  2. -s module_name 简单查看模块的帮助文档

[root@ansible(nanyibo) ~]# ansible all -u liubei -k -m command -a ‘id’

[root@ansible(nanyibo) ~]# ansible all -u liubei -k -m command -a ‘ls /root’

[root@ansible(nanyibo) ~]# ansible all -u liubei -k -m command -a “ls /root” -b -K

[root@ansible(nanyibo) ~]# ansible “websrvs” —list
hosts (2):
192.168.153.101
192.168.153.103
[root@ansible(nanyibo) ~]# ansible “dbsrvs” —list
hosts (2):
192.168.153.102
192.168.153.103
[root@ansible(nanyibo) ~]# ansible “websrvs:dbsrvs” —list
hosts (3):
192.168.153.101
192.168.153.103
192.168.153.102
[root@ansible(nanyibo) ~]# ansible “websrvs:&dbsrvs” —list
hosts (1):
192.168.153.103

[root@ansible(nanyibo) ~]# ansible ‘websrvs:!dbsrvs’ —list
hosts (1):
192.168.153.101

ping 模块
command模块 default
shell模块

条件式执行

  1. [root@ansible(nanyibo) ~]# ansible all -a 'removes=/etc/redhat-release1 cat /etc/redhat-release'
  2. 如果removes=的文件不存在,则不执行后面的命令
  3. [root@ansible(nanyibo) ~]# ansible all -a 'creates=/etc/passwd cat /etc/redhat-release'
  4. 如果creates=的文件已经存在,则不执行后面的命令

script 模块
[root@ansible(nanyibo) ~]# ansible all -m script -a ‘/root/f1.sh’

copy 模块
[root@ansible(nanyibo) ~]# ansible all -m copy -a ‘src=/root/selinux_config dest=/etc/selinux/config backup=yes’
[root@ansible(nanyibo) ~]# ansible all -m copy -a ‘src=/etc/passwd dest=/app/mima mode=000 owner=liubei group=bin’
[root@ansible(nanyibo) ~]# ansible all -m copy -a ‘content=”Hello\nWorld\n” dest=/app/f1’

ansible all -m ping
ansible web -a ‘creates=/data2 mkdir /data2’
fetch 模块
[root@ansible(nanyibo) ~]# ansible all -m fetch -a ‘src=/var/log/messages dest=/root/ansible’

  1. 如果要用fetchcopy传输多个文件,只能先打包
  2. [root@ansible(nanyibo) ~]# ansible all -m shell -a 'tar Jcf /root/log.tar.xz /var/log/*.log'
  3. [root@ansible(nanyibo) ~]# ansible all -m fetch -a 'src=/root/log.tar.xz dest=/root/ansible'

cron 模块
[root@ansible(nanyibo) ~]# ansible all -m cron -a ‘minute=* weekday=2,4,6 job=”/usr/bin/wall FBI WARNING” name=warningcron’

  1. 禁用
  2. [root@ansible(nanyibo) ~]# ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI WARNING" name=warningcron'
  3. 启用
  4. [root@ansible(nanyibo) ~]# ansible all -m cron -a 'disabled=false job="/usr/bin/wall FBI WARNING" name=warningcron'
  5. [root@ansible(nanyibo) ~]# ansible all -m cron -a 'name=warningcron state=absent'

file 模块

  1. [root@ansible(nanyibo) ~]# ansible websrvs -m file -a 'name=/app/f1 state=touch'
  2. [root@ansible(nanyibo) ~]# ansible websrvs -m file -a 'name=/app/f2 state=touch mode=644 owner=liubei group bin'
  3. [root@ansible(nanyibo) ~]# ansible websrvs -m file -a 'name=/app/f2 state=absent'
  4. [root@ansible(nanyibo) ~]# ansible websrvs -m file -a 'name=/app/d1 state=directory'
  5. [root@ansible(nanyibo) ~]# ansible websrvs -m file -a 'src=/etc/fstab dest=/app/fstab.link state=link'

hostname 模块

  1. [root@ansible(nanyibo) ~]# ansible 192.168.153.103 -m hostname -a 'name=node3.magedu.com'

yum 模块
[root@ansible(nanyibo) ~]# ansible all -m shell -a ‘rm -rf /etc/yum.repos.d/*’
[root@ansible(nanyibo) ~]# ansible all -m copy -a ‘src=/etc/yum.repos.d/qinghua.repo dest=/etc/yum.repos.d/‘
[root@ansible(nanyibo) ~]# ansible all -m yum -a ‘name=vsftpd’

  1. 安装多个包
  2. [root@ansible(nanyibo) ~]# ansible centos7 -m yum -a 'name=httpd,php-fpm,php-mysql,mariadb-server'
  3. 堡垒机上从互联网下载了一个rpm
  4. 安装本地文件
  5. [root@ansible(nanyibo) ~]# ansible centos7 -m copy -a 'src=/root/vsftpd-3.0.2-22.el7.x86_64.rpm dest=/root'
  6. [root@ansible(nanyibo) ~]# ansible centos7 -m yum -a 'name=/root/vsftpd-3.0.2-22.el7.x86_64.rpm state=present'
  7. yum makecache
  8. [root@ansible(nanyibo) ~]# ansible centos7 -m yum -a 'name=dstat update_cache=yes'

service 模块

  1. [root@ansible(nanyibo) ~]# ansible all -m service -a 'name=vsftpd state=started enabled=yes'
  2. [root@ansible(nanyibo) ~]# ansible centos7 -m service -a 'name=httpd state=restarted'
  3. [root@ansible(nanyibo) ~]# ansible centos7 -m service -a 'name=httpd state=stopped'
  4. [root@ansible(nanyibo) ~]# ansible centos7 -m service -a 'name=httpd enabled=no'

user 模块
[root@ansible(nanyibo) ~]# ansible websrvs -m user -a ‘name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment=”nginx service”‘

  1. [root@ansible(nanyibo) ~]# ansible websrvs -m user -a 'name=nginx state=absent remove=yes'

group 模块

  1. [root@ansible(nanyibo) ~]# ansible websrvs -m group -a 'name=nginx system=yes gid=80'
  2. [root@ansible(nanyibo) ~]# ansible websrvs -m group -a 'name=nginx state=absent'

ansible-galaxy install geerlingguy.nginx

ansible-console

playbook

加密
ansible-vault encrypt /root/ansible/hello.yml
ansible-vault decrypt /root/ansible/hello.yml
ansible-vault view /root/ansible/hello.yml
ansible-vault edit /root/ansible/hello.yml
ansible-vault rekey /root/ansible/hello.yml

[root@ansible(nanyibo) ~]# vim /root/ansible/file.yml

  • hosts: centos7
    remote_user: root
    tasks:
    • name: create new file
      file: name=/app/newfile state=touch
    • name: create new user
      user: name=guanyu system=yes shell=/sbin/nologin
    • name: install package
      yum: name=httpd
    • name: copy html
      copy: content=”Welcome to Magedu\n” dest=/var/www/html/index.html
    • name: start service
      service: name=httpd state=started enabled=yes

[root@ansible(nanyibo) ~]# ansible-playbook /root/ansible/file.yml —limit 192.168.153.101

tags
[root@ansible(nanyibo) ~]# vim /root/ansible/file.yml
—-

  • hosts: centos7
    remote_user: root
  1. tasks:
  2. - name: install package
  3. yum: name=httpd
  4. tags: httpd
  5. - name: copy config
  6. copy: src=/root/ansible/httpd.conf dest=/etc/httpd/conf/
  7. notify: restart service
  8. tags: cpconf
  9. - name: copy html
  10. copy: src=/root/ansible/index.html dest=/var/www/html/
  11. - name: start service
  12. service: name=httpd state=started enabled=yes
  13. tags: httpd
  14. handlers:
  15. - name: restart service
  16. service: name=httpd state=restarted

[root@ansible(nanyibo) ~]# ansible-playbook -t httpd /root/ansible/file.yml

变量


  • hosts: websrvs
    remote_user: root
    tasks:
    • name : install package
      yum : name={{ pkname }}
    • name : start service
      service : name={{ pkname }} state=started enabled=yes

[root@ansible(nanyibo) ~]# ansible-playbook -e ‘pkname=vsftpd’ /root/ansible/app.yml

[root@ansible(nanyibo) ~]# cat /root/ansible/app.yml

  • hosts: websrvs
    remote_user: root
    tasks:
    • name : install package
      yum : name={{ pkname1 }}
    • name : install package2
      yum : name={{ pkname2 }}

[root@ansible(nanyibo) ~]# ansible-playbook -e ‘pkname1=screen pkname2=tree’ /root/ansible/app.yml

把变量定义在playbook当中

[root@ansible(nanyibo) ~]# cat /root/ansible/app.yml

  • hosts: websrvs
    remote_user: root
    vars:
    • pkname1: screen
    • pkname2: tree

tasks:

  • name : install package
    yum : name={{ pkname1 }}
  • name : install package2
    yum : name={{ pkname2 }}

[root@ansible(nanyibo) ~]# ansible-playbook /root/ansible/app.yml

在主机清单中定义全局变量

[root@ansible(nanyibo) ~]# vim /etc/ansible/hosts

[centos7]
192.168.153.101:9527 ipnum=101
192.168.153.102 ipnum=102

[centos7:vars]
nodename=server
domainname=magedu.com

[root@ansible(nanyibo) ~]# vim /root/ansible/file.yml

  • hosts: centos7
    remote_user: root
    tasks:
    • name: install package
      yum: name=httpd
      tags: httpd
    • name: copy config
      copy: src=/root/ansible/httpd.conf dest=/etc/httpd/conf/
      notify: restart service
      tags: cpconf
    • name: copy html
      copy: content=”Welcome to Magedu {{ ipnum }}\n” dest=/var/www/html/index.html
    • name: start service
      service: name=httpd state=started enabled=yes
      tags: httpd

handlers:

  • name: restart service
    service: name=httpd state=restarted

[root@ansible(nanyibo) ~]# ansible-playbook /root/ansible/file.yml

[root@ansible(nanyibo) ~]# curl http://192.168.153.101:8080
Welcome to Magedu 101

[root@ansible(nanyibo) ~]# curl http://192.168.153.102:8080
Welcome to Magedu 102

10月31日

KVM

[root@centos7(nanyibo) ~]# yum -y install libvirt-daemon-kvm qemu-kvm virt-manager libvirt
[root@centos7(nanyibo) ~]# systemctl restart libvirtd

创建http-fpm网桥
[root@centos7(nanyibo) ~]# cd /etc/libvirt/qemu/networks/
[root@centos7(nanyibo) networks]# cp default.xml httpfpm.xml
[root@centos7(nanyibo) networks]# vim httpfpm.xml

httpfpm
06a6d52e-6c03-4b29-bdf7-2cfe6d5e937a








[root@centos7(nanyibo) ~]# virsh net-define /etc/libvirt/qemu/networks/httpfpm.xml
[root@centos7(nanyibo) ~]# virsh net-start httpfpm
[root@centos7(nanyibo) ~]# virsh net-autostart httpfpm

创建php-mysql网桥
[root@centos7(nanyibo) ~]# cd /etc/libvirt/qemu/networks/
[root@centos7(nanyibo) networks]# cp httpfpm.xml phpmysql.xml

phpmysql
06a6d52e-6c03-4b29-bdf7-2cfe6d5e937b








[root@centos7(nanyibo) ~]# virsh net-define /etc/libvirt/qemu/networks/phpmysql.xml
Network phpmysql defined from /etc/libvirt/qemu/networks/phpmysql.xml

[root@centos7(nanyibo) ~]# virsh net-start phpmysql
Network phpmysql started

[root@centos7(nanyibo) ~]# virsh net-autostart phpmysql
Network phpmysql marked as autostarted

创建物理桥

[root@centos7(nanyibo) ~]# nmcli connection add type bridge con-name br0 ifname br0
[root@centos7(nanyibo) ~]# nmcli connection modify br0 ipv4.method manual ipv4.addresses 172.18.254.39/16 ipv4.gateway 172.18.0.1 ipv4.dns 172.18.0.1
[root@centos7(nanyibo) ~]# nmcli connection up br0
[root@centos7(nanyibo) ~]# nmcli connection add type bridge-slave ifname ens33 master br0
[root@centos7(nanyibo) ~]# nmcli connection up bridge-slave-ens33

创建虚拟磁盘文件
[root@centos7(nanyibo) ~]# mkdir -pv /virtualmachines/centos7_base
[root@centos7(nanyibo) ~]# qemu-img create -f qcow2 -o size=80G,preallocation=metadata,compat=1.1 /virtualmachines/centos7_base/centos7.img

[root@centos7(nanyibo) ~]# mount 172.18.0.1:/var/ftp/pub /mnt/
[root@centos7(nanyibo) ~]# virt-manager
安装centos7过程 略

使用console连接centos7需要配置grub
[root@localhost ~]# vim /etc/default/grub
GRUB_CMDLINE_LINUX=”rhgb quiet console=ttyS0”

[root@localhost ~]# grub2-mkconfig > /boot/grub2/grub.cfg

[root@centos7(nanyibo) ~]# mkdir -pv /virtualmachines/{httpd,php,mysql}
mkdir: created directory ‘/virtualmachines/httpd’
mkdir: created directory ‘/virtualmachines/php’
mkdir: created directory ‘/virtualmachines/mysql’
[root@centos7(nanyibo) ~]# cp /virtualmachines/centos7_base/centos7.img /virtualmachines/httpd/httpd.img
[root@centos7(nanyibo) ~]# cp /virtualmachines/centos7_base/centos7.img /virtualmachines/php/php.img
[root@centos7(nanyibo) ~]# cp /virtualmachines/centos7_base/centos7.img /virtualmachines/mysql/mysql.img

[root@centos7(nanyibo) ~]# cd /etc/libvirt/qemu/
[root@centos7(nanyibo) qemu]# cp centos7.5.xml httpd.xml
[root@centos7(nanyibo) qemu]# vim httpd.xml

httpd
a8dbf8ae-d691-4f00-835b-3c29ce8972a0
[root@centos7(nanyibo) qemu]# virsh define httpd.xml
Domain httpd defined from httpd.xml

[root@centos7(nanyibo) qemu]# virsh autostart httpd
Domain httpd marked as autostarted

[root@centos7(nanyibo) qemu]# virsh start httpd
Domain httpd started

网卡的配置

virt-manager 配置httpd mysql php的网卡。

在虚拟机当中配置静态ip

yum -y install bash

nmcli配置ip

kvm部署装3个虚拟机 httpd php-fpm mysql

wok

lamp

httpd

[root@httpd conf.d]# vim /etc/httpd/conf/httpd.conf

DirectoryIndex index.php index.html

[root@httpd conf.d]# vim pma.conf

DirectoryIndex index.php


ServerName bbs.magedu.com
DocumentRoot /vhosts/pma/htdocs


Require all granted

ProxyRequests Off
ProxyPassMatch ^/(.*.php)$ fcgi://10.0.1.3:9000/vhosts/pma/htdocs/$1

[root@php htdocs]# vim /etc/php-fpm.d/www.conf
listen = 0.0.0.0:9000
;listen.allowed_clients = 127.0.0.1

LVS

配置client
[root@client(nanyibo) ~]# nmcli connection add type ethernet ifname ens33 con-name ens33
Connection ‘ens33’ (f85db8da-ca5b-4f39-a09a-8a9d2759f5e7) successfully added.
[root@client(nanyibo) ~]# nmcli connection modify ens33 connection.autoconnect yes ipv4.method manual ipv4.addresses 40.40.40.10/24 ipv4.gateway 40.40.40.254
[root@client(nanyibo) ~]# nmcli connection up ens33
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/18)

配置route

[root@route(nanyibo) ~]# nmcli connection add type ethernet ifname ens38 con-name ens38
[root@route(nanyibo) ~]# nmcli connection modify ens38 connection.autoconnect yes ipv4.method manual ipv4.addresses 40.40.40.254/24
[root@route(nanyibo) ~]# nmcli connection up ens38
[root@route(nanyibo) ~]# nmcli connection add type ethernet ifname ens33 con-name ens33
Connection ‘ens33’ (e05443aa-b3b1-4801-bb40-a04f435f7f27) successfully added.
[root@route(nanyibo) ~]# nmcli connection modify ens33 connection.autoconnect yes ipv4.method manual ipv4.addresses 30.30.30.254/24
[root@route(nanyibo) ~]# nmcli connection modify ens33 +ipv4.addresses 20.20.20.254/24
[root@route(nanyibo) ~]# nmcli connection up ens33

配置director
[root@director(nanyibo) ~]# nmcli connection add type ethernet ifname ens33 con-name ens33
Connection ‘ens33’ (a327fefb-b395-4744-9ab7-b0bc1a26da22) successfully added.
[root@director(nanyibo) ~]# nmcli connection modify ens33 connection.autoconnect yes ipv4.method manual ipv4.addresses 30.30.30.20/24
[root@director(nanyibo) ~]# nmcli connection modify ens33 +ipv4.addresses 20.20.20.20/32 ipv4.gateway 20.20.20.254
[root@director(nanyibo) ~]# nmcli connection up ens33

配置real server1
[root@real-server1(nanyibo) ~]# nmcli connection add type ethernet ifname ens34 con-name ens34
Connection ‘ens34’ (61568fb8-0f0d-437c-8a31-556e7c9a7ec9) successfully added.
[root@real-server1(nanyibo) ~]# nmcli connection modify ens34 connection.autoconnect yes ipv4.method manual ipv4.addresses 30.30.30.30/24 ipv4.gateway 30.30.30.254
[root@real-server1(nanyibo) ~]# nmcli connection up ens34

[root@real-server1(nanyibo) ~]# vim setpara.sh

!/bin/bash

vip=20.20.20.20
mask=’255.255.255.255’
iface=”lo:0”

case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $iface $vip netmask $mask broadcast $vip up
route add -host $vip dev $iface
;;
stop)
ifconfig $iface down

  1. echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
  2. echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  3. echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
  4. echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
  5. ;;

*)
echo “Usage $(basename $0) start|stop”
exit 1
;;
esac

[root@real-server1(nanyibo) ~]# chmod +x setpara.sh
[root@real-server1(nanyibo) ~]# ./setpara.sh start
[root@real-server1(nanyibo) ~]# ifconfig lo:0
lo:0: flags=73 mtu 65536
inet 20.20.20.20 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)

[root@real-server2(nanyibo) ~]# nmcli connection add type ethernet ifname ens34 con-name ens34
Connection ‘ens34’ (b6a7afda-e904-468b-8ca1-d3879200def6) successfully added.
[root@real-server2(nanyibo) ~]# nmcli connection modify ens34 connection.autoconnect yes ipv4.method manual ipv4.addresses 30.30.30.40/24 ipv4.gateway 30.30.30.254
[root@real-server2(nanyibo) ~]# nmcli connection up ens34
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/9)
[root@real-server2(nanyibo) ~]# ./setpara.sh start
[root@real-server2(nanyibo) ~]# ifconfig lo:0
lo:0: flags=73 mtu 65536
inet 20.20.20.20 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)

在real-server上安装httpd
[root@real-server1(nanyibo) ~]# yum -y install httpd

[root@real-server2(nanyibo) ~]# yum -y install httpd

sed -i ‘s/ $/\n/‘ jixianaddr:10.142.194.88.txt

[root@director(nanyibo) ~]# curl 30.30.30.30


r1.magedu.com website

r2.magedu.com website

在director上配置lvs

[root@director(nanyibo) ~]# yum -y install ipvsadm
[root@director(nanyibo) ~]# systemctl start ipvsadm
[root@director(nanyibo) ~]# ipvsadm -A -t 20.20.20.20:80 -s wrr
[root@director(nanyibo) ~]# ipvsadm -a -t 20.20.20.20:80 -r 30.30.30.30 -g -w 1
[root@director(nanyibo) ~]# ipvsadm -a -t 20.20.20.20:80 -r 30.30.30.40 -g -w 3
[root@director(nanyibo) ~]# systemctl restart ipvsadm
[root@director(nanyibo) ~]# systemctl enable ipvsadm

keepalived


  1. :alpha: ↩︎
  2. Ss ↩︎
  3. :space: ↩︎
  4. [:space:] ↩︎
  5. [:space:] ↩︎
  6. [:space:] ↩︎
  7. [:space:] ↩︎