Linux系统管理员面试50题

大多数Python程序都是要在服务器端运行的,而服务器端主要的操作系统是Linux.学习Linux系统管理是你成为大牛程序员的必经之路,让我们看看成为Linux系统管理员都需要具备哪些知识和技能?

  1. 命令nslookup是做什么的?
  2. 你如何把CPU占用率最高的进程显示出来?
  3. 如果检查Linux上开放的端口,并将不用的端口屏蔽掉?
  4. 什么是Linux?它和Unix有什么不同?
  5. 详细描述Unix系统启动的过程?
  6. 如何修改文件权限,如何创建一个只读文件?
  7. 详细介绍SUDO命令,它的缺点是什么?
  8. UDP和TCP之间有什么区别?
  9. 描述Linux机器启动的顺序.
  10. 设计一个3层的Web应用.
  11. 概述你如何将互联网流量导入子网.
  12. 你对虚拟化了解吗?它好用吗?
  13. 不同级别的RAID有什么不同?对于Web服务器和数据库服务器你会使用哪一级别的RAID?
  14. 说出开源社区最近的一些开发进展.
  15. 你是否向开源项目做过贡献?
  16. 系统工程师和系统管理员有什么区别?解释一下?
  17. 列出一些系统专家不道德的行为.
  18. 通常情况下Linux系统的交换分区是多大?
  19. 没有名字的目录在Linux系统中表示什么?
  20. 如何列出目录中的所有文件,包括隐藏文件?
  21. 如何添加一个没有登录权限的新的系统用户?
  22. 说明什么是硬链接?硬链接被删除会发生什么?
  23. 系统管理员执行这条命令会发生什么:chmod 444 chmod?
  24. 如何找出一个Linux系统的共有IP和私有IP?
  25. 用bash发邮件如何带附件?
  26. 说出一些在服务器上使用的Linux发行版.
  27. 说明在Linux上重新安装Grub的最简便的方式?
  28. 什么是记录,NS记录,PTR记录,CNAME记录,和MX记录?
  29. 什么是僵尸进程?做什么会导致僵尸进程?
  30. 我们什么时候选择使用脚本,而不是编译型程序?
  31. 如何创建一个简单的主从集群?
  32. 删除一个文件链接的源文件会发生什么?
  33. FTP服务器如何限制访问IP?
  34. 说明Linux的目录结构,/usr/local文件夹里放的是什么?
  35. 什么是git?解释它的结构和工作原理?
  36. 你如何在中午十二点发一封邮件给100个人?
  37. 描述ZFS文件系统.
  38. 如何修改Linux系统的默认运行级别?
  39. 如何修改Linux的内核参数?
  40. 说明SSH和Telnet之间的区别.
  41. 你如何虚拟化一个Linux物理机?
  42. 告诉我一些古怪的Linux命令.
  43. 解释HTTPS的工作原理.
  44. 你知道tor浏览器么?解释它的原理.
  45. 如何在下次启动机器的时候触发强制系统检查?
  46. 你喜欢什么备份技术?
  47. 解释一些SWAP分区.
  48. 解释一下ping死亡攻击.
  49. 你如何嗅探IP包的内容.
  50. OSI层次结构如何确保数据包抵达正确的地址?

    欢迎大家和我一起探讨答案!

Keepalived高可用集群实践

keepalived

1、keepalived初识

Keepalived软件起初是转为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个节点的状态,后来又加入了可以实现高可用的VRRPG功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx,Haproxy,MySQL等)的高可用解决方案软件。

Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面的节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

keepalived软件的官网是:www.keepalived.org

2、keepalived服务的三个重要功能

  • 管理LVS负载均衡软件

早期的LVS软件,需要通过命令行或脚本实现管理,并且没有针对LVS节点的健康检查功能,为了解决LVS的这些使用不便的问题,keepalived就诞生了,可以说,Keepalived软件起初是专为解决LVS的问题而诞生的。因此,Keepalived和LVS的感情很深,它们的关系如夫妻一样,可以紧密的结合,愉快的工作。Keepalived可以通过读取自身的配置文件实现通过更底层的接口直接管理LVS的配置以及控制服务启动、停止等功能,这使得LVS的应用更加简单方便了。LVS和Keepalived的组合应用此文暂不讨论。

  • 实现对LVS集群节点健康检查功能(healthcheck)

Keepalived可以通过在自身的Keepalived.conf文件里配置LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点同时发生故障无法提供服务时,Keepalived服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后,Keepalived服务又会自动地把他们加入到正常转发队列中,对客户提供服务。

  • 作为系统网络服务的高可用功能(failover)

Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡、Nginx反向代理这样的服务器。

Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时 ,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。

3、Keepalived高可用故障切换转移原理

Keepalived高可用服务对之间的故障切换转移,是通过VRRP(Virtual Route Redundancy Protocol,虚拟路由冗余协议)来实现的。

在Keepalived服务正常工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主Master节点发生故障时,就无法发送心跳消息,备节点 也就因此无法继续检测到来自主Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

那么什么是VRRP呢?

VRRP,全称为Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。

VRRP早期是用来解决交换机、路由器等设备单点故障的,下面是交换、路由的Master和Backup切换原理描述,同样也适用于Keepalived的工作原理。

在一组VRRP路由器集群中,有多台物理VRRP路由器,但是这多台物理的机器并不是同时工作的,而是由一台称为Master的机器负责路由工作,其他的机器都是Backup。Master角色并不是一成不变的,VRRP会让每个VRRP路由参与竞选,最终获胜的就是Master。获胜的Master有一些特权,比如拥有虚拟路由器的IP地址等,拥有系统资源的Master负责转发发送给网关地址的包和相应ARP请求。

VRRP通过竞选机制来实现虚拟路由的功能,所有的协议报文都是通过IP多播(Multicast)包(默认的多播地址为224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个众所周知的mac地址:00-00-5E-00-01-{VIDR}。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因Master的改变而修改自己的路由配置。对他们来说,这种切换是透明的。

在一组虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广播包(VRRP Advertisement messages),此时Backup不会抢占Master。当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master。这种抢占是非常快速的(可能只有1s甚至更少),以保证服务的连续性。出于安全性考虑,VRRP数据包使用了加密协议进行了加密。

4、keepalived高可用服务单实例实战

配置keepalived主服务器lb01 Master

[code lang=”bash”]

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id <span style="color: #ff0000;">lb01</span>
}

vrrp_instance VI_1 {
state <span style="color: #ff0000;">MASTER</span>
interface eth0
<span style="background-color: #00ffff;">virtual_router_id 51</span>
priority <span style="color: #ff0000;">150</span>
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.100.200/24 dev eth0 label eth0:1
}
}

[/code]

实战配置keepalived备服务器lb02 BACKUP

[code lang=”bash”]
! Configuration File for keepalived

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id <span style="color: #ff0000;">lb02</span>
}

vrrp_instance VI_1 {
state <span style="color: #ff0000;">BACKUP</span>
interface eth0
<span style="background-color: #00ffff;">virtual_router_id 51</span>
priority <span style="color: #ff0000;">100</span>
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.100.200/24 dev eth0 label eth0:1
}
}

[/code]

5、关于Keepalived高可用服务器的“裂脑”问题
什么是裂脑:
由于某些原因,导致两台高可用服务器对在指定的时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并且在正常运行,这样就会导致同一个IP或服务在两段同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两段的数据不一致或造成数据丢失,这种情况就被成为裂脑。

导致裂脑的原因:

  1. 高可用服务器之间心跳线链路发生故障,导致无法正常通信。
  2. 高可用服务器上开启了iptables防火墙阻挡了心跳消息传输。
  3. 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
  4. 其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件bug等。

注意:Keepalived配置里同一VRRP实例如果virtual_route_id两端参数配置不一致,也会导致烈脑问题的发生。

关于NFS客户端挂载与mount的几点探讨

最近在学习网络文件系统(NFS),发现mount这个学问很多,在这里总结一下。

NFS客户端开机自动挂载的方法:

第一种方法:将挂载命令写入/etc/rc.local

缺点:偶尔开机挂载不上,工作中除了开机自动配置,还要对是否挂载做监控。

第二种方法:将挂载命令放在/etc/fatab里

单这种配置方法有个误区:fstab会先于网络被Linux系统加载。网络没启动时执行fstab会导致连接不上NFS服务器端,无法实现开机挂载。而且,即使是本地文件,也要注意,fstab最后两列要设置为 0 0.否则有可能会导致无法启动服务器的问题。因此NFS网络文件系统最好不要放在fstab里实现开机挂载。

PS:关于ubuntu系统每次开机都会有1分30秒的等待时间

fstab这个文件大家最好不要乱动,修改前先做备份,我之前就由于不小心删除了一个条目,导致无法开机。由于我电脑装了4个系统,三个linux系统(Ubuntu、Kali、Deeoin),都公用一个swap分区,每次重装或者更改系统时Linux会自动格式化swap分区,导致了这与ubuntu中/etc/fatab中记录的uuid不一样,然后就开机漫长的等待1分30秒才开机,出现:A start job is running for dev-disk-by/x2uuid-7ea*.device(**/1min30s )这样的提示,导致开机也未挂载上swap.解决方法如下:

[code lang=”bash”]
jian@N4010:~$ sudo blkid
[sudo] jian 的密码:
/dev/sda1: UUID="54DE803EDE801A7E" TYPE="ntfs" PARTUUID="ad078914-01"
/dev/sda5: UUID="46957b90-fc30-47ca-b256-049e267e7cf5" TYPE="ext4" PARTUUID="ad078914-05"
/dev/sdb1: UUID="2661b44d-6408-4b1c-b92c-2ab42deca270" TYPE="ext4" PARTUUID="000cf9af-01"
/dev/sdb5: UUID="120e4dc8-74a4-4573-bff0-1685412ca365" TYPE="swap" PARTUUID="000cf9af-05"
/dev/sdb6: LABEL="M-hM-=M-/M-dM-;M-6" UUID="0000678400004823" TYPE="ntfs" PARTUUID="000cf9af-06"
/dev/sdb7: LABEL="M-fM-^VM-^GM-fM-!M-#" UUID="0000678400004823" TYPE="ntfs" PARTUUID="000cf9af-07"
/dev/sdb8: LABEL="M-eM-(M-1M-dM-9M-^P" UUID="0000678400004823" TYPE="ntfs" PARTUUID="000cf9af-08"
/dev/sdb9: LABEL="M-eM-^JM-^^M-eM-^EM-," UUID="0000678400004823" TYPE="ntfs" PARTUUID="000cf9af-09"
/dev/sdb10: UUID="43409185-fa0a-4e17-96f1-f666685aa81e" TYPE="ext4" PARTUUID="000cf9af-0a"
[/code]

使用sudo fdisk -l产看所有分区信息,找到swap对应的swap分区如下:

/dev/sdb5 156258304 167772159 11513856 5.5G 82 Linux 交换 / Solaris

将sbd5对应的UUID=”120e4dc8-74a4-4573-bff0-1685412ca365″,重新写入到fstab:

[code language=”bash”]

jian@N4010:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use ‘blkid’ to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type><options> <dump> <pass>
# / was on /dev/sda5 during installation
UUID=46957b90-fc30-47ca-b256-049e267e7cf5 / ext4 errors=remount-ro 0 1
# swap was on /dev/sdb5 during installation
UUID=120e4dc8-74a4-4573-bff0-1685412ca365 none swap sw 0 0

[/code]

从启发现再没有恼人的1分30秒等待了

二、关于fstab中的格式与参数说明,MAN给出的信息如下:

The first field (fs_spec).—->This field describes the block special device or remote filesystem to be mounted.

The second field (fs_file).—->This field describes the mount point for the filesystem. For swap partitions, this field
should be specified as `none’. If the name of the mount point contains spaces these can be
escaped as `\040′.

The third field (fs_vfstype).—->This field describes the type of the filesystem.

The fourth field (fs_mntops).T—->his field describes the mount options associated with the filesystem.

The fifth field (fs_freq).—->:This field is used by dump(8) to determine which filesystems need to be dumped. Defaults to
zero (don’t dump) if not present.(意思是是否要转储,应该是读写缓存的意思,实时读写就是0,防止因异常断电导致的数据丢失。)

The sixth field (fs_passno).—->This field is used by fsck(8) to determine the order in which filesystem checks are done at
boot time. The root filesystem should be specified with a fs_passno of 1. Other filesystems
should have a fs_passno of 2. Filesystems within a drive will be checked sequentially, but
filesystems on different drives will be checked at the same time to utilize parallelism
available in the hardware. Defaults to zero (don’t fsck) if not present.

(大概意思是:通过此字段来设置启动时检测文件系统的顺序应该 1 指定文件系统其他文件系统应该用  2。按顺序检查驱动器文件系统不同驱动器文件系统同时利用并行性检查硬件可用默认值零不检查)

所以不重要的文件系统可以设置为0 0,防止因为一些异常而无法开机。

三、fstab与mount的关系

通过mount -o指定挂载参数与在/etc/fstab里指定挂载参数的效果是一样的。

执行mount -a会自动执行/etc/fstab中的挂载参数。(mount  -a, –all  —-> mount all filesystems mentioned in fstab)

四、NfS客户端挂载优化(考虑安全与性能两个方面)

兼顾到安全与性能的挂载方式:

[code lang=”bash”]mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 10.0.100.128:/date/nfs  /mnt/share[/code]

如果是本地文件系统,使用如下命令:

[code lang=”bssh”]mount  /dev/sdb5 /mnt -o defaults,async,noatime,data=writeback,barrier=0[/code]

本地文件系统挂载时,如果加nodirtime会报错。

五、NFS内核优化建议#NFS内核优化建议

[code lang=”bash”]

vim /etc/sysctl.conf

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
ne.core.wmem_max = 16777216

执行sysctl -p生效 [/code]

注:如果卸载的时候提示:“umount:/mnt:device is busy”,注意需要退出挂载的目录在进行卸载,如果是NFS server宕机了,则需要强制卸载,可执行umount -lf /mnt
大型网站NFS网络文件系统的替代软件为分布式文件系统Moosefs(mfs)、GlusterFS、FastDFS.

 

Linux 系统启动过程

Linux 系统启动过程

linux启动时我们会看到许多启动信息。

Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段:

  • 内核的引导。
  • 运行init。
  • 系统初始化。
  • 建立终端 。
  • 用户登录系统。

内核引导

当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。

操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

bg2013081702


运行init

init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。

init 程序首先是需要读取配置文件 /etc/inittab。

 

运行级别

  • 许多程序需要开机启动。它们在Windows叫做”服务”(service),在Linux就叫做”守护进程”(daemon)。
  • init进程的一大任务,就是去运行这些开机启动的程序。
  • 但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。
  • Linux允许为不同的场合,分配不同的开机启动程序,这就叫做”运行级别”(runlevel)。也就是说,启动时根据”运行级别”,确定要运行哪些程序。

bg2013081704

Linux系统有7个运行级别(runlevel):

  • 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
  • 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
  • 运行级别2:多用户状态(没有NFS)
  • 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
  • 运行级别4:系统未使用,保留
  • 运行级别5:X11控制台,登陆后进入图形GUI模式
  • 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

系统初始化

在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

l5:5:wait:/etc/rc.d/rc 5

这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些连接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。

而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。

/etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的连接文件,对于以以S开头的启动脚本,将以start参数来运行。

而如果发现存在相应的脚本也存在K打头的连接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。

这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。

至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的”System Services”来自行设定。

bg2013081705


建立终端

rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。

init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。

同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。


用户登录系统

一般来说,用户的登录方式有三种:

  • (1)命令行登录
  • (2)ssh登录
  • (3)图形界面登录

 

  • 对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。
  • 而本文主要讲的还是文本方式登录的情况:当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。
  • Linux的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。
  • 然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。
  • 这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。

/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

<p在分析完用户名后,login将搜索 etc=”” passwd以及=”” shadow来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为=”” bin=”” bash。<=”” p=”” style=”color: rgb(51, 51, 51); font-family: ‘Open Sans’, ‘Helvetica Neue’, Helvetica, Arial, STHeiti, ‘Microsoft Yahei’, sans-serif; font-size: 12px; white-space: normal; background-color: rgb(255, 255, 255);”>


图形模式与文字模式的切换方式

Linux预设提供了六个命令窗口终端机让我们来登录。

默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们。

如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按Ctrl + Alt + F1 ~ F6来进入其中一个命令窗口界面。

当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。

如果你用的vmware 虚拟机,命令窗口切换的快捷键为 Alt + Space + F1~F6. 如果你在图形界面下请按Alt + Shift + Ctrl + F1~F6 切换至命令窗口。

 


Linux 关机

在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。

正确的关机流程为:sysnc > shutdown > reboot > halt

关机指令为:shutdown ,你可以man shutdown 来看一下帮助文档。

例如你可以运行如下命令关机:

sync 将数据由内存同步到硬盘中。

shutdown 关机指令,你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机:

shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。

Shutdown –h now 立马关机

Shutdown –h 20:25 系统会在今天20:25关机

Shutdown –h +10 十分钟后关机

Shutdown –r now 系统立马重启

Shutdown –r +10 系统十分钟后重启

reboot 就是重启,等同于 shutdown –r now

halt 关闭系统,等同于shutdown –h now 和 poweroff

最后总结一下,不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中。

关机的命令有 shutdown –h now halt poweroff 和 init 0 , 重启系统的命令有 shutdown –r now reboot init 6.


Linux 系统启动过程>>转载自:http://www.imooc.com/wiki/detail/id/1230

iptables 企业场景应用–实例

#!/bin/bash
#2016-06-17 zhixiang from immoc
#iptables rules
##################################################
#ftp 内核模块
modprobe ipt_MASQUERADE
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
#清除所有规则
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X

#################################################
# -p 默认规则设置
iptables -P INPUT DROP
iptables -A INPUT -m state –state ESTABLISH,RELATED -j ACCEPT

iptables -A INPUT -i lo ACCEPT

iptables -A INPUT -p tcp -m multiport –dport 110,80,25 -j ACCEPT
#允许内网只能访问文件共享
iptables -A INPUT -p tcp -s 10.0.100.0/24 –dport 139 -j ACCEPT

iptables -A INPUT -i eth1 -p udp -m multiport –dport 53 -j ACCEPT

#开放vpn(pptp),gre隧道
iptables -A INPUT -p tcp –dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT

#限速
iptables -A INPUT -s 192.168.100.0/24 -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp –syn -m connlimit –connlimit-above 15 -j DROP

#禁止ping
iptables -A INPUT -p icmp -j DROP

# NAT转发:内网访问外网通过ppp0
iptables -t nat -A POSTROUTING -O PPPO -S 10.0.100.0/24 -j MASQUERADE

#########################################################
#防攻击策略
iptables -N syn-flood
iptables -A INPUT -p tcp –syn -j syn-flood
iptables -I syn-flood -p tcp -m limit –limit 3/s –limit-burst -j RETURN
iptables -A syn-flood -j REJECT

###########################################################
#转发规则
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 10.0.100.0/24 -m multiport –dport 80,110,21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 10.0.100.0/24 –dport 53 -j ACCEPT
iptables -A FORWARD -p gre -s 10.0.100.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 10.0.100.0/24 -j ACCEPT

#########################################################
#访问控制
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -p udp –dport -m string –string “tencent” -m time –timestart 8:00 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

iptables -I FORWARD -p udp –dport -m string –string “TENCENT” -m time –timestart 8:00 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

iptables -I FORWARD -p udp –dport -m string –string “tencent” -m time –timestart 14:00 –timestop 17:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

iptables -I FORWARD -p udp –dport -m string –string “TENCENT” -m time –timestart 14:00 –timestop 17:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#限制访问web QQ
iptables -I FORWARD -s 10.0.100.0/24 -m string “qq.com” -m time –timestart 8:00 –timestop 18:00 –days Mon,Tus,Wed,Tus,Fri,Sat -j DROP
#禁止访问关键词网址
iptables -I FORWARD -s 10.0.100.0/24 -m string –string “av1024.net” -j DROP
iptables -I FORWARD -D 10.0.100.0/24 -m string –string “eroticism” -j DROP
#禁止bt下载
iptables -A FORWARD -m ipp2p –edk –kazaa –bit -J DROP

#内核相关模块
#开启数据包转发,防止syn攻击
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null

#确保管理员的ip有绝对的访问权限
iptables -I INPUT -s 10.0.100.15 -j ACCEPT
iptables -I FORWARD -s 10.0.100.15 -j ACCEPT

iptables中NAT模式设置–SNAT

iptables防火墙nat表规则配置s数据包在规则表、链匹配流程

场景模拟:我在虚拟机中搭建了三台服务器,其中一台webserver:ip 10.0.100.128,另一台centos作为Nat sever,配置两块网卡(网卡1:10.0.100.129,网卡2:192.168.100.128),另一台Ubuntu server 作为Client,访问web server,其ip为:192.168.100.129,很显然他们ip不再同一网段内,所以无法互通,接下来我们通过Snat规则,使ubuntu server能访问到位于10.0.100.128上的web server。其网络拓扑结构如下:

SNAT场景模拟

其中10.0.100.128的iptables规则如下:
#!/bin/bash
#20160715 >> /etc/rc.local 开机启动
#清除所有规则
iptables -F
#开放ssh端口
iptables -I INPUT -p tcp –dport 52022 -j ACCEPT
#开放本地回环请求
iptables -I INPUT -i lo -j ACCEPT
#状态放行(本地请求)
iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
#开放网段
iptables -I INPUT -p tcp -s 10.0.100.0/24 -j ACCEPT
#开启开发服务端口
iptables -I INPUT -p tcp –dport 80 -j ACCEPT
#开放VPN端口
#iptables -I INPUT -p tcp –dport 1723 -j ACCEPT
#允许icmp数据包,允许ping
iptables -I INPUT -p icmp -j ACCEPT
#拒绝未被允许的数据包
iptables -A INPUT -j REJECT
#显示所有规则
iptables -nL
#保存所有规则到配置文件中
#/etc/init.d/iptables save

接下来需要配置Nat server:首先打开内核数据包转发功能。vim /etc/sysctl.conf修改net.ipv4.ip_forward = 1,
然后执行sysctl -p使参数立即生效。然后配置iptables 转发规则:iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT –to 10.0.100.135,将所有流经网卡192.168.100.0/24网段的数据都由10.0.100.135这块网卡转发出去。
最后我们在Client上增加一块默认网关为192.168.100.128,将请求的数据有Nat server转发。命令为:sudo route add default gw 192.168.100.128,
测试结果如下:
QQ截图20160717134659

python3 tab键自动补全

bash 的一大特点就是tab自动补全功能,是否python中也有这个功能呢?别说还真有,哈哈。不过需要我们配置以下,先写一个脚本:

[code lang=”python”]
#!/usr/bin/python3
##########################################################
# File Name: tab.py
# Author:Zhixiang
# mail:zhixiang_uestc@126.com
# Created Time:2016年07月09日 星期六 14时15分35秒
##########################################################
# python startup file
import sys
import readline
import rlcompleter
import atexit
import os
# tab completion
readline.parse_and_bind(‘tab: complete’)
# history file
histfile = os.path.join(os.environ[‘HOME’], ‘.pythonhistory’)
try:
readline.read_history_file(histfile)
except IOError:
pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter
[/code]
然后在脚本的目录下运行python3,然后导入这个模块:(不加.py后缀)
[code lang=”python”]
import tab
ipmort sys
sys.(此时按tab键就可以自动出现sys下所有的模块了!)
[/code]
我发现python3真的很好用,而且只用导入一次,一劳永逸,不用像python2每次退出后必须重新导入。
PS:python3与python2的不同:python3使用print()进行输输出,输入用input(),并且好像废弃了raw_input()

ulimit命令(Shell内建命令)

ulimit命令用来限制系统用户对shell资源的访问。如果不懂什么意思,下面一段内容可以帮助你理解: 假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。 而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大 小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联 系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。 ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。 作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。

语法 ulimit      (选项) 选项

[code lang=”plain”]
-a:显示目前资源限制的设定;
-c :设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制; -t :指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。
[/code]

实例:

[code lang=”bash”]
[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0 #core文件的最大值为100 blocks。
data seg size (kbytes, -d) unlimited #进程的数据段可以任意大。
scheduling priority (-e) 0 file size (blocks, -f) unlimited #文件可以任意大。
pending signals (-i) 98304 #最多有98304个待处理的信号。
max locked memory (kbytes, -l) 32 #一个任务锁住的物理内存的最大值为32KB。
max memory size (kbytes, -m) unlimited #一个任务的常驻物理内存的最大值。
open files (-n) 1024 #一个任务最多可以同时打开1024的文件。
pipe size (512 bytes, -p) 8 #管道的最大空间为4096字节。
POSIX message queues (bytes, -q) 819200 #POSIX的消息队列的最大值为819200字节。
real-time priority (-r) 0 stack size (kbytes, -s) 10240 #进程的栈的最大值为10240字节。
cpu time (seconds, -t) unlimited #进程使用的CPU时间。
max user processes (-u) 98304 #当前用户同时打开的进程(包括线程)的最大个数为98304。
virtual memory (kbytes, -v) unlimited #没有限制进程的最大地址空间。
file locks (-x) unlimited #所能锁住的文件的最大个数没有限制。
[/code]

Linux中profile、bashrc、bash_profile之间的区别和联系

今天在学习iptables时突然想到用webbench做压力测试时,在服务器端可以使用命令查看并发访问量,但一时记不起命令了,就使用history |grep netstat 找到了以前的命令:netstat -te |grep -c :80,一时间就觉得history是个好东西,要怎么更改它记录的命令条数呢?(默认是1000条,好像。)于是我在.bashrc,.bash_profile,/etc/profile都找了下,一时间有点搞不清楚它们的作用了,于是google了下,下面做一些记录:

/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该
文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该
该文件被读取.
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是”父子”关系.

~/.bash_profile 是交互式、login 方式进入 bash 运行的
~/.bashrc 是交互式 non-login 方式进入 bash 运行的
通常二者设置大致相同,所以通常前者会调用后者。

设置生效:可以重启生效,也可以使用命令:source
alias php=/var/eyouim/pub/php/bin/php
source /etc/profile(立即生效)

在 /etc目录的bash.bashrc和profile是系统级(全局)的配置文件,当在用户主目录下找不到.bash_profile 和.bashrc\时,就会读取这两个文件。.bash_history是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISSIZE环境变量设置在历史记录文件里保存记录的条数。

查看了下~/.bash_profile,~/.bashrc这两个文件,代码如下:

[code lang=”bash”]
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

[/code]

 

[code lang=”bash”]
# .bashrc

# User specific aliases and functions

alias rm=’rm -i’
alias cp=’cp -i’
alias mv=’mv -i’

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export LANG="zh_CN.UTF-8"
[/code]

不难发现在~/.bash_profile中调用了~/.bashrc,然后又调用了/etc/bashrc。所以一般我们只需要更改~/.bashrc就可以了,如设置命令的别名。而修改历史命令记录条数,我想对所有用户生效,于是更改了/etc/profile,在末尾加入:

[code lang=”bash”]
设置默认中文
export LC_ALL="zh_CN.UTF-8"
#设置超时自动登出
export TMOUT=500
export HISTSIZE=5000
[/code]
所以:对于更改系统的环境变量,一般是修改/etc/profile。

使用CDN做网站内容加速

  1. 什么是CDN?

    1. CDN全称为Content Delivery Network,中文意思为内容分发网络。简单地讲,通过在现有的internet中增加一层新的网络架构,将网络的内容发布到最接近用户的Cache服务器内,通过智能DNS负载均衡技术,判断用户的来源,让用户就近使用与服务器相同线路的带宽访问Cache服务器,取得所需的内容。例如:成都电信用户访问成都电信Cache服务器上的内容。这样可以减少数据在网络上传输的时间,提高访问的速度。
    2. CDN是一套全国或全球的分布式缓存集群,其实质是通过智能DNS判断用户的来源地域及上网线路,为用户选择一个最接近用户地域,以及和用户上网线路相同的服务器节点,因为地域近,且线路相同,所以可以大幅度提升用户浏览网站的体验。
    3. CND的价值:
      • 为架设网站的企业省钱
      • 提升企业网站的用户访问体验
      • 可以阻挡大部分流量攻击,例如DDOS攻击
      • 一个良好的网站架构设计,访问量尽量都交给CDN
  2. CDN的特点

    1. CDN就是一个具备根据用户区域和线路智能调度的分布式缓存集群。其特点为:
      • 通过服务器内存缓存网站数据,提高了企业站点的访问速度,并大大提高企业站点的稳定性
      • 用户根据智能DNS技术自动选择最合适的Cache服务器,降低了不同运营商之间互联瓶颈造成的影响实现了跨运营商的网络加速,保证不同网络中用户都能得到良好的访问质量。
      • 加快了访问速度,减少了源站点的带宽
      • 用户访问时从服务器的内存中读取数据,分担了网络流量,同时减轻了源站点负载压力
      • 使用CDN可分担源站的网络流量,同时可以减轻源站点的负载压力,并降低黑客入侵及各种DDOS攻击对网站的影响,保证网站有较好的服务质量。
  3. 企业使用CDN的基本要求

    1. 并不是所有的网站都可以一上来就能用CDN的。要加速的业务数据应该存在独立的域名,例如:业务内容图片、附件、JS、CSS等静态元素,这样的静态网站域名才可以使用CDN
    2. 国内较大的CDN提供商有:网宿、蓝汛、快网、帝联及BAT

图解原理:

cdn01 cdn03 CDN域名解析 cdn原理