Linux博大精深。我只在此讨论一些我对线上Linux机器维护人员的基本需求,比如装机,加硬盘,配网络。只讨论CentOS 6,或者类似的RHEL,当然Ubuntu也可以此类推,但是一些新特性不予讨论,因为我不懂,比如CentOS 7的xfs不予讨论,并不是说xfs不好,而是以目前我的Linux水平需要更新很多xfs的知识,驾驭需要时间。CentOS 7将ifconfig,netstat等原来常用的命令也干掉了,用ip,lsof替换是更加好的工具,但是大部分的线上机器都应该还没有更新到 CentOS 7。下面我们以CentOS 6作为基础,谈我认为最基本的4点。
CentOS有一个minimal版本,相对于标准版去掉了很多Service,比如Network Manager,安装最小版本以后的网络配置是需要admin进行写配置文件的。我个人认为这样是比较好的,因为这样才能知道Linux内核真正关心的是 哪些配置文件,直达核心。一些必要的 监控工具 ,完全可以通过yum install来完成。作为线上机器,还是最小化安装,做到能不开的服务就不开,能关掉的端口就关掉,这样既能将宝贵的硬件资源留下来给应用程序,也能够做到更加的安全。
除了将能关的端口关掉,能不用的服务关掉以外,安全还需要做到特定的服务只能访问特定的内容。哪怕是root账户,不能访问的文件和文件夹还是不能 访问,更加不能操作。开启SELinux以后,能够做到在不修改SELinux的情况下,指定的服务只能访问指定的资源。对于ssh要做到关闭账户密码登 录,只能通过秘钥登录,这样在保证秘钥不被盗用的情况下是最安全的。
我们经常会遇到这样一个问题,假设将磁盘sda挂载到/var目录,但是由于log太多或者上传的文件等等其他因素将硬盘吃光了,再创建一块sdb 磁盘就无法挂载到/var目录了,其实Linux自带的lvm已经解决了这个问题,并且CentOS默认就是用lvm来管理磁盘的。我们需要学会如何格式 化一块硬盘为lvm,然后挂载到对应目录,在空间被吃光前能够添加一块硬盘就自动扩容。
Linux本地要利用好net_filter,也就是iptables,来规划服务哪些网络流量,抛弃哪些网络流量。以及在进行组网的时候需要用 router来进行网关的创建,在遇到网络问题的时候通过netstat来查看网络访问异常。网络这块内容很多很杂,各种参数,TCP/IP协议栈等等, 但是往往问题还就是出在网络这块,所以要给与高度的关注。
小谈几点我对Linux的认识。
Linux将所有的事物都看成文件,这一点人尽皆知。我想说的是,除了传统的ext文件系统,Linux在抽象不同的资源的时候其实有各种不同的文 件系统,都是从需求和使用出发,比如proc文件系统就是针对进程的抽象,使得修改对应进程的值就可以直接改变进程的行为。再比如,对于远程ssh登录的 pts设备,Linux有对应的devpts文件系统。看下面表哥的type一栏。
file_system | dir | type | options | dump | pass |
---|---|---|---|---|---|
/dev/mapper/VolGroup-lv_root | / | ext4 | defaults | 1 | 1 |
UUID=xxx | /boot | ext4 | defaults | 1 | 2 |
/dev/mapper/VolGroup-lv_swap | swap | swap | defaults | 0 | 0 |
tmpfs | /dev/shm | tmpfs | defaults | 0 | 0 |
devpts | /dev/pt | devpts | gid=5,mod=620 | 0 | 0 |
sysfs | /sys | sysfs | defaults | 0 | 0 |
proc | /proc | proc | defaults | 0 | 0 |
Linux的 -rwxrwxrwx
权限管理也可谓人尽皆知,其实Linux自己也意识到了这样的权限管理所带来的一些局限性。首先rwx的权限管理是基于用户和组的,并且只是大致的分为 owner|group|other
这三类,无法再作更加细粒度的划分。有鉴于此,Linux目前默认是有ACL(Access Control List)管理的,所谓ACL就是能够提供更加细粒度的用户和组管理,比如可以明确哪个user可以有什么样的权限。如下示例
getfacl abc # file: abc # owner: someone # group: someone user::rw- user:johny:r-x group::r-- mask::r-x other::r--
而SELinux提供了不基于用户与组的权限管理,SELinux是基于应用程序的,什么样的应用程序可以使用什么资源,对于这些资源这个应用程序能干嘛,这个就是SELinux的管理方式。
Linux上的Service组织得非常清晰, /etc/init.d/
里面包含了所有的Service启动脚本,对应的二进制文件在 /usr/bin 、 /usr/sbin 、 /usr/local/bin
等目录下,一般而言配置文件在 /etc/app_name
下,还有一个chkconfig的工具来管理各个 runlevel
下需要启动的Service。这样的约定俗成使得管理员在配置和使用的时候非常方便。Linux标准的Service都会将log记录到 /var/log/messages
中,使得系统管理员不需要翻阅各种log,直接在 /var/log/messages
中就可以找到绝大部分的log来判断当前系统是否正常。更甚者, syslogd
被 rsyslogd
替换以后,可以将/var/log/messages中的内容通过UDP发送到远端用专业的log分析工具进行分析。我们需要学习Linux上Service的这些优秀的编程习惯和技巧。
根据$1中的需求,下面是我记录的一些基本的磁盘操作。
df -lah
查看磁盘的使用情况 fdisk -l
查看插入到磁盘驱动器中的硬盘; sd(a,b,c)(1,2,3),其中a是第一块磁盘,b是第二块磁盘,1,2,3表示磁盘上的主分区,最多4个。用fdisk从磁盘创建分区并且格式化。 mount -t type(ext4|nfs) /dev/sdxn /path/dir
来挂载。如果要重启生效,必须将挂载信息写入到 /etc/fstab
vmstat
, top
等工具来查看。和性能相关的调优和监控留待后续文章详述。 网络的坑很多,需要把网络搞通没个3,4年很难。下面从网络的配置文件着手,简单理一下网络方面的内容。网络最难的方面应该是如何搭建一个合理的高效的局域网或者城域网,这个需要有专业的网络知识。
/etc/hosts
私有IP对应主机名 /etc/resolv.conf
nameserver DNS的IP /etc/sysconfig/network
其中NETWORKING=要不要有网络,HOSTNAME=主机名,NETWORKING_IPV6=支持ipv6否 /etc/sysconfig/network-scripts/ifcfg-xxx
其中DEVICE=网卡代号,BOOTPROTO=是否使用dhcp,HWADDR,IPADDR,NETMASK,ONBOOT,GATEWAY router -n
查看路由的命令,特别是要看带G的,表示gateway,而带U的表示up。 netstat -anp
查看所有启动的 tcp
, udp
, unix stream
的应用程序,以及他们的状态,具体可以参考 TCP/IP,JavaSocket简单分析 一文。 PAM只需要简单了解就行,是一个可插拔的认证模块。我的理解是:开发Linux的极客们搞出来的可复用的一个组件。举个例子,现在有一个app,想要验证当前的登录用户是否有权限操作某个目录,那么在PAM里面有现成的模块,app只需要 include
这个模块,给出一个配置文件,就可以了。有一个非常好的关于PAM的视频教程,请看 这里
/etc/pam.d/xxx
是能用pam来进行管理的应用程序PAM设置,在安装应用程序的时候安装。 /etc/security/mmm
, /lib/security/pam_mmm
是一套。 SELinux也有一个非常好的视频教程,请看 这里
getenforce
来查看SELinux是否被启用 /etc/sysconfig/selinux enforcing
启用SELinux 下面是学习时候的一些摘录。特别一点,要开启内核参数 net.ipv4.ip_forward=1
,在 /etc/sysctl.conf
文件中,用 sysctl -p
来保存。所谓ip_forward指的是内核提供的从一个iface到另外一个iface的IP包转发,比如将IP包从192.168.1.10的eth0转发到10.0.0.123的eth1上。防火墙配置是需要专业技能的。
ldd bin_file
出来没有 libwrap.so
的,都不能用tcp_wrapper 一个好的Linux命令参考网站
top
特别注意load ps aux
和 ps -ef
特别注意进程状态 vmstat 1
表示每秒采集一次 sar -u 1
查看所有cpu相关的运行时间 free
vmstat 1
注意其中的swap ram block之间的关系 sar -r 1
内存使用率 sar -W 1
查看swap,查询是否由于内存不足产生大量内存交换 lsof -i:port
查询哪个进程占用了这个端口号 lsof -u username
用户打开的文件 lsof -p pid
进程打开的文件