在Linux这个系统当中,几乎所有的硬件设备文件都在/dev这个目录内。举例来说,IDE介面的硬盘的文件名称即为/dev/hd[a-d],其中, 括号内的字母为a-d当中的任意一个,亦即有/dev/hda,/dev/hdb, /dev/hdc, 及 /dev/hdd这四个文件的意思。Linux通过设备名访问设备,设备存放在/dev目录下。
[root@centos7 ~]# ll /dev/sd*
brw-rw---- 1 root disk 8, 0 8月 28 23:40 /dev/sda # 第一块磁盘sda,第二块磁盘sdb,a、b区分主磁盘
brw-rw---- 1 root disk 8, 1 8月 28 23:40 /dev/sda1 # 第一块磁盘下面的分区1,SCSI接口硬盘
brw-rw---- 1 root disk 8, 2 8月 28 23:40 /dev/sda2 # 第一块磁盘下的分区2
分区数字编号1~4只能里给主分区或扩展分区使用,逻辑分区是在扩展分区基础上,所以编号只能从5开始。
linux环境下没有盘符的概念,要对磁盘设备进行操作,需要使用磁盘设备名;要操作文件则需挂装创建在分区或逻辑卷上的文件系统
Linux系统对分区的要求
linux系统至少要有/分区
swap(交换分区)的作用:虚拟内存,swap分区的大小=1.5*物理内存的容量,内存大于16G时,虚拟内存给8~16就行了。
建议建立对立的boot分区
数据库服务器正常不需要swap分区,因为虚拟的内存的速率跟不上。
常规分区方案
/ 剩余硬盘大小
swap 1.5倍
/boot 100M
DB及存储的分区方案
/data/ 剩余磁盘大小
/ 50~200G
swap 1.5倍
/boot 100M
相当于windows不能只分c盘,还需要D E,重装系统数据可能会丢。
门户网站案例
/ 50~200G
swap 1.5倍
/boot 100M
不再进行分区,保留,将来哪个需要用,再根据需求再分
以下分区几乎没有必要:
/usr
/home
/var
LVM,目录满了就在线调整分区大小,LVM性能差
生产场景 硬件RAID(DELL),组合多块磁盘,而不是LVM或者软RAID
用户相关的命令
查看当前用户 whoami
添加用户 useradd/adduser dandy1;
修改密码 passwd dandy + 密码
不指定则修改当前用户密码;普通用户不能修改其他人的密码
切换用户 su - oldboy 把参数全部切换成oldboy的
不交互改密码 echo 123456|passwd --stdin dandy
但是查看history的时候可以看到明文密码
history -d 111 干掉固定行号
history -c 全部干掉
centos安装软件包管理工具
yum是centos软件包管理工具,二进制软件包一般是rpm包。由于centos的内置默认软件源是指向国外的,一般情况下下载更新软件包都会很慢,很浪费时间,所以需要将其修改为国内的软件镜像源。
查看软件镜像源文件
cat /etc/yum.repos.d/CentOS-Base.repo
一切修改的最基本条件是留一份原文件存档
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
这里我们使用如下的地址
http://mirrors.163.com/.help/centos.html
选择你对应的centos版本,右键复制链接地址
进入到软件镜像源目录:
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
wget后面的是自己右键复制的地址,粘贴上去就好了。
cp CentOS7-Base-163.repo CentOS-Base.repo
也可以用mv命令。。此时就替换好了。
正常的教程到这里会让你更新一下软件包,但是这里,我们选择不更新,更新的越多,下载的软件包越多,系统越重,并且漏洞发生的几率或更高、安全性降低。
安装基础软件包
yum install tree telnet dos2unix sysstat lrzsz -y 默认不提示
-y代表手动命令安装软件的所有提示确认的命令都不需要确认了,不再提示确认内容。
关闭selinux
cat /etc/selinux/config
三种状态:
enforcing 激活状态
permissive 不激活,但是打印警告
disabled 不加载
可以直接vim 修改状态
sed -i s#SELINUX=enforcing#SELINUX=disabled#g /etc/selinux/config
再查看一下修改
[root@centos7 yum.repos.d]# grep "disabled" /etc/selinux/config
# disabled - No SELinux policy is loaded.
SELINUX=disabled
[root@centos7 yum.repos.d]#
通过命令查看系统状态
getenforce # 查看状态,显示还是Permissive
查询系统状态的时候,你会发现还是显示Permissive,因为系统只有重启过才能更改过来。
setenforce 0 # 临时将状态改成Permissive
此时系统的状态已经更改过来,而当系统重启后,虽然会消失,但是系统配置中已经更改成disabled,所以也就都ok了
修改linux机器运行模式
模式简介
0 关机模式
1 单用户模式,一般用来改密码
2 多用户模式
3 命令行模式
4 没有使用
5 X11桌面模式,图形化界面
6 重启模式
模式的切换
centos6.5 cat /etc/inittab 直接修改runlevel
runlevel查看当前模式
vi /etc.inittab ==> id:3:initdefault:修改成5
init + 数字
CentOS7 systemctl set-default graphical.target
systemctl set-default multi-user.target
优化开机启动项
一般基础启动项
crond (定时任务)
network (网络服务)
rsyslog (系统日志功能)
sshd (远程链接服务)
Centos6优化方式
1、ntsysv
2、setup-system service
3、脚本一键完成处理
查看所有命令行模式的启动
chkconfig --list|grep "3:on" 查看所有模式3下开机启动项
chkconfig udev-post off/on 默认关闭23456运行模式里面的开机自启动/关闭
chkconfig --list udev-post 列出某一条所有模式下的启动模式
如何关闭呢?
思路一(先全部关闭,在打开需要开启的服务)
for dandy in `chkconfig --list|grep "3:on"|awk '{print $1}'`;do chkconfig $dandy off;done
for dandy in crond network sshd rsyslog;do chkconfig $dandy on;done
$dandy是变量,对for循环的变量操作。
思路二(只关闭不需要的服务)
for dandy in `chkconfig --list|grep "3:on"|awk '{print $1}'|grep -vE "crond|network|sshd|rsyslog"`;do chkconfig $dandy off;done
grep -i 不区分大小写的过滤 grep -Ei "a|b" dandy.txt
grep -E = egrep # 并列条件,同时过滤多个字符串
-v取消原输出,反转查找
Centos7优化
CentOS 7由于使用systemd而不是init,所以不能通过修改inittab文件来修改开机启动模式。
systemctl get-default # 获取默认的系统
systemctl set-default multi-user.target # 设置默认模式
systemctl set-default graphical.target
systemctl list-unit-files | grep enabled # 查看当前模式的开机启动项,enabled是开机启动,disabeld是不启动
systemctl disable firewalld.service # 开机不启动某个服务
systemctl stop firewalld.service # 暂停服务
systemctl enable apache.service # 开机启动
systemctl status mysqld # 查询某个服务状态
systemctl start docker.service # 开启某个服务
最小化原则
1)安装系统最小化
安装的软件包越少,磁盘空间越小,软件漏洞相对越少
2)开启程序服务最小化
3)操作最小化原则
4)登陆最小化原则。
平时没有需求,不要用root登陆
5)权限最小化原则
6)配置参数合理,不要最大化
远程登陆
windows远程登陆及管理员账户
administrator 3389
linux远程登陆及管理员账户
root 22
这种常用设置,大家都知道,可能不安全,需要修改端口或用户名,增加迷惑性,安全性。
修改ssh端口
1、先备份!先备份!!!cp /a /a.backup
2、vim /etc/ssh/sshd_config
取消port注释、修改port端口比如改到52113
PermitRootLogin:no # 禁止root远程登陆
UseDNS:no # 禁止使用DNS
PermitEmptyPasswords:no
GSSAPIAuthentication:no
输入行号 + gg、定位到具体行
3、/etc/init.d/sshd reload # 重新加载
/etc/init.d/sshd restart # 重启服务
关闭防火墙
/etc/init.d/iptables stop 关闭防火墙
查看网络状态
查看网络状态lntup或者an 可以通过man netstat查看
netstat -an|grep ip(服务器ip)查看网络状态
netstat [address_family_options] [--tcp|-t] [--udp|-u] [--udplite|-U]
[--sctp|-S] [--raw|-w] [--listening|-l] [--all|-a] [--numeric|-n]
[--numeric-hosts] [--numeric-ports] [--numeric-users] [--symbolic|-N]
[--extend|-e[--extend|-e]] [--timers|-o] [--program|-p] [--verbose|-v]
[--continuous|-c] [--wide|-W] [delay]
netstat {--route|-r} [address_family_options]
[--extend|-e[--extend|-e]] [--verbose|-v] [--numeric|-n]
[--numeric-hosts] [--numeric-ports] [--numeric-users] [--continuous|-c]
[delay]
.....
查看端口状态
netstat -lntup|grep 22
# 或者
lsof -i :22
修改sudo的配置文件
使用visudo来编辑sudo的配置文件,相当于直接编辑'vim /etc/sudoers',建议不要手动去改,visudo有语法检查。
:set nu 显示行号
98gg 光标定位到98行
yy 复制当前行
p 粘贴
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
93 dandy ALL=(ALL) ALL
可以将用户dandy最后的ALL改成/usr/sbin/useradd(多条的话使用逗号把命令连起来就可以),这样dandy变只拥有执行useradd的权限了,需要使用sudo useradd + 用户名才能使用
[dandy@centos7 ~]$ sudo useradd test_user
[sudo] password for dandy:
[dandy@centos7 ~]$ tail -1 /etc/passwd
test_user:x:1001:1001::/home/test_user:/bin/bash
修改dandy最后的ALL到NOPASSWD:ALL(表示不需要密码)
user MACHINE= COMMANDS
root ALL=(ALL) ALL
oldboy ALL=(ALL) /usr/sbin/useradd
用户 机器=(授权哪个角色的权利) /usr/sbin/useradd
%用户组 机器=(授权哪个角色的权利) /usr/sbin/useradd
查看当前用户有那些权限:
[root@centos7 ~]# sudo -l
匹配 %2$s 上 %1$s 的默认条目:
!visiblepw, always_set_home, match_group_by_gid, env_reset,
env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
用户 root 可以在 centos7 上运行以下命令:
(ALL) ALL
[dandy@centos7 ~]$ sudo -l
Matching Defaults entries for dandy on centos7:
!visiblepw, always_set_home, match_group_by_gid, env_reset,
env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User dandy may run the following commands on centos7:
(ALL) NOPASSWD: ALL
linux系统环境变量
控制linux命令所在的路径,相当于window环境变量PATH,查看系统环境变量
[dandy@centos7 ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dandy/.local/bin:/home/dandy/bin
可以发现系统环境变量通过: 进行分割,同样的可以按照windows的思路,添加一个系统环境变量
1、mkdir /dandy 创建目录
2、vi /dandy/dandy 添加内容echo 'hello dandy'
3、chmod +x /dandy/dandy 增加权限
执行上述文件命令
1、根据绝对路径直接执行
[dandy@centos7 /]$ /dandy/dandy
hello dandy
2、添加路径到系统环境变量,再执行
PATH=$PATH:/dandy 但是这个是临时有效
dandy hello dandy
永久有效的添加环境变量
echo 'PATH=/dandy/:$PATH' >> /etc/profile
source /etc/profile 让文件生效
使用单引号添加,会把这句话添加进去,双引号会将变量转化成结果添加到文件内,不合适
[dandy@centos7 /]$ tail -5 /etc/profile
done
unset i
unset -f pathmunge
PATH=/dandy/:$PATH
测试
[dandy@centos7 /]$ dandy
hello dandy
[dandy@centos7 /]$ which dandy
/dandy/dandy
并且在/etc下面加的命令是对全局都生效的,所有用户都可以使用。如果是在普通文件下加的话,可以在.bash_profile里面添加,可以使用cat .bash_profile来查看下
修改中文字符显示(建议不做)
字符集是一套文字符号及其编码,查看当前字符集编码
[dandy@centos7 /]$ echo $LANG
en_US.UTF-8
默认字符集路径及修改
centos6
cat /etc/sysconfig/i18n
CentOS7
cat /etc/locale.conf LANG="en_US.UTF-8"调整为LANG="zh_CN.GB18030"
最后 source + 路径让它生效
Linux时间同步服务
安装
yum install ntp
获取网上最新时间
centos7 ntpdate -d ntp.sjtu.edu.cn
centos6 /usr/sbin/ntpdate time.nist.gov
创建更新的定时任务
echo '#time sync by dandy at 2018-08' >> /vae/spool/cron/root # 追加到定时任务的配置文件
echo '*/5 * * * * ntpdate -d ntp.sjtu.edu.cn >/dev/null 2>&1' >>/var/spool/cron/root
>/dev/null 2>&1默认情况是1,也就是等同于1>/dev/null 2>&1。意思就是把标准输出重定向到“黑洞”,还把错误输出2重定向到标准输出1,也就是标准输出和错误输出都进了“黑洞” ,然后再追加到cron的root文件内
检查是否再cron内存在
crontab -l 检查是否存在
这边可以去百度一下如何配置ntp server,网上的内容很多,楼主觉得没必要学再记录,仁者见仁,智者见智。
修改文件描述符
查看当前文件描述符大小
[root@centos7 ~]# ulimit -n
1024
加大文件描述符(临时),重启后消失
[root@centos7 ~]# ulimit -HSn 65535
[root@centos7 ~]# ulimit -n
65535
写入配置文件,永久生效
echo '* - nofile 65535' >>/etc/security/limits.conf
文件描述符太小,不够用,进程会起不来,当然文件描述符也不是越大越好。
调整内核参数
内核参数文件
/etc/sysctl.cnf
修改文件,将下面的内容插入
#关闭ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# 避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 开启恶意icmp错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1
#关闭路由转发
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
#开启反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
#处理无源路由的包
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
#关闭sysrq功能
kernel.sysrq = 0
#core文件名中添加pid作为扩展名
kernel.core_uses_pid = 1
# 开启SYN洪水攻击保护
net.ipv4.tcp_syncookies = 1
#修改消息队列长度
kernel.msgmnb = 65536
kernel.msgmax = 65536
#设置最大内存共享段大小bytes
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
#timewait的数量,默认180000
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144
#限制仅仅是为了防止简单的DoS 攻击
net.ipv4.tcp_max_orphans = 3276800
#未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
#内核放弃建立连接之前发送SYNACK 包的数量
net.ipv4.tcp_synack_retries = 1
#内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 1
#启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1
#开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
#当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 30
#允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65000
#修改防火墙表大小,默认65536
#net.netfilter.nf_conntrack_max=655350
#net.netfilter.nf_conntrack_tcp_timeout_established=1200
# 确保无人能修改路由表
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
通过命令生效
sysctl -p 生效
隐藏版本号和内核号
cat /cat/issue
>/etc/issue 重定向清空
cat /dev/null >/etc/issue 清空,把issue变成空
锁定关键文件
chattr +i /etc/passwd /etc/shadow
/etc/passwd 用户文件
/etc/shadow 用户密码文件
/etc/group 用户组文件
/etc/gshadow 组的密码文件
/etc/inittab 开机启动文件
锁定之后root都不能操作,用chattr -i 解锁
which chattr
/usr/bin/chattr
mv /usr/bin/chattr /usr/bin/dandy 修改命令,隐藏掉命令
这样就算黑客厉害到能拿到root账户,也不知道解锁的命令是哪一个
查看内容是不是加锁了 有一个i
lsattr /etc/passwd
----i----------- /etc/passwd
优化总结
1、不用root、添加普通用户,通过sudo授权管理
2、更改默认的远程连接ssh服务端口及禁止root用户远程连接
3、定时自动更新服务器时间
4、配置yum更新源,从国内更新源下载rpm包
5、关闭selinux及iptables(iptables工作场景如果有wan ip一般要打开,高并发除外)
6、调整文件描述符大小
7、定时自动清理/var/pool/clientqueue目录的垃圾文件,防止inodes节点被占满(6.4已经就没有了,可以不配)
8、精简开机自启动服务
9、linux内核参数优化
10、更改字符集,支持中文,建议还是英文字符集,防止乱码
11、锁定关键系统文件
12、清空/etc/issue,去除内核跟系统版本的屏幕显示