lsb_release -a # 查看发行版本 或者 uname -a 或者 cat /proc/version
内核版本 : 2.6.18 2 是主版本,6 是次版本,18 是末版本
内核版本和 Linux 版本不是一回事,当内核版本发布后,各个发行商会基于这个内核发行新的发行版本.
Linux 发行版本,下面两个系列,除了软件安装方式,其他基本一样 :
RedHat 系列 : CentOS/SuSE(桌面也不错,欧洲多)/Fedora/Gentoo Linux(对Linux非常熟悉用)/红旗 Linux/Mandriva/turbolinux
Debian 系列 : Ubuntu(桌面用的更多)/KNOPPIX(不需要安装,用光盘直接启动就能运行,很方便,CentOS的 Live CD 也可以实现)
●●● 安装 =============================================================================================
VMware 628M及以上才能图形安装
安装 linux,主机名最好默认.
最基本分区 : 根分区 : 如果只是日常使用,建议10-20G即可满足大部分需求。如果你的系统提供多用户登录的话,这样可以适当的放大一些)
swap : 内存两倍,超过2G就没用了,对性能没太大影响…另一种说法 :
mem<=4Gswap>=4G mem=4-16Gswap>=8G mem<=16-64Gswap>=16G mem<=64-256Gswap>=32G
boot : 200M,该分区负责启动的,所以必须在最前面,会自动跳到最前面)
最好把 /var 独立,因为它变动频繁
/root/install.log 系统在安装过程中的软件包和版本信息
/root/install.log.syslog 安装过程中留下的事件记录
/root/anacondat-ks.cfg 以Kickstart配置文件的格式记录安装过程中设置的选项信息,自动化安装也是根据这个文件来做的
FHS是一套linux目录规范,/etc /bin /dev /lib /sbin 必须和根目录在一个分区
FHS定义的三层主目录为 /, /var, /usr 三层而已;
/usr 是 unix software resource 的缩写,而非 user
/usr/lib 或 /usr/lib64 各应用函数库
/usr/src 源码放置目录,核心源码应该放在/usr/src/linux
/bin 存放系统命令的目录,普通和超级用户都可执行,单用户可以执行
/usr/bin 存放系统命令的目录,多数都放在这里. 普通和root都能执行,单用户模式不能执行
/sbin 和系统环境设置相关的命令,管理员能执行,单用户可以执行,有些命令普通用户可以查看但不能执行
/usr/sbin 存放根目录不必要的系统管理命令,如大多数的服务程序。管理员能执行,单用户不能执行
/usr/share/man 联机帮助文件 /usr/share/doc 软件说明
/bin 是系统的一些指令。主要放置系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等
/usr/bin 后期安装的一些软件运行脚本。主要放置一些应用软体工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome*、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb*、wget等
/sbin 一般是指超级用户指令。主要放置一些系统管理的必备程序:cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等
/usr/sbin 放置一些用户安装的系统管理的必备程式例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等。
/boot 单独分区,系统启动资源目录,比如内核/引导程序grub文件等(系统资源备份)
/dev 设备文件保存位置.linux 所有内容都以文件形式保存,包括硬件。/dev/null, /dev/zero, /dev/tty, /dev/lp*, /dev/hd*, /dev/sd*等等
/etc linux 默认配置文件保存目录,一般用户可以查看,但只有root能修改
/lib 系统函数库,开机及/bin、/sbin下的命令会使用的函数库
/lost+found 意外崩溃和关机产生的文件碎片,每个分区都有,/boot(单独分区) 目录下也有一个,平时啥都没有
下面都是挂载盘符
/media 挂载多媒体设备
/mnt U盘/移动硬盘
/misc 挂载 NFS服务的共享目录
/lost+found ext2/ext3文件系统才会产生目录,当前文件系统发生错误时把遗失片段放到该目录
下面是存内存中,不要在下面目录写东西
/proc 它是虚拟文件系统,存放的数据都是在内存中,所以不占硬盘空间,系统正在运行的基本信息和硬件信息,比如CPU啥的.
/sys 内核相关的信息
/srv 、service缩写,某些网络服务启动,所需要的数据目录,比如 www服务器的网页数据(/srv/www)/ftp
/tmp 临时目录,不要存放重要东西,FHS甚至建议开机清理这个目录
/usr unix soft resource 的简写,是存放和系统运行相关的数据. 就像 C 盘的 windows(系统资源备份)
/var 动态资源保存目录,日志,邮件,经常变动的东西
/var/cache # 程序运行时的缓存
/var/lib # 存放程序运行时使用的数据文件,各个软件应该有自己目录
/var/lock # 某些配置和资源一次只能被一个程序调用,同时调用会出问题
/var/log # 存放日志等,重要 : /var/log/messages /var/log/wtmp,记录登陆者的信息
/var/run # 存放程序或服务的PID
/var/spool # 存放队列数据(等待其他程序使用的数据),/var/spool/cron 存放 crontab 日志
/opt 第三方软件,只不过我们以前习惯放到 /usr/local
/selinux # 数据也是在内存中,所以不占硬盘
●●● 技巧 =============================================================================================
一行没输入完的命令,可以后面加 \,然后回车继续写.
grep ‘mail’ /etc/init.d/* # 查询 init.d 目录下所有包含 mail 的文件
查看系统信息 : uname -a(全部) -s(内核名字) -r(内核版本) -v(更新时间)
查看发行版本 : /boot/grub/grub.conf 或者 /etc/issue
设置字符集 : LANG=en_US 或 LANG=zh_CN… 查看字符集 echo $LANG
所有 Liunx 都有一个 nobody 账号,相当于 Windows 的 Guest 一样,用来做测试
登录状态中切换用户 : su - liu
●●● 关机/重启 =============================================================================================
关机/重启前,多用几次 sync,把内存的临时内容写入硬盘
关机 : /usr/sbin/shutdown
关机前用 wall 通知在线用户,保存手头文件
shutdown -r now(立即) shutdown -r +10(10分钟后) shutdown -r 20:35(20:35重启) 把 r 换成 h 就是关机. 用 shutdown -c 取消
init(0:关机 1:单用户 3:纯文本模式 5:图形界面 6:重启)
poweroff 和 halt 是立即关机
重启 : reboot(或者 init 6) 命令所在目录 : /usr/sbin/reboot
●●● Shell =============================================================================================
shell 命令执行过程 :
输入命令 “xyz”,shell 搜索一条命令,判断是否内建命令,是则执行;不是则派生一个子进程,父 shell 等待,子进程判断该命令是否一个已编译的可执行语句,是 kernel 把一个新程序装入内存,并在子进程中执行它(运行结束后或者终止这个子进程则退出,并唤醒父shell),如果不是已编译的可执行语句,则判断是否已经执行到了命令结尾,不是,则返回继续等待下一条命令输入。如果是则退出并唤醒父 shell,然后返回继续等待下一条命令输入。
系统调用
fork 系统调用,是用于创建一个新进程,新进程是原来进程的副本,也叫子进程,原来的是父进程,它和父进程分享CPU.
输入一条命令,shell 判断它是内建命令还是可执行程序,如果是内建则由shell本身处理。如果是可执行,shell 就呼叫 fork 系统调用,建立自己的副本,子进程运行时,父进程暂时休眠,直到某子进程终止,
子进程处理细节的时候入重定向,管道和后台进程等,父进程被设计为休眠状态。如果父进程没有休眠而子进程退出了,子进程则为 zombie 状态(自动挂起),直到父进程成功调用wait或者父进程退出(只有重新启动系统才能删除这种僵尸进程)。如果父进程在子进程之前退出,init 就将负责处理所有处于僵尸状态的“孤儿进程”.
exec 系统调用。fork 新进程执行一个可执行程序时,是通过 exec 系统调用完成的。
exit 系统调用。调用 exit系统调用可以在任何时候终止程序执行。子进程退出会发出一个信号,并等待父进程接受它的退出状态,退出状态是介于0和255之间的数字,0位子进程退出成功,非零意味着退出发生了某种失败。
例如在命令行输入 ls 命令,父进程派生出一个子进程后进入休眠状态,子进程有自己的PID 且跟父亲分享 CPU。kernel 把 ls 装入内存并在子进程的位置运行(exec)它,ls 从子shell 那里继承了所有的环境变量、打开的文件、用户信息和状态信息。当 ls 进程执行结束以后,kernel 释放资源,退出子进程而唤醒父进程。提示符将出现在监视器上并等待新的命令。
=============================================
UID 为 0 的进程所有权都属于 root 或者超级用户,有root 特权.
变量类型为 : 局部变量和环境变量. 局部变量是 shell 私有,不会传递给 shell 产生的子进程. 相反,环境变量是可以一直继承下去,从父进程到子进程到孙进程…
●●● 应用 =============================================================================================
unix2dos file # 把 unix 文件转换成 windows 格式
dos2unix file # 把 windows 文件转换成 unix 格式
setfacl命令可以用来细分linux下的文件权限。
chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。 比较常用的用法如下:
setfacl –m u:apache:rwx file 设置apache用户对file文件的rwx权限
setfacl –m g:market:rwx file 设置market用户组对file文件的rwx权限
setfacl –x g:market file 删除market组对file文件的所有权限
getfacl file 查看file文件的权限
yum -y install 包名(支持*) : 自动选择y,全自动
yum install 包名(支持*) : 手动选择y or n
yum remove 包名(不支持*)
yum 找不到相关软件的解决办法 : rpm -Uvh http://mirrors.sohu.com/fedora-epel/5/i386/epel-release-5-4.noarch.rpm
更好的方法是 : yum -y update
查看除了 # 和 $ 开头的行 : grep -Ev ‘($)|(\s*#)’ /etc/redis.conf # (^\s*#) 在这里是值任意数量的特殊字符开头,后面包含 # 的也不查看
查看 Linux 服务器的并发数 : netstat -n | awk '/^tcp/ {++S[KaTeX parse error: Expected 'EOF', got '}' at position 4: NF]}̲ END {for(a in …NF 为awk的行数,^tcp 开头为 tcp 的行
查看Nginx运行进程数 : ps -ef | grep nginx | wc -l
Apache : ps -ef | grep httpd | wc -l
查看Web服务器进程连接数 : netstat -antp | grep 80 | grep ESTABLISHED -c
查看MySQL进程连接数 : ps -axef | grep mysqld -c
iptables 命令 : iptables -L -n
selinux 查看状态 : sestatus
查看路由表 : route -n
ll = ls -l
按照文件大小倒排序 : ll -Sh = ls -lSh
netstat :
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项,tcp 协议,三次握手,靠谱,比如 http 都采用 tcp
-u (udp)仅显示udp相关选项,UDP 协议,不握手,不管能不能收到。即时通信,视频用 UDP
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令
显示结果,前面IP地址和端口是连接到服务器的哪个端口,后面的IP是访问者的IP和哪个端口
查看端口 : netstat -ntlp
查看所有 : netstat -a # 包括监听和未监听,和正在连接的(ESTABLISHED)
列出所有 TCP 端口 : netstat -l
列出所有 udp 端口 : netstat -lt
列出监听 udp 端口 : netstat -lu
查看运行中程序占用内存情况(虚拟内存可以不用考虑,它并不占用实际物理内存) :
(1). ps -aux : VSZ(或VSS)列表示,占用多少虚拟内存
RSS 表示占用多少物理内存
(2). top VIRT(或VSS)列 表示,程序占用了多少虚拟内存。 同 ps aux 中的 VSZ列
RES列 表示, 程序占用了多少物理内存。同 ps aux 中的RSS列
查看系统内存使用情况 : free 可以使用的内存 = free+buffers+cached
主分区§和扩展分区(E)最多可以有四个,扩展分区(E)最多有一个,逻辑分区是扩展分区切割出来的分区. 能格式化作为数据访问的只有主分区和逻辑分区,扩展分区无法格式化.
退出:exit 或 logout 提示符下用:ctrl+d ctrl+c 终止一个命令的执行
文件命名规则 :
1. 除了 / 之外,所有字符都合法,/ 是根目录,也是路径分隔符,特殊字符最好不要用,如空格,使用命令会混淆;
2. . 开头是隐藏文件;
Linux 内核处理任何内容都需要标记,只认识数字,用户有 uid ,用户组有组 id,进程有 pid,文件数字标识 -i i-inode i节点。内核调用这些数字标识来对对象进行处理.
pwd -P # 如果当前目录是连接目录,用 -P 可以显示真实原路径
显示目录和文件 : ls -ald / 命令所在目录 : /bin/ls
// 后面文件或目录可多个
选项 i : 查看 i 节点
选项 a : 查看所有文件,包括隐藏文件
选项 l : 详细信息显示 :
drwxr-xr-x 2 root root 5095 02-15 01:44 bin
(1). d:目录 -:二进制文件 l:软链接文件link s:socket数据接口文件 p:FIFO主要解决多个程序同时存取一个文件所造成的错误问题 b:硬盘与软盘等 c:键盘/鼠标等
(2). 所有者 所属组 其他人
(3). 2 是硬链接数(被引用次数);
(4). 第一个 root 是所有者; 第二个 root 是所属组.
(5). 5095 是 bin 目录的大小,并不准确,它不是整个 Bin 目录所有文件总大小,只是 bin 目录的大小
Linux 存储单位是数据块: 默认每个数据块 512 字节. 每个数据块只能存放一个文件,即使这个文件只有 2 字节也占用一个数据块;如果一个文件大于这个数据块,就占用 2个数据块,以此类推. 数据块大小可以调整,如果接收的数据文件比较小,可以将数据块大小调整的小点,可以减少占用空间(不然可能每个 2 字节的文件要占用一个 512 字节的数据块,浪费的空间会非常大); 如果接收的是视频类的数据文件,可能一个文件要几十兆,可以调整每个数据块大小大一点,这样可以增加数据的执行速度(数据块越小,存取的速度越慢,数据块越大,浪费的空间越大. 一个视频文件可能要占用几十个数据块,加大数据块大小,可以调高存取的速度)
(6). 02-15 01:44 文件或目录创建时间或修改时间,比如目录下有文件被删除或文件内容修改了
-d : 查看根目录本身的详细信息 : ls -ld / 或某个指定目录和文件的详细信息 : ls -ld /home
-h # 文件大小人性化显示
-n # 文件所有者/所属组显示ID,而非名称
-S # 文件大小排序
-t # 按时间排序
-r # 排序反向输出,比如按大小正排序,用了该参数则反排序
--full-time # 显示完整的日期,默认是内容修改时间(mtime)
--time=atime # 文件内容被访问,比如cat时更新(vim打开不会更新)
--time=ctime # 权限与属性被更改时更新
列出名字 dzp 开头文件 : ls dzp*
列出名字 dzp 后面只有一个字符的文件 : ls dzp?
列出名字 dzp 后面为一个数字的文件 : ls dzp[0-9]
列出名字 dzp 后面为两个数字的文件 : ls dzp[0-9][0-9]
列出名字 dzp 后面为一个不是数字的文件 : ls dzp[^0-9]
列出名字 dzp 后面不是数字的所有文件 : ls dzp[^0-9]*
●●● 文件权限 =============================================================================================
linux中文件是否可以执行要看这个文件是否有可执行权限 x,以及文件是否为脚本
权限说明 : 一般目录同时有 r(查看列表ls) 和 x(进入cd) 权限;用户有文件修改权限,但对文件删除要看文件所在目录是否有写权限。目录写权限意味着:1. 可以建立新文件、目录;2. 删除(无论该文件/目录权限为何);重命名;移动;
如果user对a目录有w权限,即使该目录下有root的文件,user也可以删除
更改权限 : chmod
-R 递归修改子目录、文件权限
u=所有者 g=所属组 o=其他人 a=所有(给前面三个统一设置) r=可读 w=可写 x=可执行
例1 : chmod u+wx testfile chmod u=rwx,go=rx testfile chmod o-rx testfile chmod g=rwx testfile
数字 : r=4 w=2 x=1 chmod 721 testfile // rwx-w—x chmod -R 700 /mysqldata
改变所有者 : /bin/chown
例1 : chown liu testfile // -R 改变该目录下所有文件
chown -vR mysql:mysql /mysqldata
改变所属组 : /bin/chgrp
例1 : chgrp adm testfile // 组必须是系统存在的组
查看、设置默认权限 : /bin/umask
root默认权限是022,一般用户是002,root被削减是出于安全考虑
umask // 0022,第一个 0 是特殊权限位. 也就是 777-022 = 755
创建文件没有x执行权限,目录有,比如 755,如果是文件,还要减去 111(减去执行权限 x) 就是 644,文件的默认创建权限就是 644.
例2 : umask 027 // 目录默认权限 777-027=750,而文件全部减去执行权限 x,750-111 = 640
这样理解 : 设置umask时,要去掉那些权限,就写哪些,比如要去掉所有角色的写和执行,那就是2(写)+1(执行) = 333
// 普通用户没有 /etc/passwd 和 /etc/shadow 写入执行权限,却可以修改密码,因为 /usr/bin/passwd 命令有特殊权限 SetUID/SetGID
当可执行程序具有 SetUID时,用户将以该程序所有者身份执行此程序,执行完变回普通用户身份,此时该身份对passwd/shadow有修改权限. 比如把 touch 命令加上 SetUID 权限 :
Set UID : 它占用ls中所有者的x位置,x变成s
chmod 4755 /usr/bin/touch 或 chmod u+s /usr/bin/touch 然后手动切换为普通用户,然后用普通用户身份使用 touch 创建一个文件
touch ~/haha.file ls -l ~/haha.file 会看到这个文件的所有者是 root
撤销 : chmod 755 /usr/bin/touch 或 chmod u-s /usr/bin/touch
Set GID : 它占用ls中所属组的x位置,x变成s
chmod 6755 /usr/bin/touch 或 chmod g+s /usr/bin/touch 然后手动切换为普通用户,然后用普通用户身份使用 touch 创建一个文件
touch ~/haha.file ls -l ~/haha.file 文件所有者、所属组都是 root,SetUID 权限标识为 4,SetGID 是 2,就是6755
撤销 : chmod 755 /usr/bin/touch 或 chmod g-s /usr/bin/touch
粘着位 SBIT : 占用ls中其他人的x位置,x变成t
一个权限 777 目录,任何用户都能在目录下管理其他人文件,但加上粘着位,只有自己和root才能管理自己的文件. 例如 /tmp
把文件设为粘着位没有意义,如果一个目录不是 777 的权限,也没意义 : 一般目录都同时都有 r 和 x 权限
chmod o+t /abc 或 chmod 1777 /abc chmod o-t /abc 或 chmod 777 /abc
注意 :
创建目录 : mkdir 命令所在目录 : /bin/mkdir 例1 : mkdir /test
创建多级目录 : mkdir -p Project/a/src mkdir -p Project/{a,b,c,d}/src # 创建 Project 目录,同时创建包含 src 目录的 a、b、c、d 4个目录
创建多个目录 : mkdir /tmp/haha /tmp/hehe
创建空文件,修改文件时间信息 : /bin/touch
-c:只修改时间,不创建 -a:只修改 atime(access time,被cat等命令访问过,vim打开不算) -m:只修改mtime(modify time文件内容) -t:修改时间(格式:YYMMDDhhmm)
touch -cat 1711100501 testfile:修改atime touch -cmt 1711100501 testfile:修改mtime touch -ct 1711100501 testfile:同时修改atime和atime
复制文件或目录 : cp 命令所在目录 : /bin/cp
复制目录,需要 -R 选项.
默认复制会更改时间,要创建和源文件一样的时间,需要 -p 选项(注意,普通用户测试时无法复制 root 拥有者和所属组,因为普通用户没权限创建root权限文件)
例1 : cp /etc/file1 /etc/file2 /etc/file3 /test // 将前三个文件复制到 /test 目录内.
例2 : cp -R /etc /test // 将 etc 复制到 /test 目录里.
可以同时复制多个目录+文件
-d : 保留链接 i : 有覆盖会给出提示 -a:相当于-pdr(保留文件属性,保留链接,递归复制用户目录)
使用 -a 保留文件属性,会保存 mtime和atime,但ctime将会是当前时间,因为复制的原因源文件的 atime 会变成当前时间.
移动、更名文件 : /bin/mv
更名 : mv testfile testfiles // 将当前目录的前文件更名为后者,也可更名指定目录名称或文件 mv /home/test /home/test1
也可以在移动后,将文件重命名 : mv /home/test/testfiles /home/liu/test.file
可以同时移动多个目录+文件
删除文件/目录 : rm
-r 删除目录. 可同时删除多个文件和目录
-f 不询问
例1 : rm testfile
排除一部分 : rm -rf !(haha|hehe) 肿么有的不好使.
ls | grep -v keep | xargs rm # grep 加了参数 v,除了 keep 文件其他都干掉
删除目录 : rmdir 只能删除空目录,非空用 rm -rf
查看文件内容 : cat 命令所在目录 /bin/cat
例1 : cat /etc/services 查看当前目录下的文件 : cat testfile
适合查看较短内容,如果太长只能显示最下面.
反着看 : tac
分页查看文件内容 : more 命令所在目录 : /bin/more
快捷键 : 空格或 f : 查看下一页 回车 : 查看下一行 Q键 : 退出
不能向上翻页。。。
例1 : more /etc/services
代替 more : less /etc/inittab
可以向上翻页
ctrl+b 向上一页 ctrl+v 向下一页
k:向上一行 j:向上一行 v:调用编辑器编辑当前文件内容
-N 显示每行的行号
查看文件开始的几行 : head 命令所在目录 : /bin/head
例1 : head -5 /etc/services // 查看前 5 行.
查看文件后几行 : tail 命令所在目录 : /bin/tail
选项 -f 是动态查询最后几行,只要该文件有更新的保存操作,就会立刻更新显示,这样就无法输入其他命令了,如果要终止监控状态,使用 ctrl+c.
例1 : tail -5 /etc/services // 查看最后 5 行.
连接 : ln 命令位置 : /bin/ln
//
查看命令所在目录 : /usr/bin/which(只在当前用户PATH所有目录下查找) 和 whereis
例1 : which ls // 查看命令所在目录,包括别名
例2 : whereis ls // 查看命令所在目录,包括帮助文档所在位置
sbin、/usr/sbin 管理员才能使用,bin、/usr/bin 所有用户都能使用
查找文件或目录 : /usr/bin/locate touch,或 whereis
whereis 和 locate 都使用目录文件数据库来搜索
如果新建立一个文件,locate 将找不到此文件,可以手动运行/usr/bin/updatedb重建,系统有计划任务定期执行 updatedb
注意 : /tmp 临时目录下是没办法更新的,所以 locate 没办法搜索 /tmp 下的内容.
locate -i 不区分大小写查找
查找任何文件和目录 : /usr/bin/find
// 尽量缩减查找范围,减少系统资源开销,零时网站访问人数最少,一般写个计划在零点进行查找,将结果保存一个文件内,早晨查看这个文件
根据文件名 : find /etc -name init // 根据 name 来查找 init 文件
* 匹配任意字符 : find /etc -name init* // 查找 init 开头的文件 find /etc -name init // 查找包含 init 的文件
? 匹配单个字符 : find /etc -name init??? // 记得 init 后面是 3个字符,可以查找 init 后面有3个字符的文件.
-iname 不区分大小写
根据大小,block 数据块 : 1kb = 2个数据块 100M = 102400KB = 204800 block
例1 : find / -size +204800 // 查找整个硬盘大小超过 100M 的文件. find / -size -204800 // 查找整个硬盘小于 100M 的文件
-uid n(用uid查找) -gid n(用gid查找) -user name(用户名查找) -group name(组名查找)
-nouser name(查找拥有者不存在/etc/passwd的文件) -nogroup(查找文件群组不存在/etc/group的文件)
根据权限 : 查找所有 SetUID 程序(根据文件权限查找) : find / -perm -4000 -o -perm -2000,后面3位都为零代表忽略,只查找 SetUID 和 SetGID
-perm node(查找权限值等于node) -perm +node(查找权限值包含任意node文件) -perm -node(查找权限值必须全部包含node文件,比如查找4755也会显示0744的文件)
find / -perm 0777,查找权限 0777 文件哪些
find / -perm +7000,搜寻 SGID 或 SUID 或 SBIT 文件,
根据时间 :
c-change 文件或目录属性(所有者,所属者,权限)在一定时间内被修改过
a-access 访问过,浏览过,被看过,比如用命令 cat、more 查看过
m-modify 文件内容在一定时间内被修改过
ctime(天数)、atime(天数)、mtime(天数) 或 cmin(分钟)、amin(分钟)、mmin(分钟)
例1 : find /etc -ctime -2 // 两天之内被修改过属性的文件
find /etc -mtime 0 // 0 代表目前时间,24小时内内容被修改过的文件
find /etc -mmin -120 // 超过 2个小时,被修改过文件内容的文件
拿 mtime 举例 : mtime 2(2天前那天之内) mtime +2(列出2天之前被修改的文件) mtime -2(列出2天之内被修改的文件)
对比新旧 : find /etc -newer /etc/passwd # 列出/etc下比/etc/passwd文件日期新的文件
查找不属于任何人的文件 : find / -nouser # 查找孤魂文件干掉它
根据文件类型 -type f 二进制文件 l 软连接文件 d 目录
连接符 : -a and 逻辑与 -o or 逻辑或
例1 : find /etc -size +163849 -a -size -204800 在 /etc 下查找大于 80M 小于 100M 的文件
例2 : find /etc -name init* -a -type f // 只查找 name 以 init 开头并且文件类型为 f(文件) 的文件
例3 : find /etc -name init* -a -type l // 只查找 name 以 init 开头并且文件类型为 l(软链接) 的文件
例4 : find /etc -name inittab -o -size +2048000 // 查找 /etc 目录下,名字为 inittab 的文件或大小超过 2048000 的文件.
find … -exec 命令 {} ; 对查找的结果进一步操作,
(1). 命令可以是任何要对前面查询结果进行操作的命令.
(2). {} 代表 find 查询结果
(3). \ 反斜杠 转义符,让符号和命令使用本身的含义,比如默认不加选项使用 rm 会有一个删除提示,真正的 rm 没有提示的,rm 实际上有个别名 : rm=“rm -i”,这个 -i 就是删除提示,可以用 which rm 来查看别名。这里可以使用反斜杠让她使用命令本身,相当于干掉别名, \rm /home/testfile 这样就不会有询问了。同样,不希望 ls 的结果带有颜色,也可以 \ls /etc 来使用.
(4). ; 分号相当于结束语句。格式是固定的 : find … -exec 命令 {} ; 不可以改成其他的.
例1 : find /etc -name inittab -exec ls -l {} ; // 查找 /etc 下 inittab 的文件,并使用 ls -l 查看它的详细信息
例2 : find /test -name testfile -exec rm {} ; // 查找 /test 下 testfile 文件并删除.
例3 : find /home -user liu -exec rm -rf {} ; // 删除 liu 的文件,liu 这个用户已经离职了,用户也已经被删除了
-exec 的另一个近义选项 -ok : 他会在执行后面部分操作之前会先询问,输入 y/n
例1 : find /home -name testfile -ok ls -l {} ; // 查找 /home 下 name 为 testfile 的文件,询问是否使用 ls 来查看它的信息
例2 : find /home -name testfile -ok rm -f {} ; // 查找 /home 下 name 为 testfile 的文件,询问是否使用 rm 删除(会忽略 rm 的 -f)
例3 : find /etc -name init* -a -type f -exec ls -l {} ; // 查找 /etc 下名字以 init 开头并且类型为二进制的文件,并查看他们的信息
根据 i节点 : 有时会创建一些奇怪名字的文件,比如 touch “a b”(不加引号会分别创建 a 和 b 两个文件),又比如 touch – -abc(前面的 – 是转义符)
可以用 rm “a b” 和 rm – -abc 来删除,就像当初创建那样删除它。还有另一种更好的方法,使用 find :
例1 : find . -inum 6 // 只要知道文件 i节点,就可以在当前目录查找 i节点(文件数字标识) 为 6 的文件
例2 : find . -inum 6 -exec rm {} ;
搜索文件内容 : grep 命令所在位置 : /bin/grep
在给定文件内,检索给定关键字匹配行,如果找到则返回该行内容. 会返回所有与该关键字相关的行
例1 : grep ftp /etc/services // 在 /etc/services 文件里查找 ftp 这个关键词,并返回匹配的行
例2 : grep -v “^#” /etc/inittab | more // 浏览除了以 # 开头的注释行,并用 more 浏览. -v 就是排除含有某一字符的行
grep ^root:x /etc/passwd // 查看以 root开头,并且带有 root:x 字符的行
多个文件 : grep root /etc/password /etc/shadow
/
帮助命令 : info 命令所在位置 : /usr/bin/info Unix 没有这个命令,大部分 Linux 版本存在.
和 man 命令一样,只是查看结果的浏览方式不同,可根据习惯选择用哪个.
查看命令有哪些选项,在命令后加上 --help
查看 shell 内置命令帮助 : help
如果用 man 查看 shell 内置命令 : man cd 的帮助,它会列出所有 shell 内置的命令,而不是真正的 cd 命令帮助
仅仅想获得内置命令的帮助,可以用 help :
例1 : help pwd // 查看 pwd 用法,和选项.
可以用来查 shell编程里的语法格式,比如 : help if help case help while
打包目录 : tar 命令所在位置 : /bin/tar
选项 : -c 产生 tar 打包文件,必选
-f 指定压缩后的文件名,必选
-v 显示详细信息,在命令执行时,显示命令的整个执行过程
-j 打包同时压缩,加此参数打包后会变成 .tar.bz2
-z 打包同时压缩,不加此选项默认打包后的文件名为 .gz 加了此选项,打包压缩后的后缀为 .tar.gz
打包排除某些目录或者文件 :
tar cvfz dow.tar.gz xx/* --exclude xx/admin --exclude xx/css --exclude xx/images --exclude xx/uploads
例1 : tar -zcf newdir.tar.gz newdir // 将 newdir 目录打包压缩成 newdir.tar.gz 建议这样写,但 Linux 对文件名后缀没有要求,也可以 tar -zcf new newdir,但是不好区分… 后期你可能认为 new 是个文本文件,实际它是一个 .tar.gz 文件,而且用 cat 只能查看乱码. 你可以用 file new 来判断一个文件的类型.
// 会保留原目录,生成后的 .tar.gz 是二进制文件
// 打包同时压缩并不是所有 Unix 系统都支持,一些旧的 Unix 系统可能不支持 tar 的 -z 连打包带压缩的选项,这时,只能先打包,再压缩 :
tar -cf newdir.tar newdir 然后压缩 : gzip newdir.tar 会生成 newdir.tar.gz 文件
选项 : -x 解包 .tar 文件
-f 指定解压文件,必选吧
-v 显示详细信息
-j 解压并解包 bz2
-z 解压并解包 gz
例1 : tar -zxf newdir.tar.gz -C /home # 指定解压目录
// 分两步,先解压,再解包 :
gunzip newdir.tar.gz 然后解包 : tar -xf newdir.tar
// 当然,tar 也可以配合 bz2 进行压缩 : 先用 tar 进行打包,然后用 bz2 进行压缩.
xz 文件解压:
xz -d **.tar.xz
tar -xv -f **.tar
tar -Jxv -f **.tar.xz(大写的J)
/
同一台 Linux 发送信息 : write 命令所在位置 : /usr/bin/write
实时通信,必须在线才能看到,因为不能留言
例1 : write liu // liu 是用户名,输入这条命令后,会提示输入,一直输入就会一直发送,按 ctrl+d 退出输入状态.
向所有人发送广播 : wall 命令所在位置 : /usr/bin/wall
例1 : wall test message;
mail liumingchen 发送邮件
mail # 查看邮件 N 开头表示未读,输入 help 查看帮助,想看哪封信输入序列号回车就能看。 输入 h 回车看邮件列表。 输入 d 1 删除序号1的邮件。 q 回车退出。
last # 统计计算机登录过的用户信息,包括重启时间(用户名为 reboot 就是重启了)都能看到
用户名 —— 来源 —— 登录IP —— 登录时间 —— 退出时间(一共登录了多久,如果为 logged in 表示还在线)
traceroute www.sina.com.cn # 跟踪路由,查看经过的节点,某个节点后面不通信了,就知道是哪块出问题了
lastlog liumingchen # 查看所有用户最后的登录时间
lastlog -u 502 # 查看指定用户的最后登录信息,需要用ID号
和 last 的区别 : 它是每个用户只统计最后一次登录信息,包括伪用户,而 last 是只要用户登录一次就记录一次,一个用户可能有N条记录
测试网络是否连接 : ping 命令所在路径 : /usr/sbin/ping
ping 就是发送 ICMP 请求包,得到的应答包,如果不按 ctrl+c,就会一直 ping
不是得到 ICMP 应答包就说明网络没有问题,首先要看响应速度和丢包率。举例 : 一个银行网站,前台录入数据,可能录入 10 次只有 1 2 次能录进去,一个经验丰富的工程师看了看,换了根网线就解决了问题,实际是网线和接入造成了丢包率,可以检查测试一下丢包率.
如果 ping 不通,立马 ping 一下自己的 ip,如果能 ping 通,可能是网络问题,也可能是自己网络设备有问题,不是设置有问题,TCP/IP 也没问题,也可能是对方主机网络设置有问题。 如果 ping 自己也不通,可以 ping 回环地址 127.0.0.1,只要安装了 TCP/IP 协议,就算拔了网卡也能 ping 得通,如果能 ping 通,证明本机安装的 TCP/IP 协议没问题。
有时 ping 不通,可能是对方主机设置了防火墙,或者屏蔽了 ICMP 请求包的应答,或者改变了 IP 地址,所以也不一定是自己主机的问题.
选项 : -c ping 的次数
-s 请求包大小。默认发送的 ICMP 请求包是 64字节的,真正网络测试环境里,可以把包设大一点,最大是 65507
例1 : ping 192.168.9.5 例2 : ping -c 3 192.168.9.5 // ping 3 次就退出 例3 : ping -c 3 -s 60000 192.168.9.5
查看网卡信息 : ifconfig 命令所在目录 : /usr/sbin/ifconfig
选项 : -a 显示所有网卡信息。Linux 可以省略此选项,但 Unix 必须加.
一般最少会显示最少两个网卡,一个 eth0 是实际的物理网卡,另一个 lo 是虚拟网卡,IP地址时 127.0.0.1 回环地址,作用是本机通信和测试的
例1 : ifconfig eth0 // 查看任意网卡信息. ifconfig eth0 192.168.9.6 // 临时改变 IP 地址,写入配置文件才能永久生效.
ifconfig eth0 up 和 ifconfig eth0 down
///
定义别名 : 直接 alias 查看所有已定义别名,包括自定义的
比如 alias ls=“ls --color=tty” 和 alias rm=“rm -i”,默认的 ls 命令是不带颜色的,但是系统默认用别名重新定义了 ls 命令,并且加了色
删除别名 : unalias xrm
//
输入/输出重定向 :
同标准 I/O 一样,Shell 对每个进程预先定义 3个文件描述字(0[STDIN,标准输入,比如键盘]、1[STDOUT,标准输出,比如屏幕]、2[STDERR,标准错误输出,也是屏幕])
输入输出重定向就是输入不从键盘输入,输出不用屏幕输出.
输出重定向 : > 清空并写入 >> 追加
ls -l /tmp > /tmp.msg // 把命令执行结果写入根目录的 tmp.msg 文件
输入重定向 :
用 wall 发送信息,可以使用预先写好的文件,然后用计划任务 : wall < /etc/issue
错误输出重定向 :
例1 : cp -R /usr /backup/usr.bak 2> /bak.error // 自动化管理的定期备份中,怎么知道备份成没成功呢?可以在命令后面添加 2> /xxx.error ,如果命令成功就什么都不做,错误文件是空的,命令出错就会把错误信息写入 bak.error 文件。后面的 2> 是固定的语法.
例2 : ls /kdls 2> ls.err // 如果 ls 命令成功,错误日志会清空什么都没有,否则错误信息会被写入 ls.err
// 系统自动化管理脚本,都要加一个这样的判断,否则你判断不了脚本是否执行成功。
为什么要用 2> 呢? 输出重定向有两个字符分别为 > 和 >>,因为它的描述子是 0,所以还可以写成 : > 和 0> 对应 0>> 和 >> ;
输入重定向就是 : < 和 1<;错误输出就是 : 2>,不会有第二种写法了,因为省略了 2 就变成了输出重定向了!
find /home -name .bashrc > list 2>&1 # 把正确和错误的信息写入同一个文件
///
查询文件有多少行 : wc -l /etc/services
参数 : -l : line 有多少行
管道 : 将一个命令的输出传送到另一个命令,作为另一个命令的输入。每条命令用 | 分隔,理论上可以链接 N个命令.
例1 : ls -l /etc | more // ls 的查询结果用 more 命令查看.
例2 : ls -l /etc | grep init // 查看 ls 命令查询结果中有关 init 关键字的行
例3 : ls -l /etc | grep init | wc -l // 查看 ls 命令查询结果中有关 init 关键字的行一共有多少行
///
让多个命令依次执行 pwd ; ls ; date
&& 逻辑与。第一个命令执行成功,才执行第二个命令
|| 逻辑或。第一个执行成功,就不会执行第二个
命令替换符 : 将一个命令的输出作为另一个命令的参数执行
例1 : ls -l which touch
// 先查询 touch 命令的路径,将输出结果作为 ls 参数执行,查看 touch 这个命令文件的属性和权限.
●●● VIM =============================================================================================
标签管理 :
tabe /home/git_log
tabc 关闭当前标签
tabo 关闭其他所有标签
tabs 查看所有打开的 tab情况
tabp(gT) 上一个标签
tabn(gt) 下一个标签
切割模式 :
vim -o one.txt two.txt three.txt # 水平一次打开3个文件,vim -o10 one.txt # 10是预留窗口的数量
vim -O one.txt two.txt three.txt # 垂直一次打开3个文件
:split 水平打开新文件
:vsplit 垂直打开新文件
:new 分割形式新建文件
:close 关闭当前
:only 除了当前都关闭
CTRL-W h 跳转到左边的窗口 适用于 vsplit
CTRL-W l 跳转到右边的窗口 适用于 vsplit
CTRL-W j 跳转到下面的窗口 适用于 split
CTRL-W k 跳转到上面的窗口 适用于 split
CTRL-W t 跳转到最顶上的窗口 适用于 split 和 vsplit
CTRL-W b 跳转到最底下的窗口 适用于 split 和 vsplit
qall 全部退出
另存为 :w /home/lmc/copy.file ; 另存为只是另外 copy,还是编辑当前文件
把文件导入当前编辑文件的光标所在处 :r /etc/issue
VIM 里执行命令 :!ls /
将一个命令执行结果插入到当前光标所在处 :r !date # 将系统时间插入到当前光标处
。如果数据列的名字有可能(在不同的数据表里有同名的数据列),千万不要忘记使用数据表的名字来限定数据列.
定义快捷键 : 先输入:map,然后按 ctrl+v+要设置的快捷键位
例1 :map ^P I# 定义以后可以使用 ctrl+P 来使用 I 在行首插入 #,然后 ESC 退回命令模式
:map ^D 0x 删除首行的字母,可以用来删除上面在开头创建的 #
例2 :map ^E [email protected] 定义以后可以使用 ctrl+E 来使用 i 在当前光标出的前面插入 [email protected] 邮箱地址
取消快捷键 :unmap ^P
替换 :ab mail [email protected] 定义以后,在编辑器里输入 mail 然后回车,自动会把 mail 替换成 [email protected]
取消 :unab mail
默认 vim 设置快捷键、显示行号,只在当前编辑状态里存在,可以通过编辑用户宿主目录的 .vimrc,写入 vim 配置文件让那些操作永久有效 :
set nu
map ^P I#
ab mail [email protected]
在 .vimrc 里用双引号注释 :
首先查看 vim 软件相关的软件包 : rpm -qa | grep vim
然后查询查询其中一个软件包有哪些文件 : rpm -ql vim-common
然后查找一个关于 example 文件,一般关于 example 都是示例文档,所以可以这样查找 : rpm -ql vim-common | grep example
然后 vi 查询一个 example 文件,看到里面是怎么注释的,一般都是用但哥双引号注释,这是解决问题的思路
命令模式下直接按下面进入插入模式 :
a : 光标后开始插入
A : 本行行尾开始插入
i : 光标前开始插入
I : 本行行首开始插入
o : 下一行开头开始插入
O : 上一行开头开始插入
定位命令 :
进入编辑模式都是以冒号开头的命令,命令执行完会立即切换回命令模式,下面是定位到某一行 :
:set nu 显示行号,用 :set nonu 取消显示行号.
h : 向左 j : 向右 k : 向上 l : 向下
H : 跳到当前屏幕的最上面 M : 跳到当前屏幕的中间 L : 跳到当前屏幕的最下面
$ : 光标移到行尾 0 : 光标移到行首
下面可以在行号模式使用,也可以在没有行号也就是命令模式使用 :
按 gg 到第一行,按 G 到最后一行;
命令模式输入一个数字行号,然后按 G 就会到那一行;
命令模式输入 :202 将跳到 202 行
删除命令 :
x : 删除当前光标处的字符 输入数字然后回车再按 x : 删除当前光标及后n个字符
dd : 删除光标所在行 输入数字然后回车再按 dd : 删除包括光标所在行及后面多少行
D : 删除光标处到行尾的内容 dG : 删除包括光标所在行到文件末尾所有行
删除范围 : :444,455d
复制剪贴 :
yy或Y : 复制当前行 数字然后按yy或者数字然后按Y : 复制当前以下 N 行
p : 粘贴在当前行下面一行 P : 粘贴在当前行上面一行
dd 和 ndd 和删除一样,只不过在删除以后再用 p 和 P 就可以实现剪贴的功能
替换 r : 替换光标所在处一个字符. R : 从光标所在处开始向后替换字符,按 ESC 结束
u : 撤销
查找 : 输入斜杠,后面跟上要搜索的字符即可搜索,按 n 向下搜索,按 N 向上搜索… 不区分大小写的查找需要 :set ic,取消不区分大小 :set noic
替换 : :%s/要替换的内容/要替换成为什么/g 范围替换 : :10,15s/要替换的内容/要替换成什么/g
结尾的 /g 是代表替换时不询问,如果换成 /c 每次替换都会问你是否要替换
多行添加注释 :10,30s/^/#/g 多行取消行首的注释 :10,30s/^#//g 要用 ^ 注明删除行首的 #
●●● 引导流程 =============================================================================================
固件 : 硬件时钟是在固件里的,hwclock... 系统里是软件时钟。硬件时钟和软件时钟(Linux系统时钟)同步 :
有些应用需要硬件和软件时间同步才能使用.
hwclock --hctosys // 将系统时间以硬件时钟为标准重置,选项 --systohc 是相反.
修改系统时间 : date 121511302010.38 月/日/小时/分钟/年/.秒
修改硬件时间 : hwclock --set --date="9/22/96 16:45:50"
Linux 引导过程 :
进行 firmware 固件(韧体)加电自检,典型PC使用CMOS/BIOS,在物理层次检测所有硬件是否正常,比如硬盘线没插好,会有报警,或者键盘接口拔下来,会提示无法找到键盘;
读取硬盘存放数据的第一个位置 MBR,MBR 是存放的 Boot Loader(引导加载程序,自举程序,作用是 1. 提供菜单,用户可以选择不同的开机选项 2. 加载内核文件 3. 转交给其他分区 boot loader),在 Linux 系统里面广泛采用 GRUB,作用是载入内核; 每个分区都有启动扇区,可开机内核是放到各个分区的。
内核作用是驱动硬件,然后启动 init 进程;
然后这个进程读取系统配置文件 /etc/inittab;
系统根据 inittab 判断缺省运行级别 initdefault;
然后执行脚本 /etc/rc.d/rc.sysinit 它是任何级别只要系统启动都会执行的脚本,进行系统基本服务加载;
根据设置的 initdefault 的缺省运行级别设置,执行 /etc/rc.d/rc 脚本,这个脚本会判断 initdefault,比如 : L5:5:wait:/etc/rc.d/rc 5;
然后它会根据 initdefault 加载对应的启动目录下的启动服务 /etc/rc.d/rcN.d N=0-6 来完成后续启动过程;
弹出 username 和 password,让你输入用户名(/etc/passwd)和密码(/etc/shadow),然会认证用户名密码是否有效
内核文件 :
1. 保存最多是硬件驱动程序,内核加载过程中会驱动识别硬件,固件在物理硬件层面上检测是否连接好,线有没有插错。内核是在操作系统软件层次上识别这个硬件是否能够被调用.
2. 启动 init 进程,读取 inittab 文件。 init 进程 PID(PPID 是父进程)永远都是1,其他的进程每次启动都是随即的。
PID 0 是内核调度器,分配 CPU 时间。 Linux 是分时,多用户多任务,分时就是CPU分成小的时间片,任务排队处理。一个 CPU 循环周期里,会给每一个任务分配一个 CPU时间,如果执行完就结束,执行不完在下一个循环周期里再次分配 CPU 时间。内核调度器就是来做 CPU 分配时间和进程切换的。它是 init 父进程.
Linux 的 Boot Loader 是 GRUB.. Windows 是 ntldr.
vi /etc/grub.conf // 查看 GRUB 配置信息,这是链接文件,真正文件放在 /boot/grub/grub.conf
kernel 版本号 : kernel /vmlinuz-2.6.18-194.e15 这是压缩可执行文件,在引导载入内核的过程会有一个解压缩的过程,所以 vmlinu 后面是个 z
可以在网上下载最新版内核升级,由3个数字组成 : r.x.y
r : 目前发布的 Kernel 主版本
x : x 偶数说明是稳定版本,如 2.4.4 x 位为奇数的版本一般加入了一些新内容,是测试版本,如 2.1.111
y : 错误修补的次数
查看内核文件 : ls -l /boot/vmlinuz-2.2.16-22
安装完 Linux 内核源文件,或者是从网上下载以后解压的文件,放在 ls /usr/src/linux 里或指定目录,是一堆源代码文件,可以直接编译升级.
父进程关闭,子进程必须关闭。如果父进程结束了,子进程因为某种原因没有结束,系统检测到孤儿进程,会自动把它的父进程指向到 init... 另一种情况子进程结束了,父进程不知道,父进程还保持和子进程的联系,此时子进程就是僵尸进程,系统也不允许存在的(大写 Z 表示)
查看 /etc/inittab init的运行级别(runlevel) : 类似 windows 安全模式.
0 : 关机(不能作为默认设置,否则电脑无法开机) 1 : 单用户模式,只有 root 可以登录(没有图形界面),登录不需要密码,类似 Windows 安全模式
2 : 字符界面多用户模式,常用服务器运行模式,没有 NFS(网络文件系统,实现 Linux 和 Unix 之间文件共享) 服务,但安全性不好
3 : 字符界面多用户模式,常用服务器运行模式,同 2,但他有 NFS 服务
4 : 只启动自己需要启动的服务 5 : 图形化多用户模式,默认运行级别,带图形界面 X11(X-Window版本号),和2的区别带图形环境
6 : 重启(不能设为默认设置,否则电脑会一直重启)
切换运行级别 : 查看当前运行级别 runlevel 切换运行级别 : init [0123456Ss] 和 telinit [0123456Ss]
用 ls -l `which telinit` 可以看到 telinit 是 init 的软连接
S : 运行级别 1
inittab 文件剖析 :
id : run-levels : action : process
id : 是一个标示符;
run-levels : 是执行级别,如果该参数省略,表示0-6每个运行级别都执行... 也可以写多个运行级别,12345 表示这几个运行级别都要执行
action : 指定要在什么状态来运行
process : 指定要运行的脚本/命令
id:5:initdefault: // initdefault 指定系统缺省的默认运行级别
si::sysinit:/etc/rc.d/rc.sysinit // sysinit 任何级别只要系统启动就执行。/etc/rc.d/rc.sysinit 完成系统服务启动,系统环境变量加载,设置时钟,加载字体,检查加载文件系统,生成日志信息,它是个 shell 脚本. 如果有命令和脚本希望只要系统启动就执行,可以写到这个文件末尾.
下面会执行 /etc/rc.d/rc 脚本,这个脚本会根据上面 initdefault 运行级别,读取对应 ls /etc/rc.d/rc5.d 下的启动脚本
这 6 个目录也可以在 /etc 目录里找到(有些商业 Unix 都是存放在 /etc) : /etc/rc[0-6].d 实际上他是 /etc/rc.d/rc[0-6].d/ 下的软连接目录,而他下面的所有命令文件都是 /etc/rc.d/init.d 里的软连接.. 只不过重新命名了,执行以后最终都会找到 /etc/rc.d/init.d 下的源文件
L0:0:wait:/etc/rc.d/rc 0 // wait 表示只有后面的命令/脚本执行完后才能执行其他的脚本/命令,对应 once 是不等待其结束
L1:1:wait:/etc/rc.d/rc 1
L2:2:wait:/etc/rc.d/rc 2
L3:3:wait:/etc/rc.d/rc 3
L4:4:wait:/etc/rc.d/rc 4
L5:5:wait:/etc/rc.d/rc 5
L6:6:wait:/etc/rc.d/rc 6
拿 /etc/rc.d/rc5.d 举例,这个文件内容里有 S 和 K 开头的脚本,它会启动所有 S 开头的脚本,大写开头的 K 是不启动的,它的作用是在系统切换运行级别的时候,根据 K 开头来判断哪些该运行级别是要关掉的;然后是数字,越小越优先启动;然后是脚本名称;
可以根据系统当前运行级别,修改那个 rc[x].d 目录下某个文件,把不需要启动的脚本改成别的字母开头,最好能让你一眼就知道它是自己修改关闭的 :
mv /etc/rc.d/rc3.d/S03vmware-tools /etc/rc.d/rc3.d/s03vmware-tools // Linux 严格区分大小写,所以把 S 改成 s 它就不会执行了
其他 action :
类似于 Windows 快捷键 ctrl+alt+del : ca::ctrlaltdel:/sbin/shutdown -t3 -r now // 3秒后立即重启
启动终端,2345 运行级别都可以使用,可以用 CTRL+ALT+F1-F6 来启动,也可以编写 inittab 在下面加个 tty7 自己添加一个终端 :
1:2345:respawn:/sbin/mingetty tty1 // respawn 表示一旦这个 process 运行终止,就重新运行,也就是说这个终端不能被终止
2:2345:respawn:/sbin/mingetty tty2 // 可以在命令终端 quit 退出这个终端,虽然退出了,但它没有终止,而是提示你重新登录
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon // 运行级别 5 才执行X-window
powerfail : 电源错误时执行 process 指定命令,不等待其结束; powerokwait : 电源恢复时执行 process 指定的命令.
ls /etc/rc.d/init.d(也存在 /etc/init.d) 存放各个运行级别服务启动脚本,Linux 安装的服务对应的启动脚本都在这个目录。
手工启动或关闭服务 : 如果不知道有哪些命令,可以直接运行这个脚本,比如 : /etc/rc.d/init.d/sshd 会提示有哪些选项 :
/etc/rc.d/init.d/sshd start 开启 /etc/rc.d/init.d/sshd stop 关闭 /etc/rc.d/init.d/sshd restart 重启 /etc/rc.d/init.d/sshd status 运行状态
注意 : reload 重新读取这个服务的配置文件,和 restart 区别是它不需要重启服务,重启中间会有一个停止过程
condrestart : 和 restart 区别,restart 如果之前服务是关闭的,重启会失败,condrestart 会检测进程在运行再执行 restart
操作练习 : 写一个脚本放在 /etc/rc.d/init.d 下面,让它在某个运行级别自动执行,或者安装了一个服务,让它自动执行。
vi /etc/rc.d/init.d/msg.script // 新建并进入
# ms.script 文件内容(好像不是 .script 不能执行,.sh 也好像只能放 shell 脚本才能执行) :
date >> /root/msg.today // 将系统当前时间插入到 msg.today 文件里
who >> /root/msg.today // 当前登录有哪些用户
free >> /root/msg.today // 系统内存信息
然后给这个文件执行权限 : chmod u+x /etc/rc.d/init.d/msg.script
在某运行级别自动执行,在那个级别目录下生成一个软连接文件 : ln -s /etc/rc.d/init.d/msg.script /etc/rc.d/rc3.d/S100msg.script
控制系统已存在服务的启动和关闭 :
1. 利用 ln 制作一个软连接放到相应的启动级别下,直接通过修改服务名称为 S 开头设置..
2. chkconfig :
chkconfig --list // 会列出系统所有服务在每个级别下的启动状态
chkconfig --list sshd // 查看某个服务在每个级别下的状态
chkconfig --levels 2345 sshd off // 这时 sshd 在 2345 运行级别都是关闭的
chkconfig --level 3 sshd on // 在运行级别 3下面开启.
3. ntsysv 菜单界面来设置 :
ntsysv 缺省 --level 是针对当前系统运行级别进行设置。
ntsysv level 3 会弹出运行级别 3 所有安装服务,有星号则启动,没星号不启动,按空格去掉星号,按 TAB 切换到 OK 来完成设置
列出系统启动过程信息 : dmesg 其中最重要的是内核驱动硬件信息
例如 : dmesg | grep eth0 能识别就能打出相关信息,如果什么信息都没有说明这块网卡没有被识别
dmseg | grep sdb 新添加硬盘,没有打印出相关信息就说明硬盘没识别。比如 dmesg | grep sda 被识别会显示一些信息(大小,分区情况等)
系统所有日志都存放 /var/log 里. 系统启动过程中,如果发现服务没有办法正常启动,可以查看 ls /var/log/messages(很多日常日志信息) :
grep sshd /var/log/messages // 没有返回说明是正常的,或者得到他的一些信息. 如果启动过程出现错误,它也会列出来
如果系统启动出现严重错误,可以查看 boot.log,缺省是空的
GRUB :
grub 配置文件是 /boot/grub/grub.conf 软连接文件 : /etc/grub.conf
default=0 : 默认启动系统,下面如果有多个系统,每个系统都会以 title 有一个段落,这里 0 代表第一个,如果有两个操作系统,1 就是代表第二个
timeout=5 : 缺省等待的时间,开机时的数秒,如果每次启动需要启动不同的系统,可能因为时间太短来不及选择,可以把它设置长一点
splashimage=(hd0,0)/grub/splash.xpm.gz // 设置开机背景图。。Linux 里 hda 表示第一块硬盘,hdb 表示第二块,但 grub 里使用 hd0 表示第一个硬盘,hd1 表示第二个,而 hd0,0 表示第一块硬盘,第一个分区,hd0,1 表示第一块硬盘,第二个分区… 这个图片是存放在 /boot/grub 里的,这里 hd0,0 代表的是 /boot 所在的分区,可能安装 Linux 时没有为 boot 建立独立分区,所以就是默认就是在根分区,就是 hd0,0,如果为 /boot 独立建了一个分区就不一定是 0了,要根据它在哪个分区
hiddenmenu : 隐藏菜单,倒数 5秒的时候没有显示 grub 菜单,就是因为它的作用,删掉它就不会有倒数过程,启动时会直接弹到菜单界面
系统段落 :
title 后面值可以随便改,它会显示在菜单上;
root (hd0,0) : 表示内核存放(分区),默认内核放在 boot 里,而这里 boot 是在默认根目录里的,就是第一个分区
kernel /vmlinuz-2.6.18-194.e15 ro root=LABEL=/ rhgb quiet
内核存放位置,根据上面 root 分区来,这里就是 hd0,0 就是 boot 所在分区,这里实际就是 /boot/vmlinuz-2.6.18.. 后面 ro 表示内核只读
initrd /initrd-2.6.18... 载入镜像文件
进入单用户模式 : 在读秒时,任意键打开 GRUB 菜单 :
按 e 编辑当前启动菜单项 按 c 进入 GRUB 命令行模式
按 b 启动当前的菜单项 按 d 删除当前行 按 ESC 返回 GRUB 菜单界面,取消对当前菜单项的修改
按 e 进入编辑模式,然后选择 kernel /vmlinuz-2.6.18-194.el5 ro root=LABEL=/ rhgb quiet ,按 e 进行编辑,然后在后面添加运行级别就可以了.
比如 kernel /vmlinuz-2.6.18-194.el5 ro root=LABEL=/ rhgb quiet 3 进入运行级别 3,修改后,系统启动不会进入默认运行级别,而是在 GRUB 引导载入内核,内核启动直接读取这个级别. 进入单用户模式后面跟上空格 1 就可以了. 编辑好按 b 启动. 如果忘了 root 密码,可以进单用户模式只有 root 可以登录,并且不需要密码. 然后 passwd root 更改密码.
为 GRUB 设置密码 : 避免任何人可以坐在电脑前进入单用户模式任意修改
先生成 MD5 密码命令 : grub-md5-crypt // 然后会提示输入密码,两次输入后,会生成 MD5 密码;
也可以 : grub 先进入 grub 命令行,然后输入命令 md5crypt,两次输入后,会生成 MD5 密码,然后 quit 退出 grub 命令模式 ;
字符界面可以使用左键选择,然后右键就会复制密码.. 编辑 /etc/grub.conf,在 title 上面加入 : password --md5 !asdf$afsdfsf!
如果写在了操作系统段落里,表示针对这个操作系统才有密码,也可以针对每个操作系统设置不同的 grub 密码;
此时进单用户模式,显示 grub 菜单时,会提示输入 p 输入密码,只有按 p 后输入正确密码才会显示正常的按 e 进入编辑模式,否则按 e 是没有反应的
可能遇到这种情况 : 升级内核或其他操作修改了 grub.conf 文件,改错了,比如上面 kernel /vmlinuz-2.6.18-194.el5... 写成了 kernel /vmlinux-2.6.18-194.el5,此时重启系统没有弹出一个引导界面可以按 ESC 进入 GRUB 菜单,而是直接显示了一个 grub 提示符,进入了 grub 命令行.. 首先进入到 grub 命令行 :
cat /grub/grub.conf // 查看这个配置文件,看看哪里写的不对
然后手动完成引导过程,通过手工正确载入下面选项,照着上面查看结果敲就行 :
root (hd0,0) 回车
kernel /vmlinuz-2.6.18-194.e15 ro root=LABEL=/ 3 载入内核,并进入到运行级别 3,回车
initrd /initrd-2.6.18-194.e15.img 回车,载入镜像文件
最后敲入 boot 回车,系统就可以正常引导了,然后进入系统后更改 grub.conf 来进行配置修复.
如果发生这样无法启动,根据提示信息,如果是 GRUB 的错误,只要手工引导,进入系统后,再改它的配置文件修复... 异常断电造成扇区错乱或文件损失,可以进入单用模式进行修复,或者别人进入到 inittab 把缺省运行级别改成了 0 或 6,都可以在启动时进入 GRUB编辑模式,把 kernel 运行级别指定到 3 或 5 在进行修复就可以了.
另一种情况,比如干掉或改错了 initab 文件,在启动内核检测硬件的过程中,会检测找不到 initab 文件,无论单用户模式或者 GRUB 手工引导启动过程中都需要 initab,而此时还没有进入到命令行界面,就已经找不到 inittab 了,这时就需要使用光盘修复.
插入光盘,重启按 F2,进入 BIOS,在 Boot 把 CD-ROM 放在最前面,按 f10 保存退出,在安装界面输入 : linux rescue 进入 linux 修复模式,过一会儿会提示你选择语言(对中文支持不好,所以默认)、键盘、是否需要网络(setup Networking)、Rescue(它会提示把已经安装的 Linux 根分区文件放到了 /mnt/sysimage 下面,选择 Continue 有读写权限,不能选择 Read-Only,否则只能看不能改)、然后会提示你可以使用 chroot /mnt/sysimage 改变根分区,就能像原来操作系统一样操作,因为它会把根分区所有数据挂在 /mnt/sysimage 下面,需要用 chroot 把它切换回来,否则在针对根分区进行操作时,就要在前面加上 /mnt/sysimage. 此时就可以用 Linux 命令来编辑配置文件、恢复备份来进行修复了. 修完后,用 exit 退出,系统就会重新引导,完成系统修复过程.
如果用单用户模式或者 GRUB 手工启动修复都不能解决问题,比如 root 密码和 GRUB 密码都忘了,就可以用这个方法进行修复,用上面方式进入命令模式,然后修改 grub.conf 密码。又比如配置文件被删除或严重修改了,比如 inittab 被删除了.
///
安装包管理 :
RPM 二进制包 : sudo-1.7.2pl-5.el5.i386.rpm
软件名(sudo) 版本号(1.7.2pl) 发行号(5.el5 relase,版本更新,更新一定程度后,可以更新一下版本号,可以自己定义规则)
硬件平台(i386, x86 架构 PC,intel 32位或 64 位处理器,64 有时也写成 i686),也可能是 ppc(power pc,苹果cpu),和 alpha(康柏),linux cpu 硬件平台比较多,常见这3种..
; x64 是指 CPU 是 64 位的. x86 是指 CPU 是 32 位版本的。
; 如果你的 CPU 是 64 位的. 可以安装 64 位的,也可以安装 32 位的,反过来只能安装 32 位的
卸载软件包 : rpm -e sudo // sudo 是软件的名称
参数 : rpm -e --nodeps samba // 有时卸载软件会被终止,说有其他软件依赖此软件,加了 --nodeps 表示忽略这种依赖关系,强行卸载
光盘以文件形式存储,在 dev 目录,不能直接调用,需要挂载点(空目录). 一般都是 /mnt,光盘、软盘、U盘,光盘就是 /mnt/cdrom,也可以自己随便创建一个空目录,然后挂载
挂载 : mount /dev/cdrom /mnt/cdrom // 这次访问 /mnt/cdrom 就相当于访问光盘的内容
/mnt/cdrom 下是一些光盘的文件,/mnt/cdrom/Centos(Linux 发行版本名称) 下是所有 rpm 二进制安装包(太多了).. 可以通过 ls -l | grep sudo 就可以查找到了.
rpm :
安装软件包 : rpm -ivh sudo-1.7.2pl-5.el5.i386.rpm 注 : 打了软件名 sudo 后用 tab 自动补全
-i install 安装 -v 命令执行的详细信息 -h 安装进度提示
--exludedocs 不安装文档
--prefix=/usr/local/sudo 指定安装目录(意义不大,大多 rpm 不允许改变安装目录)
--test 只对安装进行测试,并不实际安装(是否已安装,是否有冲突,是否有一些依赖的软件包)
--replacepkgs 覆盖安装(不小心删除了文件,可以重新安装该软件)
--replacefiles 文件冲突。软件包一个文件在安装其他软件包时安装,会有冲突提示(conficts with file from...)
--nodeps 依赖关系。安装此软件依赖于其他软件包,错误信息 : failed dependencis : sudo is needed by... 比如 : 安装此软件需要更高版本编译器或其他原因. 这个很头疼,比如装了 A 软件需要 B软件支持,装B软件需要C软件支持... 因此有了 yum
升级软件 : rpm -Uvh sudo-1.8.0pl-5.el5.i386.rpm
校验文件 : rpm -V sudo (RPM 安装软件包到系统时,会自动生成 RPM 库,它会通过对库的比较生成一个值,在系统管理是有参考价值的)
如果文件没有被修改过,不会有输出. 否则会提示类似 : S.5....T c /etc/sudoers
字符串里的字母解释 : 5 (文件的 md5 校验值,表示文件内容变了(不包括所有者,所有组,权限))
S (文件大小变了,如果只是相对应替换不会有 S,只要是增加了或删除了字符,都算是改变大小)
T (文件创建、修改时间有变动)
M (文件权限被改过)
U (所有者改变过)
G (所属组改变过)
L (表示符号连接)
D (设备文件特征被改变了:表示主从设备号)
rpm 查询 :
判断是否安装 : rpm -q sudo 查看一个软件包是否被安装,已安装返回该软件名称和版本号,否则 package webmin is not installed
rpm -qa | grep samba 列出系统所有已安装的 rpm 软件包(-a 表示所有),并只查找和 samba 相关
-a : 查询所有已安装软件包
-f : 查询文件所属软件包
-p : 查询未安装软件包信息
-i : 显示软件包信息
-l : 显示软件包中的文件列表
-d : 显示被标注为文档的文件列表
-c : 显示被标注为配置文件的列
red hat linux 里任何一个文件包括配置文件、命令都是通过 rpm 文件包安装的,可以用下面 -qf 来查看一个文件属于哪个文件包
查看任何文件属于哪个 rpm 包 : rpm -qf /etc/services rpm -qf /bin/ls
查询软件包装了哪些文件在系统 : rpm -ql sudo
查询软件包信息 : rpm -qi samba
查询没安装的软件包信息 : rpm -qip vsftpd-2.0.5-16.e15_4.1.i386.rpm 因为软件包还没安装,查看他的作用必须打全名
查看已安装软件帮助文档 : rpm -qd vsftpd
查看未安装软件帮助文档 : rpm -qdp vsftpd
查看已安装软件配置文件 : rpm -qc samba
查看未安装软件配置文件 : rpm -qcp samba
误删了系统文件,可以从 RPM 包提取文件进行恢复 :
# 解压所有文件到当前目录 : rpm2cpio initscripts-8.45.30-2.e15.centos.i386.rpm | cpio -idv
# 解压指定文件到当前目录 : rpm2cpio initscripts-8.45.30-2.e15.centos.i386 rpm | cpio -idv ./etc/inittab
-i 表示执行 -d 保留软件包安装到系统中的目录结构 -v 可以不加 后面的 ./etc/inittab 表示要提取的哪个文件
注意 : 只能解压到当前目录,而且后面 /etc/inittab 必须保持它安装以后的路径一致,inittab 是安装在系统 /etc 目录下的,所以后面必须是 /etc/inittab,./ 表示当前目录
比如不小心删除了 inittab,删除 inittab 以后系统没办法引导,也无法进入但用户模式,只能用光盘修复,但如果删除了以后没有重启,可以通过从 RPM 包提取文件来恢复 : 首先查看 inittab 是哪个安装包安装的,rpm -qf /etc/inittab (虽然已删除,但他是从 rpm 库定位的,所以还是可以查看)
然后 : rpm2cpio xxxxxxxxxxxxxxx | cpio -idv ./etc/inittab 然后通过 cp etc/inittab /etc/inittab 来拷贝过去
MD5 校验值 : 用 md5sum /etc/services 生成一个校验值,这个文件只要没改,校验值永远都是这个,如果内容变了(加空格也算),md5 校验值就会变化.
yum : 自动安装所需软件环境(需要联网),不用手动查找、下载安装包升级,Centos 或其他任何 Read Hat Linux 用 yum 安装后会自动指向一个 rpm 源,源也可以自己修改到其他地方(还得手动更新源),一般默认的官方源就可以了.
yum 好处 : 自动去网上下载,避免自己下载安装包,同时夹带木马的可能
列出 yum 源所有 rpm 包 : yum list | more installed 表示已经安装,或者可以升级(updates)
找相关的 : yum list | grep sudo
查看是否已经安装和卸载 : yum list | grep sudo 最后一列会显示状态,比如是否安装,需要更新等.. 或 rpm -q sudo 来检测,这个功能用 rpm 速度快,因为 yum 需要联网检测慢,所以用 rpm 和 yum 根据情况,安装可能需要一些关联软件,用 yum 不需要手动下载安装.
检测软件包信息(查询软件包是干嘛的) : yum info sudo
安装 : yum install sudo
升级 : yum check-update sudo
卸载 : yum remove sudo
设置 yum 将光盘作为 yum 源 : 1. vi /etc/yum.repos.d/CentOS-Media.repo
(1). 设置 enabled=1
(2). baseurl=file:///mnt/cdrom ; 添加指定光盘挂载位置
2. mkdir /backup
mv /etc/yum.repos.d/CentOS-Base.repo /backup 把 /etc/yum.repos.d 下的另一个非 Media 移到别的地方,yum 就可以使用光盘作为 yum 源安装软件了.
源代码包安装 :
一般软件最新版本都是源代码包,自己编译,可以自己修改代码,在编译过程中增加或去掉相关设置,定制度高
1. 首先解压压缩包到当前目录,进入解压的目录里,然后执行目录下的(搜集系统信息,创建 make file 文件,为编译准备) 可执行文件 configure :
./configure --prefix=/usr/local/proftpd/ # 后面加个 /,说明一下这是目录,其他 Linux 版本不说明可能会有错
; Linux 使用习惯是将源代码包安装在 /user/local 下
2. 然后将源代码编译成可执行文件 : make (调用刚安装的 GCC编译器,把 C 源代码编译成文件)
3. 安装 : make install (把刚才编译生成的文件拷贝到指定位置,拷贝和生成一些文件)
卸载 : 先关闭进程 : kill pgrep proftpd
然后删除安装目录 rm -rf /usr/local/proftpd 即可…
make clean
脚本安装(shell 和 Java) :
先看 README 或者 INSTALL
卸载的话在安装目录下看看是有有 uninstall 类似卸载的脚本,或者直接删除安装目录即可
Debian 是 Ubuntu 基础上做的,比如界面更友好之类的,如果是 Debian 系列的安装软件包,使用下面方式安装 :
APT 包管理 :
搜索软件包 : apt-cache search 对应 rpm -qa 和 yum list
软件包信息 : apt-cache show 对应 rpm -qi 和 yum info
安装软件包 : apt-get install(选项 : reinstall 覆盖安装 -f 修复安装)
删除软件包 : apt-get remove apt-get autoremove(自动解决依赖关系) (选项 : --purge 不保留配置文件)
更新软件源 : apt-get update 更新已安装包 : apt-get upgrade
●●● 用户管理 =============================================================================================
/etc/passwd : 每行一个用户,用 wc -l /etc/password 有多少行就有多少用户
格式 : root:x:0:0:root:/root:/bin/bash
; 用户名(最好不要超过8位)
; 密码位(真正密码放在 /etc/shadow.. Linux 每次设置密码都是先写到 passwd,系统自动到 shadow.. 使用 pwunconv 命令可以将密码回写到 /etc/passwd,并删除会 shadow 文件,再查看 passwd 文件就能看到密码,用 pwconv 将密码写到生成的 shadow文件,当你修改密码时,系统会自动执行 pwconv,Unix 系统没有这两个命令,商业版 Unix 基于安全性考虑)
; uid(超级用户UID=0,UID 为0的就是超级用户,编辑 /etc/password,随便将一个用户UID改为零,他就是超级用户,和 root 没有区别,超级用户 uid=0,普通用户 uid 500-60000,伪用户 uid 1-499). 伪用户是安装系统或者安装服务时自动生成的用户,系统操作(shutdown/halt/bin/daemon等)和服务应用(mail/apache/ftp/mysql/sshd等)的时候会调用的用户身份,没有宿主目录,并且 shell 是 notlogin,所以不能登录.
; GID(缺省组标示符). 用户组是同样类型用户的集合,一个用户可以属于多个组,但新添加的用户,必须有个缺省的组. 添加用户没有指定组,Linux 分为两种情况,系统会创建一个和用户名相同的组(CentOS),或一些 linux 会把它指向一个缺省的组. 他享有该组的共有权限. 组至少要按照部门来划分,比如添加的用户属于产品部,项目一组还是项目二组. indows 有嵌套组概念,一组用户可以属于另外一个组,Linux 不行. 最好手动指定.
; 用户的描述信息.可空.. 添加用户的时候最好写上描述,比如 project zhangsan ,这样给用户统一授权的时候比较直观,一看就知道该给什么权限,不然用户多了很难通过英文名字来判断授予什么权限.
; 宿主目录. 存放基本信息.. 如果添加用户不设定宿主目录,系统会自动在 home 下创建同名目录
; 用户缺省使用命令解释器 shell... 指定为 notlogin,则用户不能登录系统
密码使用 MD5/DES 混合,可以只使用 md5,它是 255 位的. md5 单向不可逆. 其实可以破解,也就是猜密码,对无数字符串进行加密然后比对.
echo "haha" | md5sum
/etc/shadow(root 只读,所以安全) : 忘记密码,编辑该文件删除密码部分,登录就不需要密码了.
格式 : 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
; 用户名
; 加密的密码。单叹号代表帐号被锁定;双叹号表示密码已过期。$6$开头表明是用SHA-512加密的;$1$ 是用MD5加密;$2$ 是用Blowfish加密; $5$ 是用 SHA-256加密的。
; 最后一次修改时间,以天为单位,他是从 1970 年一月一日开始计算的. 1969年开发出 UNIX 雏形,所以很多人称 UNIX 正式诞生时间是 1970年1月1日
; 最小时间间隔. 两次修改密码之间的最小天数,一般是 0 不限定. 假如改为 3,用户改完密码必须 3天后才能再改(不常用)
; 最大时间间隔. 密码有效期天数,到了天数如果不改密码,系统将不再允许这个用户登录(常用)
; 警告时间,配合上面最大时间间隔使用,比如设为 3,那么当最大时间间隔期限只剩 3天,会自动给用户发送提醒.
; 账号闲置时间,用户多久没登录了,如果每天登录他是空的,如果3天没登录,这里就会显示3,可以通过提取该值判断一个用户多久没有登录
; 失效天数.. 比如账号被停了,他可以累积一个天数
; 标志(空的,一般不使用)
// 手动添加用户 :
1. vi /etc/passwd 添加一行 lmc::502:502:我是管理员:/home/lmc:/bin/bash
2. mkdir /home/lmc chown lmc /home/lmc
3. vi /etc/shadow 复制一行,用户名改为 lmc,密码为空. 它是只读文件,root 需要用 wq! 强行保存退出
4. 用户可以直接输入用户名,不需要密码就可以登录了.
5. 把 /etc/skel(新用户信息文件,基本的信息配置文件,都是隐藏的)下的文件都复制到 /home/lmc 下就行了
cd /etc/skel 然后 cp -rf .* /home/lmc
6. 上面创建用户时是新建的的组,所以需要手动添加一个组,不然登录时会有提示
// 手动删除用户 : 删除 /etc/passwd 和 /etc/shadow 关于用户的信息删掉,删除 /etc/group 组中关于该用户的信息,然后干掉用户创建的文件就行了.
通过 find -user -uid -group -gid 来查找该用户相关文件,然后用 -ok rm {}\; 来删除或其他操作
// 全局用户配置参数文件 /etc/login.defs
MAIL_DIR /var/spool/mail ; 邮件保存位置. Linux 缺省安装后,用户之间默认可以使用 sendmail 互相发送文件,CentOS 使用的 Qmail
PASS_MAX_DAYS 99999 ; 最大时间间隔
PASS_MIN_DAYS 0 ; 最小时间间隔. 为 0 不限. 如果用 root 为用户改密码,将不受此参数限定,因为 root 是超级用户
PASS_MIN_LEN 5 ; 密码最小长度. 如果用 root 为用户改密码,将不受此参数限定,因为 root 是超级用户
PASS_WARN_AGE 7 ; 警告时间
UID_MIN UID_MAX 新添加的用户 ID 介于这两个参数数值之间,对应 GID_MIX 和 GID_MAX 组ID亦如此.
CREATE_HOME yes ; 添加用户是否缺省自动创建宿主目录
UMASK 077 ; 缺省创建文件和目录的权限
// 全局用户配置文件 /etc/default/useradd
GROU=100 ; 默认组
HOME=/home ; 缺省宿主目录存放位置,不是固定的,添加用户时可以放在任何位置,大多数是放在一个统一的目录下,方便管理和备份
INACTIV=-1 ; 用来表示添加的账户是否被禁用,-1 表示没有被禁用,0 就是缺省不能使用.
EXPIRE= ; 账号失效时间,useradd 时可以指定他失效时间. 比如做项目时会有其他合作伙伴技术人员参与,需要在服务器上给他添加一个用户给予适当权限,但他可能只用一个月,就可以给他指定个失效时间.
SHELL=/bin/bash ; 缺省使用 SHELL.. 如果希望一个用户不能登录系统,把用户 shell 指定为 notlogin 就可以.
SKEL=/etc/skel ; 新添加用户默认配置文件存放目录,可以随便修改,但这里要指定一下
CREATE_MAIL_SPOOL=yes ; 每添加一个用户要不要在/etc/login.defs 文件指定的邮件保存目录下创建一个和用户同名保存邮件信息的目录
/etc/issue 命令行登录前显示的信息,最好改一下,不然版本号就泄露了,别人可以在网上针对版本找到一些攻击漏洞
/etc/motd 登录成功后显示的信息. 可以放一些参考信息、针对内部人员的公告等,FTP Server 地址等.
添加用户 : useradd lmc ; 实际这个命令就是写到 /etc/passwd 文件里
; useradd -D ; 查看缺省用户配置,其实就是 /etc/default/useradd 文件
; useradd -u 888 -g 889 -G sys,root -d /backup -s /bin/bash -c “Market wangwu” -e 6 lmc
-g : 指定“默认”组 -G : 指定多个组,一个用户可以属于多个组
-d : 指定宿主目录 -c : 对用户描述,有空格要用双引号
-e : 指定用户失效时间,是天数,不是日期
设置密码 : passwd lmc
passwd -d lmc ; 删除密码
passwd -S lmc ; 查看用户密码状态(/etc/shadow 中提取的结果) 提示 empty password 就是没设置密码
passwd -l lmc ; 锁定密码,用户登录不了,相当于在 /etc/passwd 里 MD5 密码前面加了两个叹号,也可以自己修改文件
passwd -u lmc ; 解锁密码
删除用户 ; userdel lmc ; 删除用户,保存宿主目录
userdel -r lmc ; 同时删除宿主目录,但不会删除其他目录该用户创建的文件,但可以 find 命令查询
修改用户 : usermod -l tomgao jackgao ; 把 jackgao 改成 tomgao
usermod -G webadmin tomgao ; 把用户加进 webadmin 组里,查看结果 : grep webadmin /etc/group (所有 unix 都支持这个命令和此参数)
// 其他参数和添加用户一样.
密码设置 : chage -l lmc ; 查看 /etc/shadow 里的配置,但是更直观… unix 不支持此命令
-m 3 lmc ; 密码修改最小天数
-M 3 lmc ; 密码修改最大天数
-d ; 密码最后修改的日期
-I ; 密码过期后,锁定账户的天数
-E ; 设置密码过期时间. 为 0 代表密码立即过期,-1 则永不过期
-W ; 设置密码过期前,开始警告的天数
Linux 命令 : authconfig 可以更改一些设置,直接敲命令会告诉你所有选项,是临时有效的
永久生效可以直接编辑 vi /etc/sysconfig/authconfig
是否启用 shadow 记录密码、是否启用 MD5 算法等,一般不需要修改
组配置文件 : /etc/group
sys::3:root,bin,adm
组名;
密码位和用户配置文件一样,非真实密码,一般为空不使用,组密码作用就是可以让不是这个组的成员切换到这个组
组数字标识;
组成员列表;
查看 : grep webadmin /etc/group ; 查看组配置文件里关于 webadmin 的那一行,删除等等操作以后可以用此方法看结果
添加组 : groupadd webadmin
groupadd -g 18888 leaders ; 指定 Id
修改 : groupmod -n apache webadmin ; 将组名修改为 apache
删除 : groupdel webadmin ; 最简单的办法就是删除组配置文件那一行就行了
设置管理 : gpasswd webadmin ; 为 webadmin 组设置密码
gpasswd -r webadmin ; 删除组密码
gpasswd -R webadmin ; 禁止用户切换到该组
gpasswd -a samlee webadmin ; 把 samlee 加入 webadmin 组
gpasswd -d samlee webadmin ; 把 samlee 从 webadmin 组删除
gpasswd -A samlee webadmin ; 把 samlee 提升为 webadmin 组管理员,这样 samlee 可以管理该组,他就可以添加、删除该组成员
组密码文件 : more /etc/gshadow
对应也有 grpconv 和 grpunconv,默认系统会把密码现存进 /etc/group 文件,然后自动执行 grpconv,转放到 /etc/gshadow,和添加用户一样
grpunconv 后会删除 /etc/grpshadow,密码会写回 /etc/group 里,使用 grpconv 会把密码写进 /etc/gshadow…
如果执行了 grpunconv 没有转换回来,很多对组的操作将没办法执行,比如设置一个组的管理员
newgrp webadmin ; 切换到 webadmin 组
有时可能需要几个用户同时对一个目录有操作权限(w,创建删除等),最好解决办法是把这些用户添加到一个组中,然后调整该目录对组的权限即可 :
mkdir /myfile ; root 身份添加的文件只有 root 有 rwx,其他用户都是 r-x
useradd lmc; useradd tmj; groupadd webadmin;
usermod -G webadmin lmc; ; 所有 unix 系统支持
gpasswd -a tmj webadmin; ; 仅 linux 系统支持此命令
chgrp webadmin /myfile chmod g+w /myfile
这两个用户就可以对目录有写权限了.
pwck ; 检测 /etc/passwd 用户文件有没有错误,比如少了个冒号
grpck ; 同上,是判断 /etc/group 配置文件是否有错误
vipw ; 编辑 /etc/passwd 文件,跟 vi /etc/passwd 一样,并且锁定,其他人无法编辑
vigr ; 同上,编辑 /etc/group
id ; 查看当前登录用户 uid 和组信息
groups ; 查看当前登录用户的组内成员 groups lmc // 查看 lmc 用户所在组,以及组内成员
finger ; 查看当前用户登录信息
finger lmc ; 查看指定用户信息,会显示从哪个 IP 登录,详细登录时间,计划任务等. 本地登录称为 tty,远程登录称为 : pts
who ; 查看当前在线用户,使用哪个终端,登录时间,以及是远程登录(会记录IP)还是本地登录
w ; 相对 who 更详细. 系统运行时间 —— 在线用户数 —— 系统负载情况。下面每个用户行 WHAT 会显示用户在干什么,正在用什么命令等
用户名 —— TTY —— FROM —— 登录时间 —— 累计空闲时间 —— 累计占用CPU时间长(特别长可能不正常) —— 当前执行操作占用 CPU时间 —— 在执行什么命令
whoami ; 查看当前登陆用户
su - lmc 和 su lmc 区别 : 后者不会切换环境变量,比如由 root 切换到 lmc,用 pwd 命令会发现宿主目录亦然是 root,以及 echo $PATHS 会发现路径也亦然是管理员的搜索路径
批量增加用户 :
vi user.info 然后写入下内容 :
newuser01::1001:3::/home/newuser01:/bin/bash
newuser02::1002:3::/home/newuser02:/bin/bash
newuser03::1003:3::/home/newuser03:/bin/bash
newuser04::1004:3::/home/newuser04:/bin/bash
newuser05::1005:3::/home/newuser05:/bin/bash
执行 newusers < user.info
会自动创建宿主目录,并且宿主目录所有者是对应的,并在 /etc/passwd 里创建这些用户…
导入密码前取消 shadow 功能 : pwunconv
vi pass.info 写入下内容 :
newuser01:mypassword
newuser02:mypassword
newuser03:mypassword
newuser04:mypassword
newuser05:mypassword
执行 chpasswd < pass.info 会自动对密码 md5 存入 /etc/passwd,然后启用 shadow : pwconv
或者写批量脚本
上线时,除了指定用户组禁止其他人 su 切换到 root,可以对 su 这个命令文件操作 :
groupadd sugroup
chmod 4550 /bin/su ; su 本身就有权限位,默认权限是 4555,这里把其他人权限去掉
chgrp sugroup /bin/su
usermod -G sugroup newuser01
这时除了 root 和 sugroup 组下成员,别人都无法切换到 root 了
指派权限 sudo 命令,并非只能授权 root 命令,而是让普通用户以 root 身份执行命令 :
编辑命令 : visudo 添加格式 : 用户名/组名 主机地址(主机名也可以)=命令(绝对路径,多个用逗号分隔)
授权用户 : lmc helen=/usr/sbin/useradd,/usr/sbin/userdel
sudo /usr/sbin/useradd newuser ; 然后普通用户就可以这样使用 root 命令 useradd了,然后让你验证 lmc 密码,然后命令才会执行
授权组 : %testgroup helen=/usr/sbin/useradd,/usr/sbin/userdel
授权root : lmc helen=ALL ; 该用户可以执行所有 root 命令
: lmc helen=/sbin/shutdown -h now ; 用户使用此命令时,只能使用这个参数才能执行,其他参数都不行
sudo -l ; 用户可以用这个参数查看自己可以执行哪些 root 命令
示例(让普通用户可以管理 APACHE) :
1. apache 配置文件
(1). 把该文件所有者改为指定用户; (2). 把该文件所属组改为指定组,在组里添加该用户(多人管理情况) (3). visudo -> lmc helen=/bin/vi /etc/httpd/conf/httpd.conf
用 sudo 精细控制,该用户就可以这样修改 httpd 配置文件 : sudo /bin/vi /etc/httpd/conf/httpd.conf
注意 : 给普通用户授权 vi 一定要精细到参数,不然用户可以用 vi 编辑系统任何文件
2. 使用 Apache 启动脚本
visudo 然后加入 : lmc helen=/etc/rc.d/init.d/httpd start,/etc/rc.d/init.d/httpd reload,/etc/rc.d/init.d/httpd fullstatus,/etc/rc.d/init.d/ configtest
和1里的可以合并写,都是针对同一用户的. 上面将允许用户对 apache 服务进行启动、重载(使修改的配置文件生效)、查看服务状态、检测语法错误
3. 更新网页
让指定用户对 apache 指定的网站目录有写权限即可. 1. 改变那个目录所属者 2. 改变那个目录所属组,把该用户加入该组即可(多人管理情况)
Linux 进程管理 :
前台进程 : find / -name init 这个命令执行过程需要一段时间,shell 一直等待该命令执行完成退出,这叫做 shell 命令解释器异步运行,用户在一个命令执行完成前不能执行另一个命令,叫做前台进程. 前面的命令都是前台进程,命令的执行会对应一个进程,用另一个窗口使用进程查看命令可以查看.
后台进程 : 在命令的结尾添加一个 & ,他会在后台执行.
find / -name init > /test/init.find & shell 会创建一个子进程执行这个命令。这条命令是和 shell 同步运行的,shell 本身对应一个进程,而这个命令也对应一个进程,称为同步运行
需要是非交互式的命令,比如 ping 192.168.1.1 & 这没有意义,执行结果要交互显示在终端上的,所以不放在后台执行.
进程状态 :
1. 就绪 : 已经分配 CPU 资源,因其他进程占用 CPU 而暂时不能运行而等待分配 CPU; 分时,CPU 分为多个时间片来排队处理进程,因此有就绪状态
2. 等待 : 等待一个时间而不能运行的状态,把一个进程暂停,就处于等待状态
3. 运行 : 进程已经分到 CPU 时间,正在处理器上运行.
w 命令解释 : ; JCPU 以终端代号区分,用户通过终端登录 tty1 或 tty2,执行进程消耗的所有 CPU 时间都会显示在这里
; PCPU 指 CPU 在执行当前程序进程所消耗的 CPU 时间... 也就是 WHAT 下面的
; IDLE 用户多长时间没操作时间
; load average : 显示在过去 1/5/15 分钟内的平均负载程度. 0.8 以下说明负载较轻,高的话就是负载较重,几十系统可能接近崩溃了.
; FROM : 显示用户从哪登陆,tty 本地终端登录,pts/0 表示远程登陆 ":0" 表示用户从 X Window 打开文本模式窗口登陆的
ps(所有 unix 和 linux 都支持) :
-a : 显示所有用户的进程
-u : 显示用户名和启动时间
-x : 显示没有控制终端的进程
-e : 显示所有进程,包括没有控制终端的进程
-l : 长格式显示
-w : 宽行显示,可以使用多个 w 进行加宽显示 ??
; ps -l 或 ps -u 显示关于自己的详细进程信息
PID : 进程 id
PPID : 父进程 id
TTY : 该进程启动的终端. 可以判断它是本地登录还是远程登陆,占用的哪个终端号
STAT : 进程当前状态. S 休眠 D 不可中断的休眠状态 R 运行 Z 僵死状态 T 停止
NI : 进程优先级
TIME : 进程启动以来所占用的 CPU 时间
CMD : 进程名称
USER : 启动该进程的用户,为 0 就是 root 启动的
%CPU : 该进程占用的 CPU 时间和总的所有进程占用 CPU 时间百分比...
%MEM : 该进程占用的内存和系统内存总量的百分比
; ps -le or -aux : 查看所有用户执行的进程的详细信息,两者相差无几
; ps -aux --sort pid : 可按进程执行的时间、PID、UID 等对进程进行排序
; ps -le | grep httpd : 判断一个服务是否启动 / 查看指定进程信息
/etc/rc.d/init.d/httpd status : 判断一个服务是否启动
; ps -uU samlee : 查看指定用户启动的某个服务占用了大量资源,管理员可以使用 kill 关闭该服务
ps -aux | grep samlee : 同上,也可以这样查询指定用户的进程信息
; pstree : 查看所有进程树信息
kill 3575 : 关闭进程
/etc/rc.d/init.d/httpd stop or killall httpd : 关闭所有关于 httpd 进程,也可以用 kill 来关闭 httpd 的父进程,所有子进程会自动关闭.
kill -9 : 强行关闭
kill -1 或 /etc/rc.d/init.d/httpd restart : 重启进程
xkill : 图形界面下命令,点击窗口程序就会被关闭,点击桌面和菜单会认为你想退出 x-window
基于目录 ls -l /proc 应用(该目录是虚拟文件系统/伪文件系统,数据存储在内存镜像里,主要保存进程信息,会有很多以进程 pid 命名的目录名) :
其他的 : cat /proc/cpuinfo : 获取 cpu 基本信息
cat /proc/meminfo : 获取内存信息
cat /proc/partitions : 获取分区信息
基于上面目录的保存着所有进程信息,因此可以使用下面一些 p 开头的命令 :
pgrep httpd : 查询这个服务所有进程信息.. kill -1 `pgrep httpd` // pgrep 查询 httpd 所有进程,然后使用前面的 kill -1 重启,当然也可以去掉 -1 关闭所有进程
pkill httpd : 关闭关于该服务所有进程,和上面的 killall httpd 等方式的结果一样
nice --5 /etc/rc.d/init.d/httpd start : 启动时指定程序运行优先级为 -5,该命令选项有 -
renice -300 pid : 改变一个正在运行进程的优先级, 该命令选项无 -
; 优先级范围从 -20 - 19 ,超过 19 会默认回 19,低于 -20 会默认回 -20,负数比正数优先级高
让进程在用户退出时仍然继续执行 : nohup 命令将命令执行后的数据信息和错误信息默认存储到文件 nohup.out 中,格式是 nohup commend &
nohup find / -name init* > /root/find.init.20110106 & ; 它会在后台进程运行,并且退出后会自动继续执行,然后把结果保存在 /root/find.init.20110106 中,虽然 nohup 会默认一个保存文件,但推荐自己使用 > 来指定一个.
另一种用处 : 比如执行一个很大的数据备份,还急着下班,可以用此命令来完成.
挂起(中止,暂停)的执行 : ctrl+z 终止命令执行 : ctrl+c
前后台切换,两种情况进程会被放到后台执行,一种是后面加了 & 在后台执行,另一种就是被 ctrl+z 暂停的进程,可以用下面方式管理 :
jobs ; 查看被暂停或者后台执行的命令,Stopped 说明被暂停,Done 是执行完成,Running 正在运行
fg ; 后面跟上 jobs 查到的前面编号就能把该进程调到前台去执行,可以看到结果
bg ; 后面跟上 jobs 查到的前面编号就能把该进程调到后台
进程管理 : top
第一行显示 w 命令显示的信息; 第二行是进程统计,正在运行的,多少个休眠的,多少个暂停的,多少个僵死进程(Zombie)
第三行是 cpu 时间,都谁在用这些 cpu 时间; 第四行是内存使用情况; 第五行是 swap 虚拟内存使用情况
; 下面的进程信息就像 ps 命令一样,而且默认是 5 秒刷新一次.
1. 按 d or s 修改刷新时间; 2. 默认查看只显示进程操作的命令,想显示进程操作时详细信息,可以直接按 c;
3. 按 u 输入 uid 查看指定用户进程,按回车返回 4. 按 k 输入 pid 终止执行中的进程 5. 按 r 输入 pid,然后再输入优先级数值即可
6. 按 W 将当前设置写入 ~/.toprc 文件里(写入后应该是每次使用这个命令配置都会生效)
7. 按 ? 或者 h 获得选项的帮助. 8. 按 q 退出
一次性计划任务(在特定时间执行一次,比如节日提醒) :
at 09/08/2013 ; 回车会提示你输入要定时执行的命令
at -f at.script 09:30 2/2/11 or at < at.script 09:30 2/2/11 ; 命令太多,可放一个文件里,用 -f 导入,甚至可以是复杂的 shell 脚本
; 命令写绝对路径(用之前先 whereis),用回车写下一个命令,然后 ctrl+d 保存,会提示你执行过几个计划任务以及刚创建的任务什么时间会执行.
; 例子 : at now +5 minutes 然后输入 : /usr/bin/wall < /etc/motd ; 5分钟后把 /etc/motd 内容当广播发出去
; 手动检测计划任务是否正常 : ps -le | grep atd ; 如果有 atd 这个进程,就没问题,如果没有则手动启动 : /etc/rc.d/init.d/atd start
hh:mm [today]
hh:mm tomorrow
hh:mm 星期
hh:mm MM/DD/YY or MMDDYY or DD.MM.YY
now +1 minutes
now +1 hours
now +1 days
at 5:30pm at 17:30 at 17:30 today(today 可以省略) at now +3 hours at now +180 minutes at 17:30 1.11.11 at 17:30 11/1/11
查询队列中的任务 : at -l or atq ; 显示结果格式 : 序号 -- 时间 -- 状态 -- 哪个用户做的计划任务
删除任务 : at -d 4 or atrm 4 ; 4 是利用上面查询得到的序号
; at 计划任务存放在 /var/spool/at/ 相应生成的一个临时文件里,可以自己编辑
命令使用控制 : 系统每个用户都可以使用 at...管理员可以自己决定,取决于 /etc/at.allow 和 /etc/at.deny
如果前者存在,则只有列在该文件中的人才允许使用 at ; 如果前者文件不存在,会检查后者是否存在,存在则只有该文件列出的用户不能使用 at ;
如果两者都不存在,只有超级用户才能使用 at ; 如果两个文件都存在且都为空,则所有人都可以使用 at
; batch 和 at 命令一样,唯一区别是会检测系统负载值,负载较轻的情况下才会执行(平均负载 0.8以下),如果任务不是很重要可以选择这个
周期性计划任务(比如每周、每天备份) :
crontab -e 分钟 小时 天 月 星期 命令/脚本 ; 根据需求,把知道的/分析出的具体时间填上,不知道的都填上 *
; 所有计划任务都保存在 : ls /var/spool/cron,每个会员对应一个文件
查看 root 的计划任务 : cat /var/spool/cron/root 或者 crontab -l
crontab -u bin -l 查看指定用户的计划任务
修改 : crontab -e 或者直接编辑上面的文件
删除 : crontab -r 会删除所有,建议用 crontab -e 进入编辑模式,删除想删除的行即可.
; 手动检测计划任务是否正常 : ps -le | grep crond ; 如果有 crond 这个进程,就没问题,如果没有则手动启动 : /etc/rc.d/init.d/crond start
; vi /etc/crontab 配置文件 :
下面四行 : 每小时、每天、每星期、每个月执行的任务目录,默认这些定期执行的目录下是系统一些自己的计划任务 :
比如之前的 whatis,系统会自动定期更新该库 makewhatis,这个其实就放在 ls /etc/cron.weekly 目录下,其实如果有要定期执行的脚本可以扔到这些对应的目录下,就会自动执行了.
; 它也存在 /etc/cron.allow 和 /etc/cron.deny 两个文件,参照 at
* 0 代表周日
每天凌晨四点 : 0 4 * * *
每个周二、周五下午六点 : 0 18 * * 2,5
1-3月 每个周二、周五下午六点 : 0 18 * 1-3 2,5
例1 : 周一到周五每天下午 5:30 先发送一条广播通知 5:45 自动关机
30 17 * * 1-5 /usr/bin/wall < /etc/issue ; 先通知
45 17 * * 1-5 /sbin/shutdown -h now ; 再关机
例2 : 12-14 点隔两分钟就执行一个脚本,检测 apache 服务是否启动(1/2/7/8 月份不用,周末也不需要,因为学校放假或者考试,学生不会关心网站)
*/2 12-14 * 3-6,9-12 1-5
; 拿上面例子,将 /etc 备份 backup,出错信息写入 etc.bak.err,一些正确提示信息没必要看丢到 /dev/null(类似黑洞,不需要的扔进去就行)
*/2 12-14 * 3-6,9-12 1-5 /bin/cp -r /etc /backup/etc.20110111 2> /backup/etc.bak.err > /dev/null
例3 : 备份 /website 到 /backup,每周凌晨两点做完全备份,每周二周五凌晨两点做增量备份(cp、tar、scp)
0 2 * * 0 /bin/cp -Rp /website /backup/website_$(data +%Y%m%d) 2>> /backup/website.errolog.total
0 2 * * 2,5 /bin/cp -Rpu /website /backup/website 2>> /backup/website.errolog.add ; /bin/date >> /backup/website.errlog.add
at 和 crond 每隔一分钟从休眠中醒来一次,查看自己计划列表中是否有要执行的任务,有就执行,没有继续休眠.
进程处理方式(一般软件安装过程中,可以选择 server type 进程运行方式,选择哪个根据这个服务是不是有大量访问,需要快速应答) :
netstat -an | grep “LISTEN” | more
standalone : 独立运行,比如监听 80 端口的 webserver 进程,监听 22 端口的 ssh 进程… 就是这个服务启动后,它的进程会一直在系统中占用 CPU 内存资源等待监听客户端请求,一旦有请求马上给出应答. 这种进程特点是占用资源多,因为一直在监听,但一旦客户端有请求,响应速度很快.
比如 ftp server,只是管理员更新网页,每天访问不过2、3次,所有不用做成 standalone,它会一直检测占用资源,理论上 xinetd 托管就行了.
xinetd : 进程托管(互联网超级守护进程). 如果服务使用比较少,可以通过 xinetd 进程来托管. 有一个管理目录 ls /etc/xinetd.d,下面的所有服务都是由 xinetd 进程(ps -le | grep inetd)进行托管的,下面每个服务对应一个配置文件,比如 telnet,是个古老的远程登陆服务,传输过程密码是明文的,现在都用 ssh.. 一旦有客户向这个端口发送请求,xinetd 会检测到,启动 telnet 应对客户端请求,应答完后会自动终止这个进程,缺点是慢一点,因为有 xinetd 监听过程.
随便打开 ls /etc/xinetd.d 下的一个服务文件,他是有固定格式的 :
service telnet ; 指定服务名称
disable = yes or no ; 这个服务是否启用
server ; 当 inetd 检测到关于服务的客户端请求,通过该选项指定服务启动的命令绝对路径
user ; 哪个用户可以管理这个服务
wait 和 socket_type ; tcp 相关的设置
/usr/bin、/bin 所有用户可以执行的命令(新安装程序目录下的 bin 也是所有人都能执行)
/usr/sbin、/sbin 只有 root 可以执行的命令(新安装程序的目录下的 sbin 也是只有 root 才能执行)
/home 宿主目录
/proc 虚拟文件系统,存放在当前内存镜像
/dev 存放设备文件
/lib 系统程序运行所需的共享库/系统好多应用都调用同一段代码,可以拿出来独立一个库文件
/lost+found 存放系统出错的检查结果(系统正常运行时没有文件,系统出现问题解决过程可以看一下该目录内容)
/tmp 临时文件(有特殊权限粘着位)
/etc 系统、服务的配置文件(系统级备份首先备份该目录,一般也就几十M)
/var 经常发送变动的文件,邮件、日志、计划任务等(频繁写入)
/usr 存放所有命令、库、手册等(相当于 windows 的 c:\windows目录)
/mnt mount 缩写. 临时文件系统(光盘、软盘、网上挂载其他 Linux 服务器上的共享目录、U盘)挂载点.
/boot 系统启动信息,内核文件、自举程序文件、镜像文件、grub 配置文件(系统级备份首先备份的目录),如果做内核升级可以分得大一点,可以单独划一个分区,一般 128M 就足够了. 不单独划分放在根目录下就可以了.
/usr/local 习惯性的第三方软件安装目录
/home、/boot、放 apache 网页的目录(方便备份管理),这些都可以单独分区
查看分区情况 : df ; 以数据块来显示分区(包括挂载的 U盘/光盘/软盘 都能看),不直观
df -h ; 更直观的显示分区大小(比较常用) -m 以 M 大小为单位
看文件大小 : du -h /etc/services ; 类似 df,不加 -h 不直观,用 ls -l 不直观
看目录大小 : du -sh /etc ; 统计目录大小
检测修复文件系统 : fsck(unix/linux) 和 e2fsck(Linux),单用户模式执行(别在正常运行级别3、5下执行)… 类似 windows 断电后开机进入蓝屏修复
e2fsck -p 分区名 fsck -y 分区名
光盘、硬盘、USB移动硬盘都需要挂载 :
有两种设备 : 大面积读写设备,以数据块方式读取的设备叫做块设备(block device),光盘、硬盘都是块设备;
字符节设备,比如打印机,这种以字节方式来读写的设备.
查看设备类型(设备在 Linux 里也是文件) : ls -l /dev/sda1 ; 第一个字符为 b 说明是块设备
ls -l /dev/tty ; 第一个字符为 c 说明为字符设备,命令行终端在系统是一个虚拟的伪设备,是字符设备
光盘挂载 :
先在 /mnt 下面新建一个目录,比如 mkdir /mnt/cdrom,
mount /dev/cdrom /mnt/cdrom ; 使用需要先挂载
df -h ; 把 cd 挂在到系统后,用 df -h 就可以看到这个设备信息
光盘用的时候要挂载上,不用就要卸载掉,光盘卸载比较特殊 :
1. umount /mnt/cdrom ; 有的时候会提示忙… 是因为你的当前工作目录是在 /mnt/cdrom 里,先切换到其他目录,再卸载就行了
2. eject ; 在自动调用 umount 同时会弹出光驱(只是台式机一推就进去的那种,不包括笔记本)
然后就可以 : cd /mnt/cdrom 查看内容了
测试写入 ------------------------------------------------------------------------
1.测/目录所在磁盘的纯写速度 : time dd if=/dev/zero bs=1024 count=1000000 of=/1Gb.file
2.测/目录所在磁盘的纯读速度 : time dd if=/1Gb.file bs=64k |dd of=/dev/null
3.测读写速度 : time dd if=/1Gb.file of=/data0/2.Gb.file bs=64k
理论上复制量越大测试越准确
挂载新硬盘 :
添加硬盘步骤 : 关掉电脑,添加一个硬盘,可以是 IDE,不过服务器一般都是 SCSI硬盘,开机进入 BIOS,看启动项选择里能不能找到这块硬盘,或者进入系统以后用 dmesg 来看是否有关于这块硬盘的信息 : dmesg | grep sdb
fdisk /dev/sdb ; 后面硬盘名字,硬盘名字是根据硬盘插槽位置来定的,而不是根据检测的顺序
m : 查看帮助,英文比较简单,具体参数看这个帮助
p : 打印分区表,列出硬盘信息和分区表
n : 添加新的分区. 会提示用主分区还是扩展分区,输入 e(扩展) 或者 p(主分区),随便输入 1-4 分区号回车,会提示你硬盘的柱面,默认从 1 开始分区回车,然后分配大小,如果只分一个区,直接回车就行,或者 +10240M 或者 +1000000K 或者 +10000,后面是按G为单位分的. 最后再敲 p,就能看到新分区了
t : 按 t 改变分区的类型,然后输入要改变的分区(1-4),会提示输入代码,按 L 会显示 Linux 支持的所有文件系统类型,记住代码回头输入进去即可… 常用的是 82(Linux swap) 和 83(Linux)
d : 删除分区,然后输入要删除的分区就行
w : 保存退出
q : 不保存退出
创建文件系统,类似 windows 格式化,任何分区要存放数据必须有管理数据方式,叫文件系统,Windows 管理数据方式就是 NTFS,FAT32. 用 fdisk -l /dev/sdb 查看指定硬盘信息.
mkfs -t ext3 /dev/sdb1 (不常用了)
mkfs.ext3 /dev/sdb1 (现在常用)
-b : 指定数据块大小,可以是 1024/2048/4096,如果该分区装的文件比较大则选择后者,默认 1024,一般不用指定
挂载后才能使用,/dev/sdb1 /dev/sdb2 都是物理设备名,挂载点就是一个空目录,如果有东西会被冲掉.
mkdir /web
mount /dev/sdb1 /web
现在就可以使用了,在 /web 目录读写操作数据,就相当于在 /dev/sdb1 上操作,然后用 df -h 可以看到新挂载分区
分区配置文件 : /etc/fstab ; 每行对应一个分区设置
根分区,虚拟内存交换分区 swap,和自己设置的分区,及其他一些虚拟的分区 : proce(不是存放在硬盘,但他也对应一个分区)、pts(远程登陆终端,也对应一个分区),系统自动划分的.
格式 : 设备名 : LABEL=/(卷标) 也可以使用物理设备名 /dev/sda1
挂载点 : 一个空目录
文件系统 : 一般采用 ext3
缺省设置 : 挂载文件系统默认的设置选项,用缺省的 defaults 就可以
是否检测 : 系统引导时,如果是数据分区会自动检测,如果自动检测则为 1,那些虚拟分区和 swap 不用检测,因为它不存放数据,所以为0
检测顺序 : 0/1/2 三个值,0 表示不检测,上面的为 0,这个也为0.
1 表示优先检测(根分区优先检测),2 表示在根分区检测后检测
如果你不想每次系统登录手动挂载新添加的分区,可以编辑这个文件,在末尾复制一行.
/dev/sdb1 /web ext3 defaults 1 2
卷标(可不写) :
可以在格式化时指定,也可以在后期用 e2label /dev/sdb1 查看一个硬盘有没有卷标,如果返回空白没有,可以设置一个 :
e2label /dev/sdb1 apache ; 做 webserver 存储的,所以设为 apache,也可直接编辑 /etc/fstab 将硬盘物理名称改为 : LABEL=apache
没有新硬盘,空间还有,swap 分区不够了,可用 SWAPFILE 通过文件形式实现 swap 功能.
mkdir /var/swap
chmod 700 /var/swap
dd if=/dev/zero of=/var/swap/file.swp bs=1024 count=65536 ; 先用 if 导入 /dev/zero 伪设备,of(ouput file)往 /var/swap/file.swap 里不断写 0,bs(block size) 是指定 dd 输出的数据块大小,linux 支持 k为单位,1024k 就是 M,但 unix 只支持字节; count 是指定文件多大,根据 bs 来设定.
如果 bs=1024k(就是1M),那么 count=64 即可… 相当于 bs=1024(1k) count=65536,unix 不支持前者
mkswap /var/swap/file.swp ; 此时 file.swp 这个文件才能作为 swap 空间来用
swapon /var/swap/file.swp ; 启用 SWAPFILE 功能,也可以用 swapoff /var/swap/file.swp 关闭它.
free -m ; 以 M 为单位查看内存信息,可以看到 swap 的大小变化
要想永久生效,要写入 /etc/fstab 配置文件,这样在系统启动时就会自动加载这个 swap 分区空间 :
/var/swap/file.swp swap swap defaults 0 0
; 伪设备 : /dev/zero ; 不断往输出里写零,写到指定大小
/dev/null ; 黑洞,find / -name abc > abc.find 2> /dev/null ; 任何后台执行的任务不想看的信息都可以把他指定到 /dev/null,当然也可以重定向到文件保存起来以后查看,比如命令执行过程中的一些错误
磁盘配额 :
dd 有个问题,任意普通用户都可以用 dd if=/dev/zero of=testfile bs=1024k count=1024 在宿主目录创建一个无限大的文件以至于占满当前分区,如果用户宿主目录没有单独划分分区… 根目录就会被占满,任何数据读写都不能操作,重启系统无法引导,因为临时文件无法创建… 虽然可以进入单用户模式和光盘修复模式找到大于 500M 的文件删掉就行,但也要防止这种事发生.
但用这条命令可以测试硬盘读写速度和磁盘爆满实验,在命令执行结果中会显示.
无法限制一个用户在整个硬盘分区的空间使用大小,只能规定一个用户在一个或每个分区使用多少空间,所有操作系统如此.
1. 开启分区配额功能,在挂载这个分区时要加一个设置选项 :
usrquota ; 用户配额 grpquota ; 用户组配额
临时开启 : mount -o remount,usrquota /test
永久开启 : 编辑 /etc/fstab 在要开启的那个分区 defaults 后面加上 usrquota :
LABEL=/test /test ext3 defauLts,usrquota 1 2
2. 创建配额数据库(保存每个用户用了多少空间) :
quotacheck -cvuga
-c ; 创建用户配额数据库文件
-v ; 创建时显示详细信息,可以不加
-u ; 建立用户配额
-g ; 建立组配额,可以不加
-a ; 检测所有分区,如果不检测所有分区,可以直接写上分区名(并且没加 -g 不创建组配额) : quotacheck -cvu /test
quotacheck -cvug /dev/sda1 ; 去掉 -a 只检测指定分区
执行命令后,会在此分区下创建 aquota.user、aquota.group 两个文件.
3. 启动配额功能 : quotaon /test 开启分区配额功能 quotaoff /test 关闭分区配额功能
4. 编辑用户配额 : edquota lmc or edquota -g adm 会进入 vi 编辑模式,针对这个用户进行配置. 这个用户可以在每一个分区都建立一个配额信息,每行对应一个分区配置.
blocks soft hard inodes soft hard
blocks 限制该用户在该分区的空间大小,inodes 是限制该用户在该分区的文件数量,每个后面的 soft 软限制是用户达到这个以后会给个警告,但还可以继续创建生成文件,但到达 hard 硬限制就彻底用不了了. 软限制对应有个宽限期参数,比如 7 天,用户超过了5M,7天过后超出的数据会被干掉. 一般直接做硬限制就行了. 如果是限制的大小,可以用上面的 dd 来创建一个固定大小文件测试一下限制是否生效. 编辑宽限期 : edquota -t
多个用户一起分配(复制用户配额) : edquota -p helen samlee lmc… 此时 samlee、lmc 都和 helen 的限制一样.
当前用户查看自己的配额信息 : quota
查看指定用户配额信息 : quota helen
查看所有分区的磁盘配额信息 : requota -a (仅管理员能操作,查看指定分区信息 : requota /test)
dd if=/dev/sda of=/dev/sdb ; 把 sda 硬盘所有数据克隆到 sdb,前提 sdb 空间大于等于 sda,copy 做不到这点,因为它拷不了 MBR,可以用 dd
如果数据重要,可以考虑异地存储甚至异地实时同步存储.
服务器硬盘和PC不一样,需要经常进行读写,好硬盘质量最多也就10-20年
备份可以选择不同的存储介质,硬盘(插入硬盘用上面 dd 命令实现对拷,效率比较低. 存储服务器建议使用 Linux,抗病毒能力强,而且不用考虑装杀毒软件,所以往往用 Linux 作为文件服务器来集中存储管理,正常都使用一个文件存储服务器,通过网络进行存储,按项目开发小组备份,或按照部门备份,把数据分成不同用户,通过 samba 分布客户端备份到本机,然后它就可以像本机操作一样实现远程备份,维护人员定期把大家统一备份的分区对应的目录再备份就行了)、光盘(不适合大数据量)、磁带机(大公司,适合海量存储,经济实惠的)、可移动存储设备,一般硬盘和磁带机备份比较多.
完全备份 : 一段时间对系统进行完全备份
增量备份 : 先一次完全备份,然后每一段时间备份更改的内容
系统备份 : 保证操作系统出现问题可以恢复. 主要 /etc /boot /var/log /usr/local 目录. 还有应用程序的备份,比如 apache 配置文件备份,不然丢失还要重配,像 samba/ftp 等等,不能每次装软件配置文件都要重写一遍,没有编译的源代码包一般保存在 /usr/local 里面,那么在 /usr/local 很深的目录里面肯能有一些配置文件和日志文件应该单独拿出来备份,尤其作为 webserver 甚至应该把 apache 相关所有文件统一备份到一个目录里
用户备份 : 用户数据备份,/home 或者网站数据目录,或者公司自带服务器数据,比如建立了一个 /public,通过 FTP 共享公司文档,可能也需要备份.
建立日志备份 : 公司有很多服务器,备份策略很复杂的时候,这个事就会很重要. 如果只有一台服务器就没所谓了. 在多服务器而且备份介质较多情况下,要有个备份记录,记录哪些修改,备份资料放在那里… 建立一个表格(半页 A4纸) :
; 主机名称(一般服务器会有编号的)、IP地址、机器存放位置
; 什么时间做的备份
; 使用的什么备份介质,有的时候是网络备份,集中备份到备份服务器上,有的可能直接拿磁带机备份的,这时候要写上备份介质. 还有编号,有时候介质有多个,比如公司有五个磁盘机,都是一个牌子一个型号的,备份总要贴个编号.
; 备份文件系统格式
; 备份的哪个目录,文件
; 用的什么备份命令(tar 还是 copy)和工具… 比如公司买的备份工具,可能有一些特殊的后缀名,也要标注一下,否则别人不知道怎么恢复.
; 是谁备份的,后面出了问题也知道谁的责任
备份最好独立划分一个分区,在不使用备份时将这个分区设为只读.
df -h ; 查找到备份分区
unmout /backup ; 不挂载提高安全性
mount -o remount.ro /backup ; 或只读挂载提高安全性
备份的时候再挂载上或去掉只读挂载 :
mount /dev/sdb1 /backup ; 备份时先挂载上,备完再卸载
mount -o remount.rw /backup ; 备份时设为读写 rw,备完再改成 ro 只读
压缩 : 对备份压缩可以减少空间,压缩文件也不容易被病毒感染.
校验 : 对备份文件或备份压缩文件生成 md5 校验值,定期查看这个值是否变了,变了可能是自己做了修改或者被人做了修改
加密 : GnuPG 用 rpm -qa | grep gnu 查看是否支持. 非对称密钥加密… 对称密钥加密就是一个普通文件加了密,必须知道设置的密码才能打开; 非对称秘钥加密解密不是同一个秘钥,它会生成一对秘钥,一个是公钥(public key)和私钥(private key),比如你想给我传一个文件,用我的公钥加密,加了密你自己都看不了,只有我的密钥才能打开,就算被人截获了不知道我的密钥也解不开,这样密钥就不需要传递。不然平时给别人传文件还必须把密码明文传递过去
备份 : cp -Rpu
-p : 复制的文件保留源文件的属性,时间等,有些拷贝甚至所有者和权限也会变,保留原值方便比对,而且可以将文件直接恢复到之前一样属性的状态
-u : 增量备份,只会在源文件的修改时间较目的文件更新时,或是名称对应的目的文件并不存在,才复制文件
cp -Rpu /etc/inittab /backup/inittab_2011032501.bak ; 文件名是备份的文件说明+时间+当天修改的次数,避免改到最后不知道哪个最终版本
远程备份 : scp 把一台服务器的数据备份到另外一台甚至外地的服务器上,异地存储,讲网络时会讲.
备份 : tar -zcf /backup/sys_20110303.tar.gz /etc /boot ; 可以同时打包多个目录,而且目录和文件可以一起打包
tar -zcf backup_user_20110303.tar.gz /etc/passwd /etc/shadow /etc/group /etc/gshadow ; 可以一次性把所有用户配置文件打成一个包
不解压查看软件包有哪些文件 : tar -ztf user.tar.gz | grep passwd ; 查看是否打包了 passwd 文件
恢复、解压 : 自己生成的包,解压时默认会解压到压缩时的原始那个目录,从网上下载的 tar 包会解压到当前操作目录下,如果想指定解压目录用 -C 然后指定要解压的目录即可. 一般要有个统一存放网上下载的软件包目录
恢复指定文件 : tar -zxf user.tar.gz etc/passwd ; 恢复之前要用 tar -ztf user.tar.gz 查看这个文件的路径,如果最前面没有 / 在恢复指定文件最前面也不能有 /,但这样就会把文件解压在当前目录里,解决办法是在执行解压之前,先切换到根目录,这样 etc/passwd 就可以直接恢复到根目录相对目录里了
tar -zxf /root/user.tar.gz etc/passwd ; 因为 user.tar.gz 不是保存在当前根目录里的,所以恢复的时候一定要写绝对路径
对 tar 包追加文件 : tar -rf backup_user_20110303.tar /etc/default/useradd /etc/login.defs ; 把后两个文件追加到前面的 tar 包中. r = replace
更新 tar 包文件 : tar -uf backup_user_20110303.tar /etc/passwd ; 替换压缩包里 passwd 文件,也可以更新一个目录,相当增量备份. u = update
tar 打包比 cp 备份的好处 : 默认打包的文件就会保存原文件属性,而且可以进行压缩,减少磁盘占用空间,抗病毒能力好,相对 cp 用的比较多.
用命令提取系统时间作为打包名字 : tar -zcf /backup/etc_KaTeX parse error: Expected group after '_' at position 129: …zcf /backup/etc_̲(date +%Y.%m.%d-$H%M).tar.gz /etc ; 格式类似 : /backup/etc_2013.09.31-1014.tar.gz
LAMP 编译 :
1. 用 yum 安装 gcc C语言编译器
2. 用 yum 安装 gcc-c++
3. 用 yum 安装 make
如果之前用二进制文件安装过 mysql/apache 等软件,卸载或停用,用 service httpd status 来查看服务的状态
关闭 SELinux : vi /etc/sysconfig/selinux :
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
然后重启.
设置默认防火墙(放在 22 端口下面) :
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
把所有要安装的源代码包解压,写个 shell 脚本来批量解压.
#!/bin/sh
cd /lamp
ls *.tar.gz > list.txt
for fileName in `cat list.txt`
do
tar -zxf $fileName
done
源代码安装后,可以到安装目录里看有没有文件,或者有可执行文件就执行一下,判断是否安装成功
参数设置错等原因要重新编译 : 先删除安装目录,然后删除解压目录(普通库文件,比如 PHP 一些库文件),如果是 apache/mysql 一些服务启动软件,卸载前需要把 apache/mysql 服务进程停掉,然后把安装目录和源代码包删除掉就行了,然后重新解压,编译.
如果编译安装时不指定安装目录,就要把安装信息生成到一个文件里,方便删除时查找文件都安装在哪些地方
##############################################################################
配置网卡 :
vi /etc/sysconfig/network-scripts/ifcfg-eth0 :
DEVICE=eth0 #指出设备名称
ONBOOT=yes #设置为yes,开机自动启用网络连接
BOOTPROTO=none #设置为none禁止DHCP,设置为static启用静态IP地址,设置为dhcp开启DHCP服务
HWADDR=00:50:56:be:b5:4a
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.1.1 #设置网关
IPADDR=192.168.1.8 #IP地址
TYPE=Ethernet #网络类型为:Ethernet
DNS1=8.8.8.8 #第一个dns服务器
DNS2=8.8.4.4 #第二个dns服务器
下面可选 :
NM_CONTROLLED=yes #network mamager的参数,实时生效,不需要重启
IPV6INIT=no #禁止IPV6
USERCTL=no #是否允许非root用户控制该设备,设置为no,只能用root用户更改
配置DNS服务
vi /etc/resolv.conf :
nameserver 8.8.8.8
重启 : etc/rc.d/init.d/network restart service network restart
其他 : ifconfig eth0 up 启用第一块网卡
ifconfig eth0 10.1.1.1 netmask 255.0.0.0 用命令的方式配置接口卡的地址。
ifconfig 查看接口卡的属性,后可根具体的接口卡。
ifconfig eth0 down 禁用第一块网卡。
#########################################################################