Linux基础及使用

下达指令

command [-options] parameter1 parameter2 ...

command:命令或者可执行文件

options:选项

parameter1.2…:参数

如:

ls -l ~

列出当前用户目录下的文件列表

 

指令太长用\反斜杠换行

如:

其中a选项表示列出隐藏文件,默认不列出隐藏文件。

以"."开头的都是隐藏文件

 

 

date显示日期时间(格式化)

格式化

date +%Y%m%d%H%M%S

语言

显示当前语言 echo $LANG

设置语言

LANG=en_US

设置成了英文,如果设置成无效的语言,则使用默认的英文en_US,也就是先读取环境变量$LANG,如果合法,就使用,如果不合法就使用英文en_US。

设置语言只对此次登录有效,下次再登录又会还原回去。

cal显示日历

格式:

cal [month] [year]

如:

显示1个月

默认是当前年月:

显示1年

bc计算器

输入bc即可进入计算器,其实是打开了bc这个软件,类似vi。

bc中输入需要计算的算式,回车即出结果。

 

其中scale=3设置小数位数为3,默认是0

quit退出

 

常用热键

TAB:自动补全,自动查询剩余命令,如果多个会列出来

CTRL+C:终端目前程序,如日志跑个不停的时候按。

CTRL+D:键盘输入结束,相当于exit

 

查询帮助

man 查询帮助

如:man date

man一个命令之后会进入一个单独的帮助页面,成为man page,按q即可退出。

说明列表

如下:

数字含义列表

其中DATE(1)后面的1有特殊含义,含义列表如下:

如:man null会出现NULL(4),说明null是装置档案

查询命令的数字 man –f date

如果一个命令有多个数字,默认显示第一个,可以用man –f 查看有几个,如:

有(1)和一个(1p)两个命令,而man date默认是显示第1个。所以man 1 date根man date相同

whatis是man –f的简写,如:

查看指定数字命令man 1p man

查看指定数字的命令,在man后面跟命令数字即可,如:

显示:

 

模糊搜索命令 man –k date

如:

不管是左边命令还是右边说明,只要有此关键字就会列出来

apropos是man –k的缩写

 

基本操作

info 查询帮助

info跟man类似,只不过用类似网页的形式展示,打开后按N、P、U等操作下一页、上一页、上一层等。

 

nano文本编辑器

与vi类似的编辑器,如:

nano test.txt

如果文件不存在,则自动新建,存在则编辑,离开编辑器按ctrl+X

关机相关

查看在线客户端 who

如:

表示有两个客户端用户root在线,1个客户端kkk在线。

查看网络连接状态 netstat -a

查看后台进程ps –aux

同步内存缓存到硬盘 sync

linux默认会将硬盘的部分数据放到缓存提高速度,如果这些数据有更新不会立刻同步到硬盘,使用sync同步即可。

root账号同步所有的资料,非root账号只同步自己的资料。

shutdown

shutdown –h now

立即关机

 

shutdown –r now

立即重启

 

shutdown –h 20:25

系统在今天的 20:25 分会关机,若在21:25才下达此指令,则隔天才关机

 

shutdown -h 1 "kkk"

系统一分钟以后关机,并发送通知内容kkk

 

此时如果按ctrl+C,则会取消关机

 

shutdown -k now 'This system will reboot'

只是通知关机,并不会真正关机

 

shutdown –c

取消关机,此命令在另一个客户端运行才有意义,因为同一个客户端如果要执行它,必定先按Ctrl+C,而此时已经取消了关机

halt、poweroff、reboot

halt、poweroff都是立即关机

reboot重启

 

init切换执行等级

init 0 关机

init 3 纯文字

init 5 图形界面

init 6 重启

权限

用户、组

一个用户可以属于多个组,一个组可以有多个用户,是多对多关系。

而文件或目录又直接属于用户和组(文件属于某个用户,并不代表该文件也属于该用户所在的组,文件和组是直接关联的),并且细分了对当前档案所有者用户、组、其他用户不同的读、写、执行权限,因此可以满足一切权限管理需求。

/etc/passwd 记录用户账号信息

里面有root和kkk用户的账号

/etc/shadow记录用户密码

里面有root和kkk用户的密码

/etc/group记录组信息

 

里面有root组

ls列表各列含义

ls –l列出的列表各列含义:

ls -l --full-time可显示完整时间

如:

权限10个字符含义

如:

drwxr-xr-x

第1个字符代表类型,-是文件,d是目录,l是链接,c是字符设备、b是块设备

接下来的9个字符3个一组,分别代表拥有者、组、其他用户的读写执行权限,

r可读,w可写,x可执行,-没有权限。

档案种类

-:普通文件,分为纯文本(ascII)、二进制、数据文件(某些程序才能读取)。

d:目录

l:链接

设备分为:

c:字符设备,鼠标、键盘等,只读,一次性读取,不能截断读。

b:块设备,如磁盘,可读写,如:

s:socket接口,很多都在/var/run下,如:

p:资料输送文件,用于解决文件共享冲突使用。

文件扩展名、长度

linux的扩展名跟文件类型没有直接关系,只是为了便于区分,进行的约定,如:

*.sh,shell脚本

*Z, *.tar, *.tar.gz, *.zip, *.tgz,压缩文件

文件名长度限制255,全路径限制4096

修改档案所属组 chgrp

如:

如果组不存在,则会提示无效的组,/etc/group中记录了已存在的组。

 

修改档案所属用户 chown

如:

chown也可以修改所属组:如

chown bin:users install.log

或者

chown bin.users install.log

修改所属用户为bin,修改组为users

冒号或者一个点都可以,不过因为文件名可能有一个点,因此推荐冒号。

也可以单独修改组,如:

chown .users install.log

 

修改用户和组可用在赋值文件给别人的时候。

改变权限chmod

数字方式

每个权限对应一个数字,r=4,w=2,x=1

如:7=r+w+x,6=r+w,3=w+x

 

chmod 777 .bashrc

表示将.bashrc的3种权限都设置为可读、可写、可执行。

符号方式

u代表档案拥有者,g代表组,o代表其他用户,a代表所有3个。

如:

chmod u=rwx,g=rw,o=r .bashrc

设置后的权限是

-rwxrw-r—

 

+表示增加,如:

chmod a+w .bashrc

表示将3种权限都加上可写。通常用于想授权,却又不知道以前的权限的情况。

权限对于文件和目录的意义

文件权限的意义

rwx对于文件而言是读写执行文件内容的权限,不具有删除、重命名该文件的权限

目录权限的意义

目录的r权限表示可以读取目录名等信息(不包含目录内档案名等的信息)

目录的w权限表示可以新建、删除、重命名档案

目录的x权限表示可以执行,读取目录里的文件名,可以cd到该目录里面。

 

FHS目录标准

fhs是linux的目录标准约定,一般linux发行版都遵循此标准。

FHS规定了3层目录:

/、/usr、/var

 

/根目录的FHS定义

/根目录与开机系统有关

/bin:放置常用指令,如:cat, chmod, chown, date, mv, mkdir, cp, bash等。存放了很多系统启动需要的命令以及单人维护模式也可使用的命令。

/boot:放置开机会用到的文件。

/dev:放置设备文件,如:/dev/null, /dev/zero等。

/etc:放置系统配置,只有root有权限修改,其他用户只读。如/etc/init.d/放置预设启动。

/home:用户目录的根目录,如/home/kkk

/lib:函数库

/media:软盘,光盘等的挂在目录,如: :/media/floppy, /media/cdrom

/mnt:临时挂在目录。

/opt:软件安装目录

/root:root用户的目录

/sbin:放置开机、修复、还原系统所需要的命令,通常是系统管理员才会用到的命令,如fdisk, fsck, ifconfig, init, mkfs等。

/srv:作为服务器时放置的文件,如:/srv/www/里面放置网页文件等。

/tmp:放置临时文件。

/lost+found:放置系统发生错误时的dump文件。

/proc:虚拟文件系统,里面的文件都放在内存中,所以本身不占用硬盘空间

/sys:类似/proc,也是虚拟文件系统,记录核心资料。

/selinux:类似/proc,也是虚拟文件系统,存放程序存取权限。

不可与根目录分开的目录:

  • /etc:设定档
  • /bin:重要执行档
  • /dev:所需要的装置档案
  • /lib:执行档所需的函式库与核心所需的模组
  • /sbin:重要的系统执行档

 

/usr目录的FHS定义

/usr与软件安装、执行有关,usr不是user的缩写,而是Unix Software Resource的缩写,unix软件资源。

/usr/bin:放置常用指令,通常是软件提供的指令,与系统启动无关

/usr/include:放置C、C++的头文件。

/usr/lib、/usr/lib64:放置函数库

/usr/local:放置系统管理员自行安装的软件,在不想删除系统自带的软件,又希望安装新软件时,就安装到这里。

/usr/sbin:系统管理员所用指令,但不是系统正常运行必须的,例如作为服务器时的指令。

/usr/share:放置共享文档,如:

  • /usr/share/man:线上说明文件
  • /usr/share/doc:软体杂项的文件说明
  • /usr/share/zoneinfo:与时区有关的时区档案

/usr/src:放置源码

/var目录的FHS定义

/var与系统运行有关。

/var/cache:程序运行缓存

/var/lib:程序所需的函数库,如: /var/lib/mysql、/var/lib/rpm

/var/lock:上锁的文件或目录,如刻录光碟写时不能读取。

/var/log:登录日志,如/var/log/messages、/var/log/wtmp

/var/mail:邮件,通常跟/var/spool/mail是链接

/var/run:放置已启动服务的PID

/var/spool:放置排队资料,通常使用以后就会被删除

查看linux版本

uname –r和lsb_release -a

文件(目录)及操作

相对路径和绝对路径

以/开头的是绝对路径,否则是相对路径。相对路径用于软件安装、路径过长切换的时候,

绝对路径一般用于shell脚本。

特殊目录

.

当前目录

 

..

上一层目录

/的.和..都是当前目录,ls –a加了-a才会显示.和..目录

 

~

当前用户的主目录,如 cd ~

 

~kkk

kkk这个用户的主目录,如cd ~kkk

 

-

前一个目录,如 cd -

常用目录操作命令

cd 切换目录

pwd 显示当前所在目录

如:

加-P可以把显示链接目录变显示真实目录。

mkdir 创建目录

mkdir test

创建test目录

 

mkdir -p test1/test2/test3/test4

-p自动创建层级目录

 

mkdir –m 711 test2

-m指定权限,而不使用默认权限

rmdir 删除空目录

rmdir只能删除空的目录,否则会报错

如:rmdir test1

-p连续删除多层空目录,如:

rmdir test1/test2/test3/test4

如果其中某任何一层有其他目录或文件,则表示非空,会报错。

ls 查看

格式:

ls 目录名称

如果没有目录名称默认当前目录

ls /root

ls

-a :列出所有文档,包括隐藏的和.和..

-A :列出除.和..外的所有文档

-d :显示目录本身,而不是目录下面的文档

-l :列出详细信息。

-h :文件大小以直观的M、G等直观方式显示。

--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)

而非内容变更时间 (modification time)

档案有3个时间,改变权限的时间(ctime)、改变内容的时间(mtime)、上次访问时间(atime),默认显示mtime

 

ls –l 的别名是ll

cp 复制文档

如:cp .bashrc /tmp/bashrc

 

-p:连同档案的属性一起复制过去,而非使用预设属性(备份常用),预设属性的目标文件通常拥有者是操作人。

-d:若源文件为链接,则复制链接而不是实际的文件;

-r:递归持续复制,复制目录都需要加这个参数,否则无法复制目录

-a:相当于-pdr

-s:建立软链接(快捷方式);

-l:建立硬链接(硬链接表示复制一份文件,但两个文件会修改同步,但删除其中一个另一个不会跟着删除)

-u:源文件比目标文件新才复制。(通常用于备份)

 

若源是文件,目标是存在的目录,则复制到该目录里面去,若目录不存在,则复制成目标文件名。

也可以把多个文件或目录复制到一个目录中,此时最后一个参数必须是存在的目录

mv 移动(重命名)

如:mv b1 b2

-f :force 强制,不询问是否覆盖;

-i :询问是否覆盖!

-u :较新才覆盖

若源是文件,目标是存在的目录,则移动到该目录里面去,若目录不存在,则重命名成目标文件名。

若源是目录,目标是存在的目录,则移动到该目录里面去,若目录不存在,则重命名成目标目录。

mv b1 b2 b3

也可以把多个文件或目录移动到一个目录中,此时最后一个参数必须是存在的目录

rm 删除文档

-f :就是 force 的意思,忽略不存在的档案,不会出现警告讯息;

-i :互动模式,在删除前会询问使用者是否动作

-r :递归删除子目录。

ps:文件名尽量不要用特殊字符开头,如文件名是-aaa-,删除时,如果是

rm -aaa-就会提示找不到aaa选项,只能加路径名删:

rm ./-aaa-

 

获取文件名和目录名 basename dirname

如:

常用在shell里

常用查看(创建)文件命令

cat 一次性查看

cat 文件会一次性把文件内容全部显示出来,不分页,用于小文件查看

-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;

-b :显示行号(不含空白行)

-E :换行符显示为$

-n :显示行号(含空白行)

-T : [tab] 按键显示为 ^I

-v :列出一些看不出来的特殊字符

tac 与cat相反

tac倒序显示文件、

nl 花式输出行号

nl主要用于各种样式显示行号

-b :是否显示空行行号:

-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);

-b t :空行不显示行号(默认)

-n :行号显示样式:

-n ln :行号在荧幕的最左方显示;

-n rn :行号在自己栏位的最右方显示,且不加 0 ;

-n rz :行号在自己栏位的最右方显示,且加 0 ;

-w :行号栏位的占用的位数。

如:

-b a显示了空行行号,默认不显示空行行号

 

行号在左方和右方显示的情况:

 

右方显示,加0补齐的情况

 

右方显示,指定宽度的情况

more less 翻页查看文件

如:

more /tmp/kkk.txt

 

more和less可以翻页查看文件,一次只显示一页,按N翻页,less还可以往回翻页。

进入后的快捷键:

  • 空白键 (space):下一页;
  • Enter         :下一行
  • /字符串         :向下搜寻字符串
  • :f            :立刻显示出档名以及目前显示的行数;
  • q             :退出查看
  • b 或 [ctrl]-b :代表往回翻页,不过这动作只对档案有用,对管线无用。

man底层也是调用less来查看的,所以man跟less的操作快捷键很类似。

 

head tail 查看文件前面或后面指定行数

如:

head –n 10 /tmp/kkk.txt

查看kkk.txt的前10行

tail –n 10 /tmp/kkk.txt

查看kkk.txt的后10行

tail- f /tmp/kkk.txt

实时查看文件,有改变时立即更新,常用于查看日志

od 二进制方式查看文件

如od -t c /etc/passwd

参数:

touch 创建文件,修改文件时间

如touch kkk.txt

文件不存在则创建文件,文件存在,则会把ctime、atime、mtime都修改为当前时间。

如:

复制文件时,新文件atime、mtime会是当前时间,但ctime还是原来的时间。

环境变量

查看环境变量,echo $PATH

如:

环境变量以:分隔

执行的命令会到环境变量中依次去找,最先找的的就行了,如ls命令就放在/bin/ls

如果把它移走,就会找不到,如:

ps:执行命令也可以用路径+文件的方式,因此执行命令要么在环境变量的目录中有,要么采用路径+文件的方式,如./start.sh,不会默认到当前目录找,除非把.这个当前目录加入了环境变量,不过不建议把当前目录加入环境变量,因为当前目录经常在变,使命令变得不再固定。

设置环境变量

PATH="$PATH":/root:/root1

在原有的基础上增加了/root和root1

 

 

umask

文件或目录在新建时是有默认权限的,这个由umask决定,不过umask表示最大权限需要减去的权限(类似于补码)。

 

查看umask

0022只看后3位022(第1位是特殊权限,暂时不管),4表示r,2表示w,1表示x,对应u、g、o需要减去的权限值。

umask –S显示了减去之后的权限。

文件的最大权限是:

-rw-rw-rw-

目录的最大权限是:

drwxrwxrwx

目录比文件多了一个x权限,因为有x才能进入目录。

新建文件或目录时,用最大权限减去umask就是最后的权限。

 

比如新建的文件kkk.txt和k2目录,权限如下:

其中:

  • 建立目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
  • 建立文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r—

设定umask

1、umask 002

此时新建文件(目录)权限为:

文件: (-rw-rw-rw-) - (--------w-) = -rw-rw-r--
目录: (drwxrwxrwx) - (--------w-) = drwxrwxr-x

 

2、umask 003

此时新建文件(目录)权限为:

文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--

文件(目录)的隐藏属性

文件(目录)都有隐藏属性,有很多,主要使用的有:

不允许删除该文件(目录),用i表示

只能追加文件内容,用a表示

设定隐藏属性chattr

chattr +i aaa.txt

+i表示增加不允许删除的属性,同理-i表示去掉这个属性,如:chattr -i aaa.txt

 

a表示只能追加内容,不能删除内容,常用于日志记录。

如:

chattr +a 123.log

 

a和i的属性都只有root能设定。

查看隐藏属性lsattr

-a :将隐藏档的属性也秀出来;

-d :如果接的是目录,仅列出目录本身的属性而非目录内的档名;

-R :连同子目录的资料也一并列出来!

 

类似于ls,只不过显示的是隐藏属性,如:

lsattr aaa.txt

里面的i表示aaa.txt有i隐藏属性

SUID、SGID、SBIT权限

SUID

suid只有二进制的执行文件才可能具有,表示为拥有者的x变为s,如:

某个文件具有suid权限,表示在执行它的时候,执行者会自动拥有这个文件的拥有者身份。

如:passwd这个文件的拥有者是root,执行passwd时,执行者也会拥有root身份。

而/etc/shadow只有root才能修改,所以其他用户就可以通过执行passwd来修改/etc/shadow的内容了。

SGID

SGID与SUID类似,只是表示的是拥有被执行文件的群组,s替换了群组执行权限中的x

如:

普通用户无法读取mlocate.db,不过执行locate时,会拥有slocate群组,通过群组就可以读取mlocate.db了。

ps:SGID可以用于目录(表示可以cd到该目录),SUID只能用于二级制文件。

SBIT

SBIT表示为用t替换others的x权限,并且只能用于目录,含义是:

  • 当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;
  • 当使用者在该目录下建立档案或目录时,仅有自己与 root 才有权力删除该档案

如/tmp目录

/tmp,各用户创建的文件或目录只有自己和root能删除。

 

注意:s和t也可能大写成S和T,此时表示不具有x权限。

 

SUID、SGID、SBIT的设定

在普通权限设定CHMOD是前面加一个数字即可,

SUID:4

SGID:2

SBIT:1

如:

设定了SUID

 

设定了SUID和SGID

 

设定了SUID、SGID、SBIT。

这里因为g和o都不具有x权限所以,g的S是大写,o的T是大写。

 

也可用符号法,如:

设定了SUID

 

设定了SUID、SGID、SBIT。

查看文件类型 file

如:

执行文件显示的信息会多一些。

 

搜索命令 which

which搜索命令所在的位置和别名。

如:

找到了2个:

第1个是别名,ls相当于ls –color=auto

第2个是ls所在位置/bin/ls(path中搜索,找出第一个找到的)

 

-a选项表示path中所有搜索到的都列出来,而不只是第一个

 

找不到cd命令,因为cd是bash的内建指令,不在path路径中。

 

基于索引搜索whereis和 locate

whereis和locate是基于索引搜索,速度很快,linux默认每天更新索引,手动更新用updatedb,如:

updatedb会根据/etc/updatedb.conf的设定,读取硬盘数据更新索引。

精确搜索文件 whereis

如:

where is passwd

-b :只找二进制文件

-m :只找在说明档 manual 路径下的档案

-s :只找 source 来源档案

-u :搜寻不在上述三个项目当中的其他特殊档案

 

whereis是找所有的,跟path路径无关,因此which没找到的可能是path没设定,可以用whereis再找找。

模糊搜索文件 locate

与where类似,不过locate是模糊搜索,只要文件名中包含关键字,就列出来,如:

选项:

-i :忽略大小写;

-r :后面可接正则表达式

 

/var/lib/mlocate记录了locate的索引资料,updatedb更新时也是更新它

基于磁盘搜索find

find直接搜索磁盘,速度较whereis和locate慢一些,不过选项很多,功能强大。

格式:

find [PATH] [option] [action]

 

与时间有关的选项

共有 -atime, -ctime 与 -mtime ,以 -mtime 说明:

-mtime n :n 为数字,意义为在 n 天之前的'一天之内'被更动过内容的档案;

-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的档案档名;

-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的档案档名。

-newer file :file 为一个存在的档案,列出比 file 还要新的档案档名

如:

1、

find / -mtime 0

0表示现在,找出从现在开始到 24 小时前

2、

find /etc -newer /etc/passwd

找出比/etc/passwd更新的文件

3、

find /var -mtime -4

4天内

find /var -mtime 4

4-5天

find /var -mtime +4

5天前

与使用者或群组名称有关的选项:

-uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID

-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID

-user name :name 拥有者的账号,如kkk

-group name:name 群组名称,如 users ;

-nouser :没有所有者的文件

-nogroup :没有群组的文件

 

如:

1、

find /home –user kkk

搜索/home下面拥有者为kkk的文件。

 

2、

find / -nouser

找出系统中没有拥有者的文件,如用户被删除时就会有这种文件产生

 

与档案权限及名称有关的参数

-name filename:搜寻档案名称为 filename 的档案;

-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的档案。这个 SIZE 的规格有:

c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB

还要大的档案,就是' -size +50k '

 

-type TYPE :搜寻档案的类型为 TYPE 的,类型主要有:一般正规档案 (f),

装置档案 (b, c), 目录 (d), 连结档 (l), socket (s),及 FIFO (p) 等属性。

 

-perm mode :搜寻档案权限'刚好等于' mode 的档案,这个 mode 为类似 chmod

的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !

 

-perm -mode :搜寻档案权限'必须要全部囊括 mode 的权限'的档案,举例来说,

我们要搜寻 -rwxr--r-- ,亦即 0744 的档案,使用 -perm -0744,

当一个档案的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,

因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。

 

-perm +mode :搜寻档案权限'包含任一 mode 的权限'的档案,举例来说,我们搜寻

-rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw-------

也会被列出来,因为他有 -rw.... 的属性存在!

如:

1、find / -name passwd

搜索整个系统中文件名为passwd的文件

也可以模糊匹配,如:

 

2、find / -size +1000k

找出系统中大于1000k的文件

 

3、find /var –type s

搜索/var里面的socket类型文件

 

4、find / -perm +7000

搜索整个系统中,含有s或t的特殊权限的文件。

因为7000 就是 ---S--S--T ,只要含有 s 或 t 的就列出

如果是-7000表示必须包含SST三个都有的才列出来

 

5、find / -perm +6000

搜索整个系统中,含有SUID或SGID权限的文件。

与或非连接符

-a是and,-o是or,!是not

3、find /etc -size +1500k -o -size 0

找出/etc下大于1500或者刚好为0大小的文件,其中o表示or(或者)

 

额外可进行的动作

-exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。

-print :将结果列印到荧幕上,这个动作是预设动作!

 

如:

1、

find / -name kkk* -exec ls -l {} \;

其中-exec表示命令开始,\;表示命令结束,它们之间的内容就是执行的命令。

{}表示find找到的结果填充到这里。这里命令ls –l不能用别名ll代替。

2、

查找系统中的大文件(大于100M的)

find / -size +100M -exec ls -lh {} \;

硬盘

IDE和SATA

一般分为IDE硬盘和SATA硬盘

IDE接口宽一些,SATA的窄一些。

硬盘存储结构

扇区:即磁区,硬盘的最小容量单位,为512Byte,圆环上的一段。

磁道:一个圆环,由多个扇区组成。也就是同一盘片不同半径的同心圆。

柱面:即磁柱,不同盘片相同半径构成的圆柱面,由多个磁道构成。

存储容量=磁头数×每个磁头负责的柱面数×每柱面扇区数×每扇区字节数 

硬件对应设备文件

几乎所有的硬件都对应到/dev下的文件(不是目录),一般是硬件接口的位置就对应了/dev下的设备名字,因此如果硬盘换一个接口位置插,则它设备名字会改变。

由于设备文件不能直接打开使用,因此只能将dev下的设备挂在到目录后才能使用。

硬件对应设备列表如下:

 

IDE设备命名

通常有2个IDE口,而每个IDE口可以接2个IDE设备,分为MASTER和SLAVE,所以命名是:

第一个扇区

整个硬盘的第一个扇区也叫引导扇区(硬盘引导扇区不属于任何一个分区),记录了特殊的内容,512Byte中:

前446Byte叫MBR段,(MBR段可以安装boot loader,即开机管理程序, 广义的MBR包含整个扇区)。

后面64Byte记录分区信息,也叫分区表,一共记录了4个分区,每个分区记录占16Byte,分为柱面开始位置和柱面结束位置,各8Byte

因此一块IDE硬盘的4个分区名为, /dev/hda1、/dev/hda2、/dev/hda3、/dev/hda4

 

每个分区都有引导扇区,叫DBR,里面也用于安装boot loader

分区

1个硬盘最多分为4个区,主分区和扩展分区加起来最多4个。

扩展分区最多只能有1个

扩展分区可以再分成多个逻辑分区(),IDE硬盘最多有59个逻辑分割(5号到63号,1、2、3、4号为系统保留), SATA硬盘最多有11个逻辑分割(5号到15号,1、2、3、4号为系统保留)。

能格式化的有主分区、逻辑分区,而扩展分区本身不能直接格式化。

分区的最小单位是柱面。

 

简称:

主分区:P分区

扩展分区:E分区

逻辑分区:L分区

开机流程

  1. 主板加电以后自动读取bios(bios是保存在主板上的)。
  2. BIOS根据用户的设置读取第1个可开机装置的第1个扇区内的MBR。
  3. MBR上的开机管理程序(boot loader)扫描整块硬盘的活动分区,载入其DBR,然后让用户选择分区或自动选择,执行其DBR
  4. DBR的boot loader读取本分区内的可开机核心文件,载入。
  5. 核心文件进入操作系统功能。

boot loader只能读取本分去内的开机文件,如果是多系统,则可以把其他系统装到其他分区,然后在其他分区的第一扇区的MBR位置安装boot loader,这样可以再第1个分区的boot loader选择界面选择其他分区启动即可。(boot loader可以提供选择界面)

 

分区和目录

分区都是挂在到目录上的,父目录和子目录可能挂在不同分区,如:

这里/和/home在不同分区,而判断某一个目录在哪个分区采用反向查找的办法如test目录

test->bird->home->/

最先找到的是home,因此test在partition 2分区。

查看分区用df命令,如:

EXT2 文件系统

文件系统概念

每种操作系统能够使用的文件系统不同,windows常用fat、ntfs等,linux常用ext2,、ext3

一般情况下一个分区对应一个文件系统(也有很多例外,如LVM、磁盘阵列等),格式化的时候指定。

 

EXT2文件系统结构

EXT2是索引式文件系统,文件数据放在block中,文件的位置放在inode中。

结构图:

block

block存放文件内容。

block大小和文件大小的关系:

特性:

  • block 的大小与数量在格式化时确定;
  • 每个 block 内最多只能够放置一个文件的资料;
  • 承上,如果档案大于 block 的大小,则一个文件会占用多个 block 数量;
  • 承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁碟空间会浪费)。

inode

inode是文件的索引,记录了文件的位置、属性等信息,如下:

  • 该文件的存取模式(read/write/excute);
  • 该文件的拥有者与群组(owner/group);
  • 该文件的容量;
  • 该文件建立或状态改变的时间(ctime);
  • 最近一次的读取时间(atime);
  • 最近修改的时间(mtime);
  • 定义文件特性的旗标(flag),如 SetUID...;
  • 该文件真正内容的指向 (pointer);

特性:

  • 每个 inode 大小均固定为 128 bytes;
  • 每个文件只占用一个 inode ;
  • 承上,文件系统能够建立的文件数量与 inode 的数量有关;
  • 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与使用者是否符合,若符合才能够开始实际读取 block 的内容。

 

inode记录每个block需要4Byte,而一个inode只有128Byte,直接记录的话太少,因此采用了间接记录的方式, 用block来记录地址,而inode记录这个block的地址。

block为1K时:

1个block为1K时,可记录block数为1K/4=256个

inode分为:

12个直接:记录block数为12个,大小12K

1个间接:记录block数为256个,大小256K

1个双间接:记录block数为256*256个,大小256*256K

1个三间接:记录block数为256*256*256个,大小256*256*256K

一共16G

但这个方法不能用在 2K 及 4K block 大小的计算中, 因为大于 2K 的 block 将会受到 Ext2 档案系统本身的限制,所以计算的结果会不太符合之故

图示:

 

superblock

superblock记录了整个文件系统的信息,只有第一个BLOCK GROUP有,其他BLOCK GROUP即使有,也只是作为第一个的备份。

Superblock内容:

  • block 与 inode 的总量;
  • 未使用与已使用的 inode / block 数量;
  • block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes);
  • filesystem 的挂载时间、最近一次写入资料的时间、最近一次检验磁碟 (fsck) 的时间等档案系统的相关资讯;
  • 一个 valid bit 数值,若此档案系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。

Filesystem Description (档案系统描述说明)

这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间

 

block bitmap (区块对照表)

记录了哪些block是空的。

inode bitmap (inode 对照表)

记录了哪些inode是空的。

查询文件系统 dumpe2fs

dumpe2fs /dev/sda1

-h :仅列出 superblock 的资料,不会列出其他的区段内容!

主要可以区分为上半部是 superblock 内容, 下半部则是每个 block group

EXT2目录结构

目录也是inode、block方式存储,inode存目录的权限、属性及block的位置。

block存该目录下所有的档案的名字和inode号码。

 

ls命令后接文件时,直接显示该文件属性,接目录时,会把该目录block中记录的所有档案列出来(也就是列出目录内的档案列表)。

 

当目录下文件档案时,也会占用不止1个block。当ls –d查看目录时,显示的目录大小就是占用block,而不是所有目录下文件的大小总和,如:

/根目录只占用4字节。

 

因此目录的w权限也就是修改其block的权限,因此需要w权限才能修改目录下的档案名。

 

ls /tmp/a/b

这种目录查找时,首先找的/的挂载点inode,然后找到block里面的a的inode,然后读取a的block,找到b的inode,最后找到b的block,按层级查找。

 

ls –i选项可以查看inode数值,如:

根/的inode是2

新建文件的流程

1、先确定使用者是否有该所在目录的w和x权限

2、根据 inode bitmap 找到没有使用的 inode 号码,并将新档案的权限/属性写入;

3、根据 block bitmap 找到没有使用中的 block 号码,并将实际的资料写入 block 中,且更新 inode 的 block 指向资料;

4、将刚刚写入的 inode 与 block 资料同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。

inode bitmap、block bitmap、superblock由于经常改变,所以也叫metadata,中介资料

日志式档案系统 Ext3

在某些情况下,metadata的数据可能跟实际资料存放不一致,比如新建过程中断电等,这就需要对所有文件进行检查,很费时。

Ext3采用日志记录的方式,新建文件前记录日志,文件创建或更新后再写入日志,这样只用检查日志即可发现有没有问题。

在用dumpe2fs查看时,superblock的最后就显示日志相关信息

查看支持的文件系统和目前载入的文件系统

ls -l /lib/modules/$(uname -r)/kernel/fs

可查看当前linux支持的文件系统,如:

 

cat /proc/filesystems

可查看目前载入的文件系统

VFS虚拟文件系统

linux通过VFS管理文件系统,比如不同分区的文件系统不同时,不需要手动指定文件系统读取,而由VFS自动转换。

查看容量df和分析容量du

查看容量df

df [-ahikHTm] [目录或文件名]

选项与参数:

-a :列出所有的档案系统,包括系统特有的 /proc 等档案系统;

-k :以 KBytes 的容量显示各档案系统;

-m :以 MBytes 的容量显示各档案系统;

-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;

-H :以 M=1000K 取代 M=1024K 的进位方式;

-T :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;

-i :不用硬盘容量,而以 inode 的数量来显示

 

df命令主要读取superblock的信息来展示。

 

如:

默认方式查看:

 

查看所有的:

 

查看/etc的情况

这里会自动找到/etc所在分区,显示这个分区的情况。

分析容量du

du [-ahskm] 档案或目录名称

选项与参数:

-a :列出所有的文件与目录容量,因为预设仅统计目录。

-h :以人们较易读的容量格式 (G/M) 显示;

-s :列出总量而已,而不列出每个各别的目录占用容量;

 

-S :不包括子目录下的总计,与 -s 有点差别。

-k :以 KBytes 列出容量显示;

-m :以 MBytes 列出容量显示;

 

du会将所有子目录递归,然后显示每一个的容量(du显示的目录容量是包含了里面所有的文件和目录的总和,只是显示的时候默认只显示目录的),如:

 

-s可以不递归,类似ls的-d选项,如:

 

常用的是du -s 目录名,统计某个目录的大小。

 

-S也会递归,只不过统计的大小不包含子目录

硬链接和软链接

硬链接

文件的硬链接

由于目录的block块中存了文件名与文件的inode,如果2个文件名的inode相同,则它们互为硬链接(也叫实体链接),都指向了同一个文件(其实并没有什么硬链接,只是两个地址指向了同一个文件)。

如:

ln /tmp/1.txt /tmp/aaa

其中1.txt是一个存在的文件,/tmp/aaa是一个存在的目录,这样就在/tmp/aaa下创建了一个硬链接1.txt,它们的inode相同,里面的连接数变成了2.

结构如下:

其中的real是该文件的inode。

命令也可能这样:

ln /tmp/1.txt /tmp/aaa/a

创建/tmp/aaa下的硬链接a,链接到/tmp/1.txt

ln /tmp/1.txt b.txt

在当前目录创建硬链接1.txt,链接到/tmp/1.txt

类似于cp命令,这里如果后面是一个已存在的目录,则硬链接创建到里面,名字与源相同,否则硬链接名字就是命令中最后的。

 

硬链接不能跨文件系统

(因为如果两个硬链接在不同文件系统, inode编号指向的block地址是不同的,分别指向两个文件系统的block。每个文件系统独立一套inode)

 

硬链接不能链接目录,只能链接文件

目录的链接数

目录的硬链接最少有2个,一个在父目录的block中,另一个是本目录block中的点.

如果创建一个目录,则:

新目录的block会产生2个硬链接.和..,一个指向本目录,一个指向父目录

父目录的block会产生1个硬链接指向新建的目录。

如:

aaa原来是2个链接,在aaa下面创建了bbb之后,aaa的链接增加了一个。

 

如果硬链接可以用ln手动随意链接目录,则目录的层级关系就会混乱,可能自身都成为自己的父目录,会造成很多问题(如遍历目录的时候很容易造成无限循环),因此不能手动ln指定目录的硬链接。

软链接

软链接也叫符号链接,其实是一种类型的文件,文件的内容指向了另一个文件,类似于快捷方式。

ln加-s选项可以创建软链接,如:

这里创建了1.txt的软链接2.txt,创建软链接不会改变文件的连接数,2.txt的长度为5,因为"1.txt"是5个字符。

如果1.txt被删掉,2.txt也无法访问了。(如cat 2.txt会提示找不到文件)

 

rm 2.txt时,不会删掉1.txt,rm删除链接时,删除链接本身。

 

软链接是否能找到文件主要看软链接的内容,可以是相对路径也可以是绝对路径,这里的2.txt内容是1.txt就是相对路径,如果把2.txt移动到其他没有1.txt的目录,则就找不到文件了。

软链接也可以是绝对路径,如:

这里的3.txt就存的/tmp/1.txt的绝对路径

 

示意图:

新加硬盘

新加的物理设备在/dev下会自动产生文件,比如为虚拟机新加硬盘:

这里添加了一个硬盘2

 

在/dev下可以找到,它是/dev/sdb (df无法直接找到,因为df显示目前挂载的文件系统,新硬盘还没有创建分区、没有格式化、没有挂载文件系统到目录)

fdisk分区

fdisk可以查看、创建分区,是对单个硬盘的操作,如:

fdisk /dev/sdb

注意后面没有数字,sdb是硬盘。

fdisk 没有办法处理大于 2TB 以上的分区,2TB以上的需要parted命令处理

这样操作以后,会进入命令行提示界面。

按m可以显示帮助

操作完后按w保存,按q取消。

创建分区 n

这里红色箭头是输入的内容,e表示扩展分区(如果已有扩展分区这里会自动变为logical逻辑分区),1表示分区号为1,+300M表示分300M。

 

查看磁盘分区状况 p

其中5368MB表示硬盘总容量。

一共652个柱面,每个柱面有255个磁头、每个磁头管理63个扇区,每个扇区512byte。

一共652*255*63*512=5368709120 bytes,即5368M

 

Device:设备名。

Boot:是否为开机启动分区?如果是就有*号。

Start, End:这个分区在哪个柱面号码之间,可以决定此分区的大小;

Blocks:就是以 1K 为单位的容量。如上所示,/dev/sdb1 大小为313236 = 300MB

ID, System:代表这个分区内的文件系统应该是啥!只是建议,不一定准确。

删除分区 d

假设目前有3个分区编号是1、2、4

删除分区,输入d然后选4即可,

fdisk –l 查看所有分区

fdisk –l可以查看所有磁盘的所有分区如:

这里两块硬盘分区都显示了。

dev设备文件误删的处理

如果/dev下面的分区被误删除了,如:rm –rf /dev/sdb2

此时只要fdisk进入fdisk /dev/sdb

然后直接w保存退出,/dev/sdb4又会自动出现。

也可以

mknod /dev/sdb4 b 8 20

这样处理,用mknod新建

partprobe重新加载分区信息

如果对含有根/分区的磁盘进行了fdisk操作,需要reboot以后才能生效,而使用partprobe命令重新加载一次也可以

但也会有提示,建议重启。

mkfs、mke2fs格式化

如:

mkfs –t ext3 /dev/sdb2

其中-t ext3表示采用ext3文件系统格式。

 

如果直接格式化扩展分区会报错,如:

其实mkfs是调用的其他命令

如mkfs –t ext3就是mkfs.ext3

 

选项:

-b :可以设定每个 block 的大小,目前支援 1024, 2048, 4096 bytes 三种;

-i :多少容量给予一个 inode 呢?

-c :检查磁碟错误,仅下达一次 -c 时,会进行快速读取测试;

如果下达两次 -c -c 的话,会测试读写(read-write),会很慢~

-L :后面可以接标头名称 (Label),这个 label 是有用的喔!e2label指令介绍会谈到~

-j :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal 而成为 EXT3。

如:

mke2fs和mkfs一样。

fsck检查分区

选项:

-t :如同 mkfs 一样,fsck 也是个综合软体而已!因此我们同样需要指定档案系统。

不过由于现今的 Linux 太聪明了,他会自动的透过 superblock 去分辨档案系统,

因此通常可以不需要这个选项的啰!请看后续的范例说明。

-A :依据 /etc/fstab 的内容,将需要的装置扫瞄一次。/etc/fstab 于下一小节说明,

通常开机过程中就会执行此一指令了。

-a :自动修复检查到的有问题的磁区,所以你不用一直按 y 啰!

-y :与 -a 类似,但是某些 filesystem 仅支援 -y 这个参数!

-C :可以在检验的过程当中,使用一个长条图来显示目前的进度!

 

EXT2/EXT3 的额外选项功能:(e2fsck 这支指令所提供)

-f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入

细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!

-D :针对档案系统下的目录进行最佳化配置。

 

如:

注意:一般情况不要使用fsck,很容易造成系统损害,只有发生极大问题才用。一般是单人维护使用。被检查的分区需要先卸载,且不能挂载在系统上。

lost+found目录就是存放fsck检查到的问题文件。

fsck也是调用了其他命令

badblocks 检查分区(很少使用)

badblocks -[svw] 分区设备名

选项与参数:

-s :显示检查进度

-v :可以在屏幕上看到进度

-w :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有档案时!

如:

由于可以在格式化是-c选项指定检查(mkfs -c),因此badblocks很少使用了。

mount挂载和卸载文件系统

挂载:mount 设备 目录

挂载即使将设备文件映射到一个目录,通过这个目录访问到这个文件系统的层级结构。(系统记录了挂载点的inode,即文件系统的根目录,一般是2,然后通过根目录层层访问到里面的内容。)

挂载原则:

挂载点目录和设备文件一一对应,挂载点目录为空目录。

如果挂载点目录不为空,则挂载后,原来目录中的东西会自动隐藏,待卸载以后又会显示出来。

如:

把/dev/sdb2设备文件挂载到了/mnt/sdb2目录。

挂载好以后用df命令就可以看到了

 

linux能在挂载时自动读取文件系统的superblock中的文件系统类型信息,然后可以自动挂载(一般是指有该文件系统的驱动程序)的就自动挂载,linux能自动挂载文件系统类型在下面两个地方:

  • /etc/filesystems:系统指定的测试挂载档案系统类型;
  • /proc/filesystems:Linux系统已经载入的档案系统类型。

驱动程序在:/lib/modules/$(uname -r)/kernel/fs/

如:

选项与参数:

-a :依照设定档 /etc/fstab 的资料将所有未挂载的磁碟都挂载上来

-l :单纯的输入 mount 会显示目前挂载的资讯。加上 -l 可增列 Label 名称!

-t :与 mkfs 的选项非常类似的,可以加上档案系统种类来指定欲挂载的类型。

常见的 Linux 支援类型有:ext2, ext3, vfat, reiserfs, iso9660(光碟格式),

nfs, cifs, smbfs(此三种为网路档案系统类型)

-n :在预设的情况下,系统会将实际挂载的情况即时写入 /etc/mtab 中,以利其他程式

的运作。但在某些情况下(例如单人维护模式)为了避免问题,会刻意不写入。

此时就得要使用这个 -n 的选项了。

-L :系统除了利用装置档名 (例如 /dev/hdc6) 之外,还可以利用档案系统的标头名称

(Label)来进行挂载。最好为你的档案系统取一个独一无二的名称吧!

-o :后面可以接一些挂载时额外加上的参数!比方说帐号、密码、读写权限等:

ro, rw: 挂载档案系统成为唯读(ro) 或可读写(rw)

async, sync: 此档案系统是否使用同步写入 (sync) 或非同步 (async) 的

记忆体机制,请参考档案系统运作方式。预设为 async。

auto, noauto: 允许此 partition 被以 mount -a 自动挂载(auto)

dev, nodev: 是否允许此 partition 上,可建立装置档案? dev 为可允许

suid, nosuid: 是否允许此 partition 含有 suid/sgid 的档案格式?

exec, noexec: 是否允许此 partition 上拥有可执行 binary 档案?

user, nouser: 是否允许此 partition 让任何使用者执行 mount ?一般来说,

mount 仅有 root 可以进行,但下达 user 参数,则可让

一般 user 也能够对此 partition 进行 mount 。

defaults: 预设值为:rw, suid, dev, exec, auto, nouser, and async

remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!

用分区标签挂载

/dev/sdb2的分区标签是kkkkkk

加-L选项可以用标签挂载

查看已挂载设备mount [-l]

如:

加-l可以显示分区的标签,如上面的kkkkkk

 

挂载光盘或者软件需要将他们卸载后再拿出,否则容易产生不确定的问题。

重新挂载根目录

在需要改变根目录的读写权限,又不希望reboot的情况下,可以用remount。

如:

mount -o remount,rw,auto /

目录挂载到目录

目录可以挂载到目录,用—bind选项,如:

此时/mnt/home和/home都是访问的/home,它们的inode相同

用mount或者df –a可以看到这种挂载。

umount 卸载

如:

umount /dev/sdb2

或者

umount /mnt/sdb2

后面接设备文件名或者挂载点目录名都可以。

 

如果cd到了某个目录或其子目录内,而卸载它时就会提示busy。退出来再卸载即可

设置开机挂载

所有开机需要挂载的设备都需要配置到/etc/fstab中,

根目录/必须最先挂载

如:

一共6列,依次是:

设备名(或label)、挂载点目录、文件系统、挂载参数、是否能被dump 备份、是否 fsck 检查

挂载参数(第3列)列表:

第5列:是否能被dump 备份:

0:不备份

1:每天备份

2:不定时备份

一般是0或1

 

第5列:是否fsck检查:

0:不检查

1、2:检查

1比2先检查

一般根目录/为1,其他需要检查的都为2

fstab资料错误时的处理

如果fstab输入资料错误,导致无法开机,就只能进入单人维护模式,而此时/是只读状态,无法修改/etc/fstab,需要执行以下命令:

mount -n -o remount,rw /

挂载iso

mount可以将iso文件当做设备直接挂载,如:

 

mount -o loop /root/test.iso /mnt/centos_dvd

 

将/root/test.iso挂载到了/mnt/centos_dvd目录

dd制作大文件

如:

dd if=/dev/zero of=/home/loopdev bs=1M count=512

if是输入文件,dev/zero 是会一直输出 0 的装置

of是输出文件

bs是每次输出的大小

count是输出的次数

这里只做了一个512M的文件/dev/loopdev

挂载普通文件

文件也可以被当做设备挂载,如刚才用dd创建的文件可以先mkfs格式化,

然后挂载(加-o loop选项)。

如:

mount -o loop /home/loopdev /media/cdrom

 

挂载普通文件可以在不重新分区的情况下分割大磁盘。

mknod新建设备(很少使用),并指定major和minor参数

major 与 minor是设备文件的属性,有特殊意义,如:

第5列的8是major,第6列的0,1,2…20是minor

意义如下:

mknod可以新建设备并指定major和minor

如:

mknod /dev/sdb5 b 8 22

格式:

mknod 设备名 [bcp] [Major] [Minor]

 

选项与参数:

装置种类:

b :设定设备名成为一个周边储存设备档案,例如硬碟等;

c :设定设备名成为一个周边输入设备档案,例如滑鼠/键盘等;

p :设定设备名成为一个 FIFO 档案;

Major :主要设备代码;

Minor :次要设备代码;

 

mknod很少使用,因为linux2.6以后新建分区都会自动指定major与minjor。

 

e2label修改分区label

如:

e2label /dev/sdb2 hello

或者

e2label /dev/sdb2 "hello"

tune2fs调整和查看分区参数

tune2fs [-jlL] 设备名

选项与参数:

-l :类似 dumpe2fs -h 的功能~将 superblock 内的资料读出来~

-j :将 ext2 的 filesystem 转换为 ext3 的档案系统;

-L :类似 e2label 的功能,可以修改 filesystem 的 Label 喔!

 

如:

1、查看block信息

tune2fs -l /dev/sdb2,相当于dumpe2fs –h /dev/sdb2,查看superblock信息

 

2、设置分区label

tune2fs -L "kitty" /dev/sdb2

 

3,ext2转ext3

tune2fs -j /dev/sdb2

hdparm硬盘性能测试和参数设置

hdparm可以设置ide硬盘的参数,如果是sata硬盘,则主要是测试性能

选项与参数:

-i :将核心侦测到的硬碟参数显示出来!

-c :设定 32-bit (32位元)存取模式。这个 32 位元存取模式指的是在硬碟在与

PCI 介面之间传输的模式,而硬碟本身是依旧以 16 位元模式在跑的!

预设的情况下,这个设定值都会被打开,建议直接使用 c1 即可!

-d :设定是否启用 dma 模式, -d1 为启动, -d0 为取消;

-m :设定同步读取多个 sector 的模式。一般来说,设定此模式,可降低系统因为

读取磁碟而损耗的效能~不过, WD 的硬碟则不怎么建议设定此值~

一般来说,设定为 16/32 是最佳化,不过,WD 硬碟建议值则是 4/8 。

这个值的最大值,可以利用 hdparm -i /dev/hda 输出的 MaxMultSect

 

来设定喔!一般如果不晓得,设定 16 是合理的!

-X :设定 UtraDMA 的模式,一般来说, UDMA 的模式值加 64 即为设定值。

并且,硬碟与主机板晶片必须要同步,所以,取最小的那个。一般来说:

33 MHz DMA mode 0~2 (X64~X66)

66 MHz DMA mode 3~4 (X67~X68)

100MHz DMA mode 5 (X69)

如果您的硬碟上面显示的是 UATA 100 以上的,那么设定 X69 也不错!

-T :测试暂存区 cache 的存取效能

-t :测试硬碟的实际存取效能 (较正确!)

 

如:

hdparm -Tt /dev/sda /dev/sdb

这里测试了/dev/sda和/dev/sdb两个硬盘的性能

构建swap(虚拟内存)

分区构建swap

分区可以指定为swap,则整个分区都是swap用。

1、fdisk创建swap分区

fdisk分区的时候需要制定某个分区是swap分区。t命令可以修改分区system id为82,即可变成swap分区

2、刷新分区信息,格式化swap分区

partprobe

刷新分区信息

 

mkswap /dev/sdb5

创建swap

 

3、载入swap

swapon /dev/sdb5

free可以查看内存情况。

可以看到载入之后swap变大了

swapon –s可以查看swap有哪些设备。

如:

普通文件构建swap

步骤同分区创建的类似:

1、dd创建大文件

2、格式化

3、swapon载入

swapoff关闭swap文件

如:swapoff /home/swapdev和swapoff /dev/sdb5

压缩和解压

compress(很少使用)

compress已经过时,在很老的系统上才有

新版本的linux需要安装:

yum install ncompress

格式:

compress [-rcv] 文件或目录 <==这里是压缩

uncompress 文件.Z <==这里是解压缩

 

选项与参数:

-r :遍历目录下的文件进行压缩。

-c :将压缩资料输出成为 standard output (输出到荧幕)

-v :显示压缩的资料以及压缩过程中的一些文件名变化。

 

compress压缩后的文件是.Z结尾。

压缩后原文件被替换为新文件,原文件消失。

compress不能压缩目录,只能压缩单个文件,后面接目录时,需要加-r,表示遍历目录里面的所有文件,然后一个个分别压缩。

如:

compress -v man.config

uncompress –v man.config.Z

 

采用重定向的方式保留原文件:

compress -c a.txt > a.txt.Z

gzip

gzip压缩的文件已.gz结尾,gzip可以解压compress压缩的.Z文件。.gz文件也可以被windows的winrar解压。gzip压缩、解压文件后原文件也会消失。

同compress一样,

gzip不能压缩目录,只能压缩单个文件,后面接目录时,需要加-r,表示遍历目录里面的所有文件,然后一个个分别压缩。

如:

压缩:

gzip man.config

解压:

gzip –d man.config.gz

选项与参数:

-c :将压缩的资料输出到屏幕上,可通过重导向来处理;

-d :解压;

-t :检验文件一致性;

-v :显示压缩比等信息;

-# :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6

-r :遍历目录下的文件进行压缩。

 

gzip也可以通过重定向的方式保留原文件,如:

gzip -c man.config > man.config.gz

bzip2

bzip2 [-cdkzv#] 档名

 

bzip2能提供比gzip更好的压缩比,压缩文件扩展名是.bzip2,用法同gzip类似。

-c :压缩资料输出到屏幕!

-d :解压

-k :保留原始文件

-z :压缩(可省略,默认就是压缩)

-v :显示压缩比等信息;

-# :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6

 

bzip2多了-k选项可以保留原文件,没有-r选项,bzip2也是只能压缩文件,不能压缩目录。

bzip2 –d相当于bunzip2解压,如:

bunzip2 man.config.bz2

zcat、bzcat读取压缩文件内容

zcat可以直接读取.gz与.Z压缩文件的内容,如:

zcat man.config.gz

bzcat可以读取.gz、.Z、.bz2文件的内容

如:

bzcat man.config.bz2

tar打包解包

tar可以将多个文件或目录打包成一个文件,打包的同时也可以压缩。跟winrar选择一个或多个文件打包一样。-v参数可以查看打包解包的过程。

打包 -c

参数-c是打包。

tar –c –f 生成的文件名 需要打包的文件

如:

tar -c -f kkk.tar 1.txt 2.txt f1

1.txt、2.txt、目录f1共3个档案打包生成了文件12.tar

 

生成的文件默认在当前目录。前面也可以加目录如:

 

tar -c -f /tmp/test/kkk.tar 1.txt

生成的kkk.tar就会放到/tmp/test下

选项:

-j :bzip2压缩, *.tar.bz2

-z :gzip压缩, *.tar.gz

-p :保留原来的权限与属性,常用于备份(-c)重要的设定挡

-P :保留绝对路径,亦即允许备份资料中含有根目录存在之意;(很少用)

 

默认打包会将原文件的路径中的/去掉,变成相对路径,为了防止解压的时候覆盖掉。

 

注意:按照约定,各种压缩方式产生的文件名有规定。

tar直接打包:*.tar

gzip打包压缩:*.tar.gz

biz2打包压缩:*.tar.bz2

如:

tar -cj -f kkk.tar.bz2 1.txt f1

查看 -t

-t是查看打包资料,如:

tar -t -f kkk.tar.bz2

tar -jt -f kkk.tar.bz2

由于tar可以自动识别压缩方式,所以不加-j也可以。

加-v可以查看详细资料

解压 -x

如:

tar -x kkk.tar.bz2

默认解压后的文件在当前目录,-C可以指定目录,如:

tar -x -f kkk.tar.bz2 -C aaa

解压后的文件放到了aaa目录下

 

解压单个档案,

后面加档案的路径名即可,如:

tar -x -f kkk.tar.bz2 f1/a.txt

只解压a.txt

如:

只解压a.txt和b.txt

排除 --exclude

如:

tar -jcv -f root.bz2 /root --exclude=/etc* --exclude=*.bz2

打包排除了etc*和*.bz2.

过滤文件修改时间 --newer-mtime

如:

tar -jc -f /root/etc.newer.then.passwd.tar.bz2 --newer-mtime="2008/09/29" /etc/*

只打包修改日期在2008/09/29之后的资料。

tarfile, tarball

tar没有压缩的文件称为tarfile(*.tar),压缩过的tar文件称为tarball(*.bz2,*.gz)

打包到设备

磁带机由于是一次性读取/写入的装置,因此我们不能够使用类似 cp 等指令来复制的。

可以用tar直接把文件打包进去。

如:

tar -cv -f /dev/st0 /home /root /etc

利用管道

如:

tar -c -f - /etc | tar -x -f –

相当于cp -r /etc .

其中的-代表缓存,先打包到缓存,然后再解包到当前目录。

dump备份

与tar使用方式类似,dump主要用于备份,如:

dump -f test.dump1 /boot

将/boot备份到了test.dump1

 

选项:

-S :仅列出后面的待备份资料需要多少磁碟空间才能够备份完毕;

-u :将这次 dump 的时间记录到 /etc/dumpdates 档案中;

-v :将 dump 的档案过程显示出来;

-j :用 bzip2 压缩,压缩等级为 2

-level:等级,从 -0 ~ -9 共十个等级;

-f :目标文件名

-W :列出在 /etc/fstab 里面的具有 dump 设定的 partition 是否有备份过?

 

备份文件系统(即挂载点,整个文件系统)时,才支持-level与-u,备份一般目录时不支持。

 

-level是0-9,0是完整备份,为1时会自动检查当前与上一次0级备份时的差异,只备份差异,为2时检查与1的差异,以此类推,为9是检查与8的差异(如果没有8,则找7,一直找到0)。

如:

备份整个文件系统

完整备份/boot挂载点

 

1级备份/boot

 

大小:

完整的最大,增量的很小

备份单个目录

如:

dump -j -f etc_j.dump /etc

跟tar命令类似。

restore还原

restore还原文件会放到当前目录,因此还原之前需要先进入目标目录。

如:

restore -r -f /tmp/sdb5.dump

 

参数:

restore -t [-f dumpfile] [-h] <==用来察看 dump 档

restore -C [-f dumpfile] [-D 挂载点] <==比较dump与实际档案

restore -i [-f dumpfile] <==进入互动模式

restore -r [-f dumpfile] <==还原整个档案系统

 

 

互动模式可以还原单个文件

如:

还原了3.txt

 

光盘写入

mkisofs

cdrecord

待补充

dd备份

dd只能操作文件,不能操作目录。

如前面用过的dd制作大文件

dd if=/dev/zero of=/home/loopdev bs=1M count=512

 

dd备份文件

也可直接复制文件

如:

dd if=/etc/passwd of=/etc/passwd.back bs=512

bs默认是512可以不写,表示每一块的大小。

由于passwd文件大小为1616Byte,因此512大小的需要3+1,而1024大小需要1+1,+1表示未满1块。

 

dd备份还原文件系统(设备文件)

备份设备文件相当于备份了整个文件系统,还原的时候直接覆盖设备文件即可。

如:

备份:

dd if=/dev/sdb5 of=sdb5.back

还原:

dd if= sdb5.back of=/dev/sdb5

 

还原的时候最好先umount卸载后再还原,以免文件系统出现问题。

 

也可以直接拷贝文件系统,如:

dd if=/dev/sdb5 of=/dev/sdb6

这里直接拷贝了整个设备,用cp、tar等是无法做到的,因为需要拷贝superblock, boot sector, meta data等,这样sdb6都不需要格式化了。

cpio备份

cpio备份的文件名不能直接写,需要用管道接收,如:

find /boot | cpio -ocvB > /tmp/boot.cpio

备份/boot下的所有文件

 

解压:

cpio -idvc < /tmp/boot.cpio

 

备份到磁碟:

find / | cpio -ocvB > /dev/st0

还原:

cpio -idvc < /dev/st0

vi和vim编辑器

linux上有很多文本编辑器,如emacs, pico, nano, joe、vim等,由于很多linux的软件编辑界面默认都会调用vi,因此vi编辑器比较通用。

vim是vi的升级版,提供了语法自动颜色、底线等,用起来更方便。

 

vi的三种模式

一般模式:vi刚进入时是一般模式,可以移动光标、删除、复制、粘贴,但无法用键盘编辑。

 

编辑模式:可以删除、复制、粘贴等,也可以直接编辑,一般模式下按i, I, o, O, a, A, r, R中的一个进入编辑模式。编辑模式按Esc回到一般模式

 

命令模式:可以搜索,读取、保存、批量替换、离开 vi 、显示行号等。一般模式下按: / ?中的一个进入命令模式,命令模式按Esc回到一般模式

编辑模式和命令模式之间不能直接切换,需要经过一般模式。

vi的使用

基本使用

与nano类似,如

vi test.txt

test.txt不存在也不会报错,保存时会自动创建。

进入之后:

 

保存文件,:wq保存退出,如果文件没有w权限,则用:wq!,强制保存,前提是能够改变它的权限。

常用指令

移动光标:

上下左右

h 或 向左方向键(←)

左移一个

j 或 向下方向键(↓)

下移一行

k 或 向上方向键(↑)

上移一行

l 或 向右方向键(→)

右移一个

可以加数字,如50j,向下移动50行。

翻页

[Ctrl] + [f]

向下翻页,相当于 [Page Down]

[Ctrl] + [b]

向上翻页,相当于 [Page Up]

 

行首行尾

0 或 [Home]

行首

$ 或功能键[End]

行尾

 

任意移动行(G)

G

移动到最后一行

nG

n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)

gg

移动到这个档案的第一行,相当于 1G

查找替换:

查找

/word

向后搜索word关键字

?word

向前搜索word关键字。

n

下一个

N

上一个

替换

:n1,n2s/word1/word2/g

n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字串,并将该字串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:
':100,200s/vbird/VBIRD/g'。(常用)

:1,$s/word1/word2/g

从第一行到最后一行寻找 word1 字串,并将该字串取代为 word2 !(常用)

:1,$s/word1/word2/gc

从第一行到最后一行寻找 word1 字串,并将该字串取代为 word2 !且在取代前显示提示字符给使用者确认 (confirm) 是否需要取代!(常用)

删除、复制、粘贴

x, X

x相当于 [del], X相当于 [backspace]

dd

删除一行

ndd

n 为数字。删除光标所在的向下 n 列,例如 20dd 删除 20行

yy

复制一行

nyy

n 为数字。复制光标所在的向下 n 列,例如 20yy 复制 20 行

p, P

粘贴:p:下一行开始粘贴,P:上一行开始粘贴

撤销、前进、重复

u

相当于ctrl z,撤销

[Ctrl]+r

相当于ctrl y,前进

.

重复上一个动作,比如dd删除一行,然后按一下点".",删除一行

切换到编辑模式

i, I

插入模式

i:光标前一个字符,I:所在行的第一个非空白字符处。

a, A

A:光标后一个字符, A :行尾

o, O

插入模式

o: 下面新增一行,O:上面新增一行

r, R

替换模式
r 替换一个字符,R一直替换

切换到命令模式

先按冒号":",然后w保存,q退出,!强制

列表:

:w

保存

:w!

文件 '只读'时,强制保存。不过,到底能不能写入, 还是跟用户对文件的权限有关。

:q

退出

:q!

不保存强制退出

:wq

保存后离开

ZZ

这是大写的 Z 喔!如果没有改动,不保存离开,如果有改动,保存后离开

:w [filename]

另存成filename

:r [filename]

读入另一个文档 'filename',然后将读入的内容追加到当前光标后面。

:set nu

显示行号

:set nonu

取消显示行号

 

 

vi的暂存文件

vi打开文件后会自动生成暂存文件.swap(格式为隐藏,需ls –a才能看到),类似于word的~开头的文件,用于不正常关闭时的恢复等,如果打开是发下有,就会给提示:

如:

 

文本选择

区块选择的按键意义

v

普通选择,相当于按住Shift选择

V

行选择,只能选择行

[Ctrl]+v

相当于"列模式"选择

y

复制所选内容

d

删除所选内容

多窗口显示 :sp

可以同时打开两个窗口编辑,用":sp 文件名"即可。

多视窗情况下的按键功能

:sp [filename]

如果filename没有,则默认再打开当前文件

[ctrl]+w+ j
[ctrl]+w+↓

移动到下一个窗口

[ctrl]+w+ k
[ctrl]+w+↑

移动到上一个窗口

[ctrl]+w+ q

同":q",离开

如:

环境设定与记录: ~/.vimrc, ~/.viminfo

~/.viminfo文件记录了操作记录,是自动生成的文件。

~/.vimrc需要手动创建,在里面添加配置,vim打开时会自动读取里面的配置。

 

如:

~/.vimrc内容为:

则,每次打开文件都会自动添加行号。

如:

[root@www ~]# vim ~/.vimrc

"这个档案的双引号 (") 是注解

set hlsearch "高亮度反白

set backspace=2 "可随时用倒退键删除

set autoindent "自动缩排

set ruler "可显示最后一行的状态

set showmode "左下角那一行的状态

set nu "可以在每一行的最前面显示行号啦!

set bg=dark "显示不同的底色色调

syntax on "进行语法检验,颜色显示。

 

/etc/vimrc下也有配置文件,那个是全局的,针对所有用户,不建议直接修改。(个人配置优先于全局配置)

文件换行符转换dos2unix与unix2dos

dos的换行符与unix不同,多了一位,可以用命令对文件进行转换,如:

unix2dos man.config

转换之后文件变大了,因为dos换行符比unix的多一个字符

格式:

dos2unix [-kn] file [newfile]

unix2dos [-kn] file [newfile]

选项与参数:

-k :保留原文件的 mtime

-n :保留原文件,新建新文件,如: dos2unix -n old.txt new.txt

文件编码转换 iconv

文件可以用另存指定编码的方式转换,也可以直接用命令转换编码,如:

格式:

iconv -f 原本编码 -t 新编码 filename [-o newfile]

选项与参数:

--list :列出 iconv 支持的编码

-f :from ,原编码;

-t :to ,新编码;

-o file:如果要保留原本的文件,那么使用 -o 新文件名,可以建立新编码文件。

 

如:

iconv -f big5 -t utf-8 vi.big5 -o vi.utf-8

将vi.big5的big5编码文件转换成vi.utf-8的utf-8编码文件

file命令查看效果:

bash

shell概念

直接操作硬件的是内核,shell解释命令,调用内核。

man, chmod, chown, vi, fdisk, mkfs 等都是应用程序,通过shell解释来调用内核。

shell有很多,如:Bourne SHell (sh) 、在 Sun 里头预设的 C SHell、 商业上常用的 K SHell、, 还有 TCSH 等等, Linux 使用的'Bourne Again SHell (简称 bash) ',各shell语法都很类似。

 

系统支持的shell在/etc/shells中

 

使用哪个shell在登录时指定,在/etc/passwd中配置

可以看到,root登录时是使用bash

nologin的shell一般用于受限制的使用,比如FTP服务仅允许用户使用ftp功能,这时就可以分配nologin的shell给这个用户。

type查看命令

type [-tpa] name

选项与参数:

:不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内建指令

-t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:

file :表示为外部指令;

alias :表示该指令为命令别名所设定的名称;

builtin :表示该指令为 bash 内建的指令功能;

-p :如果后面接的 name 为外部指令时,才会显示完整档名;

-a :会由 PATH 变数定义的路径中,将所有含 name 的指令都列出来,包含 alias

如:

变量

变量是参数的一种表示形式。

在linux中使用很广泛,定义变量,然后在执行命令的时候就能使用,变量中有一部分系统预设的,如PATH、HOME、MAIL、SHELL等(环境变量都是系统预设的),通常用大写字母,其他变量用小写字母。

设置变量

通常系统预设变量用大写字母,自定义变量用小写字母

直接用等号就可以设置了,如

变量名=参数

参数的规则见下面一小节(可变参数)。

如:

规则:

1、等号两边不能直接接空格, 变量名只能是字母或数字,不能数字开头,变量值含特殊符号([Enter], $, \等)的可以用\转义。

如:

2、取消变量用 unset

如:
unset myname

参数

命令的组成是

command [-options] parameter1 parameter2 ...

后面的parameter就是参数,变量赋值时等号右边的部分也是参数

1、参数中可以包含变量,形式有$a,${a}

如:

如echo $myname就是echo命令使用了$myname参数

2、参数中可以有双引号或单引号,双引号是为了再引用变量时分界,单引号为了原样显示里面的内容

如:

双引号分界:

 

单引号原样显示内容:

第2个$a被原样显示了出来

 

等同于ll –d ${a}c

3、参数中可以有其他的命令执行结果,用反单引号(1左边那个键)或者$(command)的形式,如:

 

进入目前核心的模组目录

cd /lib/modules/$(uname -r)/kernel

 

如果/tmp/aaa/bbb/ccc为常用工作目录,则这样设定可以不用每次都去写路径。

 

4、参数中可以有通配符*,如:

ll ./*

echo显示命令

echo可以显示字符,如:

echo abc

也可以显示变量

如:

echo $PATH

echo ${PATH}

环境变量

概念

环境变量属于系统预设变量,使用env可以查看:

HOME=/root

使用者的主目录,也就是~的路径

SHELL=/bin/bash

目前使用的shell是哪一个

HISTSIZE=1000

历史命令的记录数量

MAIL=/var/spool/mail/root

mail命令收信时读取的目录

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

搜寻执行文件的路径

LANG=zh_CN.UTF-8

使用的语言(字符集)

RANDOM

这个在env里面没有,用set才可以看到,随机数,0到32767

 

export也可以显示所有环境变量,只是前面增加了变量的定义:

 

子程序使用

  • 当启动一个 shell,linux会分配一堆环境变量给它,子程序启动时,会自动把父程序的环境变量拷贝一份分配到子程序环境变量里。
  • 子程序修改环境变量不会影响父程序的环境变量的值。
  • 使用export可以使普通变量变成环境变量

如:

bash命令可以进入子程序,exit退出子程序

第1次没有export myname,在子程序中echo $myname不显示

第2次export之后就显示了

其他预设变量

set可以查看所有变量

 

PS1='[\u@\h \W]\$ '

命令提示符,

说明:

\d :可显示出'星期 月 日'的日期格式,如:"Mon Feb 2"

\H :完整的主机名称。举例来说,鸟哥的练习机为'www.vbird.tsai'

\h :仅取主机名称在第一个小数点之前的名字,如鸟哥主机则为'www'后面省略

\t :显示时间,为 24 小时格式的'HH:MM:SS'

\T :显示时间,为 12 小时格式的'HH:MM:SS'

\A :显示时间,为 24 小时格式的'HH:MM'

\@ :显示时间,为 12 小时格式的'am/pm'样式

\u :目前使用者的帐号名称,如'root';

\v :BASH 的版本资讯,如鸟哥的测试主机板本为 3.2.25(1),仅取'3.2'显示

\w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;

\W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。

\# :下达的第几个指令。

\$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~

如:

[root@localhost ~]#

其中:

\u=root

\h=localhost

\W=~

$=#

 

$

set也看不到,不过存在。表示目前shell的线程id,每次开一个客户端都会分配一个shell,id不同,进入子程序也会变。

如:

 

?

set也看不到,表示上一个指令的返回值,0表示成功,非0表示失败。类似于ahk找图函数的ErrorLevel。

如:

最后一个0是因为上1个是echo $?成功了。

 

OSTYPE=linux-gnu

操作系统

 

HOSTTYPE=i386

硬件等级

MACHTYPE=i386-redhat-linux-gnu

硬件核心等级

read 交互模式读取键盘输入

read [-pt] variable

选项与参数:

-p :提示文字

-t :等待秒数,如果超时则退出read

如:

declare定义变量

变量默认是字符型,可以定义成数字型。

 

declare [-aixr] variable

选项与参数:

-a :定义数组

-i :定义数字(整数)

-x :类似 export将variable变成环境变量;

-r :定义只读,不能修改也不能unset

如:

sum用declare -i定义成数字以后就成了3

 

declare -x定义了环境变量b

 

declare –r定义了只读变量c,因此c=6和unset c都执行失败了。

定义成只读之后没办法恢复,只能重新登录。

 

数组的使用。中括号本来是特殊字符不能用在变量名中,但数组除外。

数学计算

数学计算在declare时可以不用加括号,如

declare –i c=5*2

在单独计算时需要用$(())的双括号方式,如:

$((5*2))

也可以用$(())来给变量赋值如:

不过bash shell中的数字都是整数,没有小数,计算符号有:

+、-、*、/、%

系统编码(字符集)

locale –a查看系统支持的字符集。

locale查看目前使用的字符集

一般设置LANG 或 LC_ALL即可,因为其他的没有设置时,默认读取这两个的字符集设置。

 

系统整体的字符集预设在/etc/sysconfig/i18n

ulimit限制使用者的系统资源

ulimit [-SHacdfltu] [配额]

选项与参数:

-H :hard limit ,严格的设定,必定不能超过这个设定的数值;

-S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息。

在设定上,通常 soft 会比 hard 小,举例来说,soft 可设定为 80 而 hard

设定为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时,

系统会有警告讯息通知你!

-a :后面不接任何选项与参数,可列出所有的限制额度;

-c :当某些程序发生错误时,系统可能会将该程序在内存中的资料写成文件(除错用),

这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。

-f :此 shell 可以建立的最大文件容量(一般可能设定为 2GB)单位为 Kbytes

-d :程序可使用的最大断裂记忆体(segment)容量;

-l :可用于锁定 (lock) 的记忆体量

-t :可使用的最大 CPU 时间 (单位为秒)

-u :单一使用者可以使用的最大程序(process)数量。

问题(todo):如何限制,限制当前登录用户还是限制所有用户?

变量内容的删除、替换

可以对变量的内容进行一些删除、替换后再使用,使之符合需要。修改后的变量本身内容不会变,只是使用的时候新增了修改后的变量。

删除

#:从前查找删除,厌恶模式

##:从前查找删除,贪婪模式

%:从后查找删除,厌恶模式

%%:从后查找删除,贪婪模式

 

#从前删除

最短模式 ${var#exp}

类似于正则的厌恶模式。

var是变量,exp是表达式,表示从前面开始删除

如:

${a#*3}

这里123456123也符合要求,但123更短,所以匹配了123

最长模式 ${var##exp}

类似于正则的贪婪模式。

echo ${a##*3}

匹配了123456123而不是123,找最长的。

%从前删除

最短模式 ${var%exp}

类似于正则的厌恶模式。

var是变量,exp是表达式,表示从前面开始删除

如:

echo ${a%4*}

这里456123456也符合要求,但456更短,所以匹配了456

最长模式 ${var%%exp}

类似于正则的贪婪模式。

echo ${a%%4*}

匹配了456123456而不是456,找最长的。

替换

替换第一个 ${var/exp1/exp2}

全部替换 ${var//exp1/exp2}

如:

echo ${a/56/ab}

echo ${a//56/ab}

条件选择

类似于三目运算符

${flag-value}

如果flag存在就返回flag,否则返回value

如:

echo ${flag-1}

第一次flag不存在,返回了1,第二次flag存在,返回了flag,5.

 

:-可以将空串也认为不存在

如:

第一次用-,空串认为存在返回了flag,空串

第二次用:-,空串认为不存在返回了1

还有很多方式,如下列表

命令别名 alias

指定别名 alias 别名='字符串'

命令别名类似于变量,用一个简短的变量名代替一个字符串,不过变量不能直接当做命令执行,别名却可以。

 

如:

alias bb='ls -ld /etc'

将ls -ld /etc指定成了别名bb,直接bb即可执行。

查看别名 alias

直接alias可以查看已有别名

 

取消别名 unalias

如:

unalias bb

历史命令 history

历史命令记录读取流程

用户登录shell时首先读取~/.bash_history放入内存,然后有操作,就更新内存,根据HISTSIZE大小决定覆盖。退出shell的时候将内存的数据覆盖回~/.bash_history,因此如果有多人使用同一个账号,则会覆盖。

-w可以在不退出的情况下把内存history写入~/.bash_history。

 

history查看的是内存的history。

history查看历史命令

格式:

history [n]

history [-c]

history [-raw] histfiles

选项与参数:

n :显示最近n条,默认全部显示

-c :清除内存的history,由于~/.bash_history只能新增,条数只能增加不能减少,因此即使-c清除以后,再退出,也不会清~/.bash_history

-a :将当前shell中新增执行的 history 指令写histfiles 中

-r :将 histfiles 的内容读到当前shell的history 内存;

-w :将目前的 history 内存写入 histfiles 中!

如果没有histfiles则默认~/.bash_history

!执行历史命令

!n执行第n条历史命令

!!执行上1条历史命令

如:

前面执行了history查看历史命令,由于太大没有截到图,!515 是执行echo a

!!执行上一条也是echo a

命令搜寻顺序

1、加路径执行指令,例如' /bin/ls '或' ./ls ';

2、由 alias 找到该指令来执行;

3、由 bash 内建的 (builtin) 指令来执行;

4、通过 $PATH 变量搜寻命令。

type –a可以查看顺序,如:

bash 的进站与欢迎信息

/etc/issue

是系统登录前显示的信息,如:

issue 内的各代码意义

\d 当前日期;
\l 显示第几个终端机介面;
\m 显示硬体的等级 (i386/i486/i586/i686...);
\n 显示主机的网路名称;
\o 显示 domain name;
\r 操作系统的版本 (相当于 uname -r)
\t 当前时间;
\s 操作系统的名称;
\v 操作系统的版本。

/etc/issue.net

telnet登录前的欢迎信息

/etc/motd

登录后的欢迎信息,如:

bash 的环境设定

bash设定的读取流程

bash的命令别名、变量等是在进入bash的时候读取设定文件决定的。

进入bash的方式分为login与non-login,login就是输入密码登录,non-login就是没有输入密码登录,如bash命令进入子程序、x-window下打开命令行终端。

 

login方式与non-login方式进入bash读取环境设定不一样。

 

login方式的流程图:

问题:/etc/profile.d/*.sh是否执行了2次。

/etc/profile

1、设置PATH、MAIL、USER、HOSTNAME、HISTSIZE环境变量的值。

2、执行/etc/inputrc设定

3、执行/etc/profile.d/*.sh

如:

/etc/inputrc

设定bash 的热键、[tab]要不要有提示声音等。

 

/etc/profile.d/*.sh

规范了 bash 操作介面的颜色、 语系、ll 与 ls 指令的命令别名、vi 的命令别名、which 的命令别名等,可以根据需要自己建立.sh的文件。

 

/etc/sysconfig/i18n

/etc/profile.d/lang.sh会读取它。

~/.bash_profile、~/.bash_login、~/.profile

这三个文件只会读取一个,按顺序查找,最先找到就使用。

1、执行 ~/.bashrc
2、设置
PATH=$PATH:$HOME/bin 

export PATH

 

~/.bashrc

1、为rm、cp、mv起别名

2、读取/etc/bashrc

 

如果~/.bashrc被删掉了,提示符可能不正常,如变成

,此时可以复制/etc/skel/.bashrc 到家目录,然后source ~/.bashrc即可

 

/etc/bashrc

1、根据UID设定umask

2、根据UID设定PS1(命令提示符)

3、读取/etc/profile.d/*.sh 的设定

 

/etc/bashrc为centos特有,其他distributions可能没有

 

non-login的shell设定读取流程是从~/.bashrc开始的

 

source读取设定

修改了设定之后,一般需要重新登录才生效,不过用source或.命令可以理解生效,如:

source ~/.bashrc

或者

. ~/.bashrc

bash的其他环境设定文件

/etc/man.config

里面最重要的就是MANPATH,设定了搜寻man page时的搜索路径。

~/.bash_history

历史命令,前面已经说了

~/.bash_logout

设定退出登录以后的操作。

stty设定按键功能

stty [-a]

选项与参数:

-a :将目前所有的 stty 参数列出来;

^是ctrl的意思

  • eof   : End of file 的意思,代表'结束输入'。
  • erase : 向后删除字符,
  • intr  : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序,对应了^C
  • kill  : 删除在目前指令列上的所有文字
  • quit  : 送出一个 quit 的讯号给目前正在 run 的程序;
  • start : 在某个程序停止后,重新启动他的 output
  • stop  : 停止目前荧幕的输出;
  • susp  : 送出一个 terminal stop 的讯号给正在 run 的程序。

    stty erase ^h

    设定ctrl h为删除键

set设置变量的相关参数

set可以直接查看所有变量,后面加选项可以设置相关参数

set [-uvCHhmBx]

选项与参数:

-u :默认不启用。若启用后,变量未设置时,会提示错误;

-v :默认不启用。若启用后,在讯息被输出前,会先显示讯息的原始内容;

-x :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号)

-h :预设启用。与历史命令有关;

-H :预设启用。与历史命令有关;

-m :预设启用。与工作管理有关;

-B :预设启用。与刮号 [] 的作用有关;

-C :预设不启用。若使用 > 等,则若档案存在时,该档案不会被覆盖。

 

$-是当前的设定。

 

设置了-u后的效果,提示错误了,而不是直接显示空白。

 

+号表示取消设定

取消-u后,提示消失了。

bash常用按键列表

通配符列表

例如:

特殊符号列表

重定向

重定向输出

重定向输出可以使显示到控制台的信息记录到其他地方(如文件),分为

标准重定向:>、>>(>是覆盖,>>是追加),记录正常显示的信息

错误重定向:2>、2>>(>是覆盖,>>是追加),记录错误显示的信息。

如:

find /home > 1.txt

标准和错误重定向可以记录到同一个文件,不过顺序会乱,需要用如下方式即可:

find /home 1 > 1.txt 2>&1

或者

find /home 1 &> 1.txt

都记录到了1.txt

重定向输入

<代替键盘输入

<表示将本来由键盘输入的内容,改为从文件中读取,如:

cat > 1.txt

这个命令会要求用户从键盘输入内容,然后按ctrl d结束输入,自动保存到文件1.txt。

如:

 

可以用<,由文件内容来代替键盘输入。

如:

cat > 1.txt < aaa.txt

等同于

cat aaa.txt > 1.txt

<<定义输入结束符

<<用于定义输入结束符,如:

cat > 1.txt << eof

只要输入了eof,就会自动结束,代替了ctrl d键,一般用于程序里面。

黑洞设备/dev/null

不用的输出资料可以重定向到/dev/null,会自动丢弃,如:

cat 1.txt 2> /dev/null

命令条件判断&&和||

命令可以通过$?返回值判断是否执行下一条命令,如:

1、

command1 && command2

command1返回成功才执行command2

2、

command1 || command2

command1返回失败才执行command2

 

以下假设command2和command3总是执行成功

3、

command1 && command2 || command3

常用式子(类似于3目运算符)

command1成功, command2执行, command3不执行

command1失败,command2不执行,command3执行

使用场景,如:

判断如果/tmp/abc,显示exists,如果不存在,显示not exists

ls /tmp/abc && echo exists || echo not exists

 

4、

command1 || command2 && command3

command1成功,command2不执行,command3执行

command1失败,command2执行,command3执行

使用场景,如:

判断如果/tmp/abc存在,则创建/tmp/abc/hello,

如果不存在,则先创建/tmp/abc再创建/tmp/abc/hello

ls /tmp/abc || mkdir /tmp/abc && mkdir /tmp/abc/hello

管道命令

管道可以将上一条命令的执行结果作为standard input传给下一条命令执行,接收者必须要能够接受 standard input 的,如 less, more, head, tail等。由于ls, cp, mv不能接受standard input,因此不能作为管道接收者。

管道命令仅会处理 standard output,对standard error output 会忽略

选取命令: cut, grep

选取命令都是基于行来分析的,对每一行进行相同的操作。

cut

cut是对文件进行纵向(列)切割,取出需要的内容

cut –d -f类似于split

如:

echo $st | cut -d ";" -f 2,4

下标从1开始

-f 2表示取第2个

-f 2,4表示取第2个和第4个,且自动加分隔符。

 

 

cut –c 类似于substring

如:

echo $a | cut -c 2-5

grep

grep是对文件进行横向(行)切割,取出需要的内容。grep只要找到关键字,就将整行显示出来。

格式:

grep [-acinv] [--color=auto] '搜寻字串' filename

选项与参数:

-a :将 binary 文件以 txt 文件方式搜索

-c :计算找到的次数

-i :忽略大小写

-n :输出行号

-v :反向选择,显示出没有 '搜寻字串' 内容的行

如:

grep -i 'Cd' test2.txt

 

cat test2.txt | grep 'cd'

排序命令: sort, wc, uniq

sort

如:

sort test2.txt

sort以行排序,输出时按排序结果交换行的位置。

sort [-fbMnrtuk] [file or stdin]

选项与参数:

-f :忽略大小写;

-b :忽略前面的空白字符;

-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;

-n :使用'纯数字'进行排序(预设是以文本型来排序的);

-r :反向排序;

-u :就是 uniq ,相同的行,只显示一行;

-t :分隔符号,预设是用 [tab] 键来分隔;

-k :以那个区间 (field) 来进行排序的意思

 

如:

默认从头开始按字母排序

 

每行以冒号分割的第三个内容排序。

uniq

如:

uniq test.txt

去重,重复的行只显示一个,不过只会去掉相邻行重复,隔行有重复还是没办法去掉,因此一般先用sort排序,再用uniq去重,类似于sort –u功能。

格式:

uniq [-ic]

选项:

-i :忽略大小写;

-c :统计个数

 

如:

last | cut -d ' ' -f1显示了最近登录用户列表,有很多重复

去重:

last | cut -d ' ' -f1 | sort –u

或者

last | cut -d ' ' -f1 | sort | uniq

如果要统计次数,则用:

wc

统计字数

选项与参数:

-l :仅列出行数;

-w :仅列出单词数;

-m :仅列出字符数;

 

如:

11 11 108依次是:行数、单词数、字符数

双向重定向: tee

tee类似于>重定向,只是重定向之后还能继续输出到standard output。

-a 是追加,不覆盖原文件,类似于>>

 

如:

显示test.txt的同时也将内容写入了t2.txt

 

字符转换命令: tr, col, join, paste, expand

tr替换、删除、去重

替换、删除、去重

选项:

-d :删除;

-s :去重

 

如:

替换

cat test.txt | tr 'ddd' 'kkk'

将ddd替换成了kkk

 

删除

cat test.txt | tr -d '789'

删除了789

 

去重

cat test.txt | tr -s 'b'

bbb变成了b

 

也可以是正则,如:

删除了0-5的数字。

col 转换特殊字符

选项与参数:

-x :tab 转换为对等个数的空格

-b :在文字内有反斜线 (/) 时,仅保留反斜线最后接的那个字符

 

-x转换tab

如:

cat –A显示特殊字符,会将tab以^方式显示。

col –x转换后tab变成了空格。

 

-b转换特殊字符

man的结果存入文件时会显示一些特殊字符,可以用-b过滤掉,如:

col 经常被利用于将 man page 转存为纯文本以方便查阅的功能

join 合并

处理两个文件时使用,将具有相同关键字的行合并,

选项与参数:

-t :join 默认用空格分隔,并且比对'第一个栏位'的资料,

如果两个档案相同,则将两笔资料联成一行,且第一个栏位放在第一个!

-i :忽略大小写;

-1 :这个是数字的 1 ,代表'第一个文件要用哪个栏位来分析'的意思;

-2 :代表'第二个文件要用哪个栏位来分析'的意思。

 

 

如:

join -t ':' /etc/passwd /etc/shadow

 

 

paste合并

直接合并,不比对

选项与参数:

-d :接分隔字符。默认是[tab]

- :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。

如:

paste /etc/passwd /etc/shadow

expand 将tab转成空白

将tab转换成空白

选项与参数:

-t :后面可以接数字。表示一个tab键代表多少个空格。

 

如:

tab是^I,用expand被转换成了空格

split 分割文件

split [-bl] file PREFIX

选项与参数:

-b :分隔成的文件的大小,单位是b, k, m 等;

-l :以行数来进行分割。

PREFIX :分隔成的文件的前缀。

如:

 

-b 按大小分割

split -b 300k /tmp/test.txt /tmp/test

将test.txt分隔成了300k一个的小文件。前缀都是test。

 

合并文件

合并成了test333.txt

 

-l 按行分割

ls -al / | split -l 5 - kkkkkk

最后那个-是stdardin的意思

xargs 参数代换

将前面命令的执行结果作为后面命令的参数,可以用于不支持接受stdin的命令如ls、finger等。

选项与参数:

-0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空白键等等字符时,这个 -0 参数

可以将他还原成一般字符。这个参数可以用于特殊状态喔!

-e :这个是 EOF (end of file) 的意思。后面可以接一个字串,当 xargs 分析到

这个字串时,就会停止继续工作!

-p :在执行每个指令的 argument 时,都会询问使用者的意思;

-n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。看范例三。

当 xargs 后面没有接任何的指令时,预设是以 echo 来进行输出喔!

 

概念

如:

finger是查看用户的指令,参数是用户名,如:

 

cut -d':' -f1 /etc/passwd |head -n 3

可以取得所有用户名

 

然后可以用xargs动态指定finger的参数

cut -d':' -f1 /etc/passwd |head -n 3| xargs finger

 

询问-p

cut -d':' -f1 /etc/passwd |head -n 3| xargs -p finger

执行前先将有参数合成的命令finger root bin daemon列出来询问是否执行。

结束-e

-e表示遇到哪个参数就停止解析,且当前参数也不解析,如:

cut -d':' -f1 /etc/passwd |head -n 3| xargs -p -e'daemon' finger

所有参数是root、bin、daemon

由于指定了遇到daemon就停止解析,因此只解析了root、bin2个。

正则表达式

与java的正则表达式类似,linux的正则也是用表达式匹配字符串,字符集会对匹配产生一些影响,如:

LANG=C时:0 1 2 3 4 ... A B C D ... Z a b c d ...z

LANG=zh_TW时:0 1 2 3 4 ... a A b B c C d D ... z Z

zh_TW时[a-z]就包含了大写的B到Y

一般不用zh_TW

 

grep是基础正则表达式,功能有限,egrep是扩展正则表达式,功能强大很多,如支持?、+、|、()+等。

字符的匹配

表示一个字符

[:alnum:]

英文大小写字符及数字,亦即 0-9, A-Z, a-z

[:alpha:]

任何英文大小写字符,亦即 A-Z, a-z

[:blank:]

空格与 [Tab]

[:cntrl:]

控制键,包括 CTRL, LF, Tab, Del.. 等等

[:digit:]

数字,即 0-9

[:graph:]

除了空白字符 (空格与 [Tab]) 外的其他所有按键

[:lower:]

小写字符,即 a-z

[:print:]

任何可以被打印出来的字符

[:punct:]

标点符号 (punctuation symbol),即:" ' ? ! ; : # $...

[:upper:]

大写字符,即 A-Z

[:space:]

任何会产生空白的字符,包括空格键, [Tab], CR 等等

[:xdigit:]

代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符

[b-f]

b到f中的任意一个

[^a-z]

并非小写字母

[0-9]

数字0到9

[^[:lower:]]

并非小写字母

.

任意字符

[a-zA-Z123]

所有字母和123

|或者关系 (egrep才支持)

如:

egrep '^a|d$' aaa.txt

以a开头或者以d结尾的

()群组匹配

如:

egrep '3(45|aa)67' aaa.txt

匹配34567或者3aa67

 

echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'

(xyz)+表示匹配一个或多个xyz

出现次数的匹配

? 零次或一次,egrep才支持

* ,零次或多次

+ ,一次或多次,egrep才支持

{n} ,恰好 n 次

{n,} ,至少 n 次

{n,m} ,至少 n 次,但是不超过 m 次

 

注意:大括号需要转义。

如:

grep -n 'o\{2\}' regular_express.txt

找出了恰好出现两个o的行(第19行随便找2个o都能满足条件,因此符合)。

 

grep -n 'go\{2,\}g' regular_express.txt

找出了两个g之间出现两个或以上o的行。

 

grep进阶选项

grep [-A] [-B] [--color=auto] '搜寻字串' filename

选项与参数:

-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;

-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来;

--color=auto 可将正确的那个选取资料列出颜色

如:

grep -n -A 20 -B 20 '[[a-z]' regular_express.txt

 

行首^行尾$

如:

grep -n '^t' regular_express.txt

找出以t开头的行

 

rep -n '^$' regular_express.txt

找出空行

 

注意:^在中括号里面是并非,在中括号外面是行首的意思上。

sed工具

sed命令可以对一段文本进行操作,如删除指定行、在行首行尾加特定字符等。

 

格式:

sed [-nefr] [动作]

选项与参数:

-n :使用安静(silent)模式。只有经过sed处理的行才打印出来(默认全部打印)。

-e :直接在指令列模式上进行 sed 的动作编辑;

-f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;

-r :sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)

-i :直接修改文件内容,而不是打印出来。

 

动作说明: [n1[,n2]]function

n1, n2 :多少行到多少行,如'5,8a aaa',第5到8行新增aaa

$:最后一行,如:'$a aaa',最后1行新增aaa

正则:正则匹配的行,如'/.*kkk.*/a aaa',含有kkk字符串的行新增aaa

 

function 有底下这些咚咚:

a :下一行插入

c :替换行

d :删除行

i :上一行插入;

p :打印。通常 跟-n 一起使用

s :替换行里的某些字符串,支持正则表达式。

 

sed删除行(d)

nl是显示行号方式查看,这里用sed删除了2-5行

 

nl /etc/passwd | sed '/.*sbin.*/d'

删除含有sbin字符串的行,这里用正则查找行"/.*sbin.*/",即"/正则/".

sed '/^$/d'

删除空行

sed行尾增加行(a)

nl /etc/passwd | sed '2,3a drink tea'

a是在行尾增加行,这里2、3两行每行后面增加了drink tea

sed行首增加行(i)

nl /etc/passwd | sed '2,3a drink tea'

i是在行尾增加行,这里2-4行每行前面增加了kkkkkk

 

 

可以增加多行,用\[Enter]即可,如:

nl /etc/passwd | sed '2a drink tea\

or bear'


sed替换行(c)

如:

nl /etc/passwd | sed '2,5c hello'

将第2-5行替换成了hello

 

sed只显示指定行(-n p)

nl /etc/passwd | sed -n '5,7p'

只显示了5-7行,由于默认全部显示,加-n表示只显示经过sed过滤的,而p就是直接打印显示,所以只打印了5-7行。

如:

sed替换字符串

格式是:
sed 's/旧串/新串/g'

如:

echo $a | sed 's/^.*5/a/g'

这里^.*5正则表示从开头到5的字符串,这里也就是12345,被替换成了a

也可替换成空,如:

echo $a | sed 's/^.*5//g'

sed修改文件(-i)

sed默认是打印结果到屏幕,而原文件内容不会改变,如:

sed 's/56/jj/g' aaa.txt

打印结果中56被替换成了jj,而原文件内容没有变化。

 

加入-i可以修改文件,而不打印结果,如:

printf打印

printf按照格式打印,如:

printf '%s%s\n' $(cat aaa.txt)

%s表示字符串方式,printf会自动把aaa.txt文件中的空白符或者换行符作为aplit的分隔符,将文件内容分隔成多个字符串,然后按照格式模板一个个填充进去打印出来。

 

格式:

printf '列印格式' 实际内容

选项与参数:

关于格式方面的几个特殊样式:

\a 警告声

\b backspace

\f 清除荧幕 (form feed)

\n 换行

\r Enter

\t 水平的 [tab] 按键

\v 垂直的 [tab] 按键

\xNN NN 为两位数的数字,可以转换数字成为字元。

关于 C 程式语言内,常见的变数格式

%ns 那个 n 是数字, s 代表 string ,亦即多少个字元;

%ni 那个 n 是数字, i 代表 integer ,亦即多少整数位数;

%N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数位数,

假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!

awk工具

sed是对整行处理,awk是对每一行按照关键字split成一个个栏位,然后对每个栏位进行处理。

格式:

awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

默认的'栏位的分隔符号为 "空白键" 或 "[tab]键"

如:

last -n 5 | awk '{print $1"aaa"$2}'

last –n 5是显示最近登录的5个用户

last -n 5 | awk '{print $1"aaa"$2}'表示对显示结果进行print打印,$1"aaa"$2是打印的内容,$1是第1栏,$2是第2栏,对每一行都做同样处理。$0代表所有栏位(整行)

里面的所有普通字符串都必须用双引号引起来,如"aaa"

行号NR、栏位数NF、分隔符FS

如:

last -n 5 | awk '{FS=" "} {print $2}'

awk条件判断

支持>、<、>=、<=、==、!=

如:

cat /etc/passwd | awk '{FS=":"} $3<5 {print $0}'

打印了第3栏小于5的行,$0表示整行

awk的计算功能

如:

cat /etc/passwd | awk '{FS=":"}{total=$3+$4

print $1":"total}'

cat /etc/passwd | awk '{FS=":"}{total=$3+$4;print $1":"total}'

$3+$4可以表示第3栏和第4栏求和。

多个指令用回车或分号分隔,如total=$3+$4后面有个回车。

里面的变量不需要加$符号

但第1行的root没有,因为读入第1行时,$1、$2、$3、$4这些栏位还没有赋值,从第2行才开始生效,解决这样问题可以加入BEGIN,这样:

cat /etc/passwd | awk 'BEGIN {FS=":"}{total=$3+$4

print $1":"total}'

diff、cmp文件对比工具

如:
diff以行为单位进行比较
diff passwd.old passwd.new

 

选项

-b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about me" 视为相同

-B :忽略空白行的差异。

-i :忽略大小写的不同。

 

 

cmp以二进制进行比较

如:

选项与参数:

-s :列出所有差异,默认只列出第1个差异。

shell脚本

把多条指令做成批处理文件就是shell脚本。

注释是#号。

如:

 

aaa.txt内容为:

执行后:

 

 

shell脚本扩展名一般为.sh,容易分辨。

 

 

程序执行方式:

  • 直接指令下达:
    • 绝对路径:使用 /home/dmtsai/shell.sh 来下达指令;
    • 相对路径:假设工作目录在 /home/dmtsai/ ,则使用 ./shell.sh 来执行
    • 变量'PATH'功能:将 shell.sh 放在 PATH 指定的目录内,例如: ~/bin/

     

  • 以 bash 程序来执行:通过' bash shell.sh '或' sh shell.sh '来执行

 

脚本的格式

1、#!/bin/bash表示该脚本使用的shell。

2、

# Program:

# This program shows "Hello World!" in your screen.

# History:

# 2005/08/23    VBird    First release

程序的说明

 

3PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

设定环境变量。

 

4
echo -e "Hello World! \a \n"

程序主体

5、

exit 0

返回值为0,表示成功,非0表示失败,也就是$?的值

脚本举例

实现一个脚本,输入用户名,自动创建3个文件,名称分别为"输入的名字_当前年月日"、 "输入的名字_昨天年月日"、 "输入的名字_前天年月日"

b.sh文件内容:

echo "create files"

#输入用户名

read -p "input your name:" fname

#校验用户名如果为空,则默认为"filename"

fname=${fname:-"filename"}

 

#创建3个日期,今天、昨天、前天,如20160506

date1=$(date +%Y%m%d)

date2=$(date --date "1 days ago" +%Y%m%d)

date3=$(date --date "2 days ago" +%Y%m%d)

 

#拼装3个文件名,如kkk_20160506

fname1=${fname}_${date1}

fname2=${fname}_${date2}

fname3=${fname}_${date3}

 

#创建3个文件

touch ${fname1}

touch ${fname2}

touch ${fname3}

source和.执行

bash和路径方式执行脚本会新开一个bash子程序,因此在子程序里定义的变量在父程序就取不到。而source或者.执行的脚本是在原程序中执行。

如:

source c.sh

或者

. c.sh

用source c.sh执行后,变量a才在当前程序被赋值了。

test和[]判断变量

判断时,变量和常量如果是字符串,最好都用双引号引起来,如用"$kk",而不要用$kk或${kk},否则很容易产生不准确的问题

 

关于档案名

-e:    档案是否存在,如test -e "/root"

-f:    档案是否是文件,如:test -f "/root"

-d:    档案是否是文件,如:test -d "/root"

-b:    是否是block device装置(块设备)

-c:    是否是字符设备

-S:    是否是Socket设备

-p:    是否是FIFO设备

-L:    是否是链接文件

 

关于权限

-r:    是否可读

-w:    是否可写

-x:    是否可执行

-u:    是否有SUID属性

-g:    是否有SGID属性

-k:    是否有SBIT属性

-s:    是否是非空白文件,如test -s "aaa",只有当aaa是文件,且没有任何内容,才返回真。aaa如果是目录,返回假。

 

关于两个档案的比较

-nt:    第1个文件是否比第2个新,如test "file1" -nt "file2"

-ot:    第1个文件是否比第2个旧,如test "file1" -ot "file2"

-ef:    两个文件是否为同一文件,即是否指向同一个inode,相当于判断hardlink

 

关于两个整数的比较

-eq:    两数值相等,如test $n1 -eq $n2

-ne:    两数值不相等

-gt:n1大于n2

-lt:n1小于n2

-ge:    n1大于等于n2

-le:     n1小于等于n2

 

判定字符串(选项两边必须有空格,如=、!=等)

-z:    判定变量不存在或者为空串,如test -z $kk

-n:    是否非空串,与-z相反

=或==:    两个字符串是否相等,=和==两边必须有空格,因为它是一个选项,如:

用"$a" = "$b",而不要用"$a"="$b"

!=:    两个字符串不相等

 

多重条件判定

-a and条件

-o or条件

! not 条件

如:

test -r "bbb.txt" -a -w "bbb.txt" && echo y || echo n

对bbb.txt同时具有读和写权限时打印y,否则打印n

例子

输入一个档案名,判断是否存在、类型、打印权限。

 

#输入文件名

read -p "input file name:" filename

 

#判断文件存在

test ! -e "$filename" && echo "file not exists" && exit 0

 

#判断文件类型

test -f "$filename" && echo "Its a file"

test -d "$filename" && echo "Its a Directory"

 

#判断权限

perm=""

test -r "$filename" && perm="readable"

test -w "$filename" && perm=""$perm" writable"

test -x "$filename" && perm=""$perm" executable"

echo perm="$perm"

[]判断

[]和test判断完全一样,只是将test后面的判断式放到了[]中。

注意:[]的里面的所有变量或常量两边都必须加空格。

表示如下:

"□"表示空白字符

 

如:

[ "$kk" == "abc" ] && echo y || echo n

等价于

test "$kk" == "abc" && echo y || echo n

 

例子:

用户输入Y或y提示OK, continue

用户输入N或n提示Oh, interrupt

否则,提示I don't know what your choice is

 

read -p "input Y or N:" str

[ "$str" == "Y" -o "$str" == "y" ] && echo "OK, continue " && exit 0

[ "$str" == "N" -o "$str" == "n" ] && echo "Oh, interrupt " && exit 0

echo " I don't know what your choice is "

exit 0

脚本的参数

获取参数

脚本可以获取参数,$0表示脚本命令,$1开始就是后面的参数

$#:参数个数

$*:代表所有参数,以分隔符分隔,如:"$1c$2c$3c$4",其中c是分隔符,默认是空白字符(一个或多个空格、tab、\enter换行等都视为一个分隔符)

如:

shift偏移参数

shift可以使所有参数位置整体往前移动,最前面的自动去掉。

如:

shift 3表示移动3位,默认1位

if条件判断

格式

if [ 条件判断式一 ]; then

    语句;

elif [ 条件判断式二 ]; then

    语句;

else

    语句;

fi

其中elif和else及其语句可以没有。

 

如:

 

read -p "input Y or N:" yn

if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then

echo "OK"

exit 0

elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then

echo "cancel"

exit 0

else

echo "error"

exit 0

fi

其中

1、

[ "$yn" == "Y" ] || [ "$yn" == "y" ]

等价于

[ "$yn" == "Y" -o "$yn" == "y" ]

 

2、

if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then

等价于

if test "$yn" == "Y" -o "$yn" == "y" ; then

 

例子

输入一个日期,判断该日期与当前日期相差的天数

 

read -p "input date:" enddate

#验证输入的是8个数字

testing=$(echo "$enddate" | grep "[0-9]\{8\}")

if [ "$testing" == "" ];then

echo "wrong number"

exit 0

fi

 

#输入的日期转化为秒数

declare -i enddate_n=$(date --date="$enddate" +%s)

#当前日期转化为秒数

declare -i nowdate_n=$(date +%s)

#计算秒数之差

declare -i total_date_n=$(($enddate_n-$nowdate_n))

#换算成天数

declare -i days=$((total_date_n/24/60/60))

#打印天数,正数或负数都有可能

echo days="$days"

case语句

格式

类似于java的case,只不过每个case执行后,不会自动执行默认的default,而是直接退出。

格式:

 

case $变量名称 in

"第一个变数内容")

    语句

    ;; <==每个类别结尾使用两个连续的分号来处理!

"第二个变数内容")

    语句

    ;;

*) <==最后一个用 * 来代表default

    语句

    ;;

esac

例子

根据命令参数不同,提示不同信息,$1是第1个命令参数。

case $1 in

"hello")

echo "Its hello";;

 

"")

echo "empty";;

 

*)

echo only hello;;

esac

function函数

定义

如:

function show() {

echo -n "your arg is:"

}

show;

echo $1

 

echo –n选项可以让后面的不换行显示。

function关键字可以没有

 

函数的参数,返回值

如:

show() {

echo \$1=$1

echo \$2=$2

return 5

}

show 1 2

a=$?

echo a=$a

返回值只能用$?接收。$1表示第1个参数,以此类推。

返回值只能是整数,如果是字符串会报错。

如果没有return语句默认返回0,执行失败返回1

循环

while do done循环

while [ condition ]

do

    程式段落

done

如:

while [ "$yn" != "yes" -a "$yn" != "no" ]

do

read -p "yes or no:" yn

done

echo your input is"$yn"

exit 0

 

[ "$yn" != "yes" -a "$yn" != "no" ] 等价于[ "$yn" != "yes" ] && [ "$yn" != "no" ]

 

例子:计算1~100的和

declare -i sum=0

declare -i a=0

while [ $a -le 100 ]

do

sum=$sum+$a

a=$a+1

done

 

echo sum="$sum"

exit 0

until do done循环

如:

until [ "$yn" == "yes" -o "$yn" == "no" ]

do

read -p "yes or no:" yn

done

echo your input is"$yn"

exit 0

[ "$yn" == "yes" -o "$yn" == "no" ]等价于[ "$yn" == "yes" ] || [ "$yn" == "no" ]

for in循环

如:

for a in aaa bbb ccc

do

echo $a

done

 

例子:

查询所有用户的识别码:

for account in $(cat /etc/passwd | cut -d ":" -f 1)

 

do

echo account=$account

id $account

done

其中$(cat /etc/passwd | cut -d ":" -f 1)查询出所有的用户账号

id $account是查询用户的识别码

 

例子:用户输入一个目录,自动遍历该目录下的文件,列出每个文件读、写、执行权限

read -p "input a directory:" dir

 

#判断目录是否存在

if [ ! -d "$dir" ];then

echo oh, "$dir" is not a directory

exit 1

fi

 

#ls查询目录下面的文件

for file in $(ls $dir)

do

#判断权限

perm=""

if [ -r "$dir"/"$file" ];then

perm="readable "

fi

 

if [ -w "$dir"/"$file" ];then

perm="$perm""writable "

fi

 

if [ -x "$dir"/"$file" ];then

perm="$perm""excutable "

fi

echo "$dir"/"$file": $perm

done

序列

$(seq 起始值 结束值)

可以定义序列。

如计算1到100的和可以这样:

declare -i sum=0

for a in $(seq 1 100)

do

sum=$sum+$a

done

 

echo sum="$sum"

for((;;))

有两个括号,且里面语法类似于java,可以有i++等。

如:

declare -i sum=0

for((i=0;i<=100;i++)){

sum=$sum+$i

}

echo $sum

debug脚本

sh [-nvx] scripts.sh

选项与参数:

-n :不要执行 script,仅查询语法的问题;

-v :再执行 sccript 前,先将 scripts 的内容输出到荧幕上;

-x :将使用到的 script 内容显示到荧幕上,这是很有用的参数!

 

一般用-n和-x

如:

-n检查语法,如果没问题不会输出任何东西。

-x中带有+号的都是原语句。

账号的管理

用户和组除了名称外,都有一个id,分别是UID和GID。

/etc/passwd说明

/etc/passwd里的结构为:

第1列:账号名称,root

第2列:密码,由于新的机制记录密码都放到了/etc/shadow中,因此这里用x表示,x

第3列:UID,0.

第4列:GID,0.

第5列:账号说明,root

第6列:用户主目录,/root

第7列:shell,/bin/bash

 

UID:

UID为0时表示系统管理员,具有最高权限,其他账号如果UID为0,也会认为是系统管理员。

UID最大为2^32-1,因此加上0,一共可以有2^32个用户。

1-499:系统保留,1~99:由 distributions 自行建立的系统帐号;100~499:若使用者有系统帐号需求时,可以使用的帐号 UID。

500以上:给用户使用

/etc/shadow说明

一共9列:

第1列:用户名,root

第2列:密码,

$6$X3sOu9JHdAKYIM0r$Wr/Nxl3.hrsRX7x0p26qAMrUcOBiyyR6dh5hoG7eQNhCa39DLUbkxYuooOUWEt.7pjKS7C/ZkYeg13rja6./d1

第3列:最近修改密码的日期,16910

第4列:密码不可被更改的天数:(与第3列位相比)

第5列:密码需要重新变更的天数:(与第 3 栏位相比)

第6列:密码需要变更期限前的警告天数:(与第 5 栏位相比)

第7列:密码过期后的帐号宽限时间(密码失效日):(与第 5 栏位相比)

第8列:帐号失效日期

第9列:保留

/etc/group说明

第1列:group名称

第2列:密码,x代替

第3列:GID

第4列:加入该群组的用户,多个以逗号分隔

有效群组概念

在/etc/passwd中用户也有GID对应群组,那个群组加上这里的群组,就是一个用户的全部群组。

使用groups可以查看用户加入的群组。

第一个群组叫做有效群组,默认登录时的有效群组是/etc/passwd中GID那个(也叫初始群组)。有效群组对文件权限无影响,只要用户拥有该群组即可。

有效群组影响的是用户新建文件时,文件的所属组是当前的有效群组

 

有效群组的切换newgrp

如:

切换成users以后,新建文件的默认群组变成了users。

注意newgrp会新启动一个shell。

/etc/gshadow说明

类似于/etc/shadow,/etc/gshadow主要用于存储群组的密码,共群组管理员使用的。

第1列:群组名

第2列:密码

第3列:群组管理员的帐号

第4列:加入该群组的用户列表,以逗号分隔

 

关联关系

1、用户登录时通过登录名找到/etc/passwd,和/etc/group,比对密码

2、文件或目录的拥有者和群组存的是UID和GID,只是显示的时候到/etc/passwd和/etc/group中找到对应的名称显示出来,如果找不到,则直接显示数字。

如:

第二次中,将kkk的UID改了,就找不到了,直接显示数字500.

创建账号useradd

如:

useradd k3

默认情况下会自动创建/home/k3目录,权限是700,同时在/etc/passwd、/etc/shadow、/etc/group里增加k3的记录。/etc/group里面增加的是与账号名相同的群组

参数说明:

[root@www ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\

> [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者帐号名

选项与参数:

-u :指定UID;

-g :指定初始群组,该群组的 GID 在 /etc/passwd 的第四列。

-G :后面接的群组名称则是这个帐号还可以加入的群组。

这个选项与参数会修改 /etc/group 内的相关资料

-M :强制!不要建立使用者家目录!(系统帐号预设值)

-m :强制!要建立使用者家目录!(一般帐号预设值)

-c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设定的啦~

-d :指定某个目录成为家目录,而不要使用预设值。务必使用绝对路径!

-r :建立一个系统的帐号,这个帐号的 UID 会有限制 (参考 /etc/login.defs)

-s :后面接一个 shell ,若没有指定则预设是 /bin/bash 的啦~

-e :后面接一个日期,格式为'YYYY-MM-DD'此项目可写入 shadow 第八栏位,

亦即帐号失效日的设定项目啰;

-f :后面接 shadow 的第七栏位项目,指定密码是否会失效。0为立刻失效,

-1 为永远不失效(密码只会过期而强制于登入时重新设定而已。)

如:

useradd -g users -u 900 k4

设定UID为900,初始群组为users(users的GID为100),此时/etc/group就没有新增群组了

 

useradd -r k5

 

使用-r创建的用户表示系统用户,UID小于500,并且/home下不会自动创建主目录

程序和进程

概念

程序一般是一个二进制文件,执行一个程序或指令就可以产生一个进程。

每个进程都有一个进程id也叫PID(ProcessID),有一组对应的权限(User/Group)。

每个用户登录的时候就会执行/bin/bash这个程序,同时赋予不同的权限(User、Group)

常驻内存的进程一般是后台服务。

 

子进程

进程里面执行程序可产生一个子进程,父进程ID用PPID表示。

如:bash里面再执行bash,(ps –l 可以查看进程)

里面的3130是父进程ID

有时候一个有问题的进程杀掉了又出来一个新的,则可能是父进程自动创建的子进程,此时需要把父进程杀掉才行。

fork-and-exec(未测试)

产生子进程时,会先复制一个父进程(叫做中间暂存进程),然后再产生子进程。

Linux的多人多工

Linux可以让多个用户同时登录工作,通过cpu切换分时。有7个登录终端,配置信息在/etc/inittab

一个单bash界面下也可以同时进行多个任务(即下面一节的工作),如:

cp test.txt test2.txt &

其中cp test.txt test2.txt &表示将此命令放到后台执行。

[1] 3190是后台的进程号3190

执行完后下一次命令后面会显示结果

[1]+ Done cp -i test.txt test2.txt

工作管理

一个bash中可以同时进行多个工作(如同时执行多条命令),只需要把命令放到后台执行即可,

后台工作可以是运行状态或者暂停状态。

后台运行状态的工作不能被ctrl c终止,可以使用bg/fg等呼叫。

后台运行中工作不能与用户进行交互,如vim在后台就不能是运行状态。

使用&将工作放入后台运行

如:

tar -zpcf /tmp/etc.tar.gz /etc &

[1]里面的1是工作号,每个bash的工作号是独立的,2105是后台进程号。

 

如果工作执行时会输出控制台信息,则即使用&放入后台执行也会输出到前台,导致无法输入命令,此时需要用>重定向让输入内容到其他地方,如:

tar -zpcvf /tmp/etc.tar.gz /etc > /dev/null 2>&1 &

由于加了-v选项,会输出打包的信息,将其重定向到黑洞设备/dev/null前台就没有输出了。

ctrl + z将工作放入后台暂停

如:

  1. vim编辑文件的命令模式下按ctrl+z,可以将它放入后台暂停

2、如find / -print执行过程中按ctrl+z可以将它放入后台暂停

jobs查看工作

前面的+号表示最近一个工作,-号表示倒数第二个工作。

-l :显示线程pid;

-r :只显示运行的工作;

-s :只显示暂停的工作。

fg取出工作

fg后接工作号即可,如:

fg 1

fg 2

fg +

fg -

fg

fg %2

其中fg +表示取出最近的一个工作号(即有+的哪一个),fg -同理是取倒数第二个

fg 1和fg %1含义一样,有没有百分号都行。

fg默认取最近的一个。

如:

此时会取出工作号为2的那一个

 

bg让后台工作运行

bg可使暂停的工作变成运行,如:

bg 2

这里执行find / -perm +7000 > /tmp/text.txt

然后立即按ctrl z让工作到后台暂停,然后bg2。

指令自动变成了find / -perm +7000 > /tmp/text.txt &,多了&符号表示到后台运行

kill发送信号

kill –l 查看可用命令

 

kill –数字 %工作号或pid

-1 :重新加载(类似 reload);

-2 :发送 [ctrl]-c;

-9 :强制结束;

-15:正常结束。

有%号是工作号,否则是进程pid

如:

kill -9 %1

强制结束工作1

kill -9 5566

强制结束pid为5566的进程

被kill的工作状态会变成"已杀死",过一会才会消失。

也可以用信号的英文,如:

kill -SIGKILL %1与kill -9 %1效果一样

离线工作

后台工作在客户端断开连接之后会会自动被删除。可以用nohup指令使离线或登出系统后,还能够让工作继续进行。

如:

nohup ./sleep500.sh &

 

查看进程ps、top、pstree

静态查看ps

ps查看一个时间的进程情况

ps –l查看自己bash的进程

各列含义:

F

Flag,进程标识,也就是权限,4表示root权限,1表示仅用于复制(fork)而没有实际执行。

S

Statues,状态,例如:

R:Running运行

S:Sleep,睡眠,可唤醒

D:睡眠,不可唤醒,例如等待IO(如打印)

T:停止

Z:Zombie,僵尸状态,程序已停止但无法被删除,通常是init的子进程,一般只有重启才能杀掉。

UID/PID/PPID

分别代表进程的所有者的UID,进程的PID,进程的父ID

C

cpu使用率,单位是百分比

PRI/NI

Priority/Nice 的缩写,该进程被 CPU执行的优先级,越小越优先。

ADDR/SZ/WCHAN

与内存有关

ADDR代表进程的内存地址,Running的进程一般显示"-"

SZ:进程用掉的内存

WCHAN:进程是否运行中,运行中则为"-"

TTY

终端机号

TIME

花费CPU的实际时间

CMD

对应的命令

 

bash进程状态为S(睡眠)的原因是它触发了ps进程。

ps aux查看所有进程

默认按PID排序

各列含义:

USER

用户

PID

进程id

%CPU

占用CPU

%MEM

占用内存

VSZ

占用虚拟内存

RSS

占用固定内存

TTY

终端机号,远程的则是问号

STAT

状态,含义同ps –l的S列含义相同

START

进程开始的时间

TIME

进程使用的实际时间

COMMAND

对应的命令

 

查找进程常用命令,如:查找与cron和syslog相关的进程

ps aux | grep '(cron|syslog)'

ps –lA查看所有进程(ps –l的列)

ps –lA显示的列与ps-l相同,只是显示所有用户的进程

ps axjf查看进程树

可以看出远程连接主机执行的命令都是通过sshd的子进程

动态查看top

默认5秒刷新一次,-d设置间隔时间,如

top –d 2

2秒刷新一次

各列含义

上半部分

第一行:

系统当前时间,开机到现在经过的时长。平均负载,含义是过去1, 5, 15 分钟,系统平均要负责运行几个程序。

 

第二行:总程数、running进程数、sleeping进程数、stopped进程数、zombie进程数

 

第三行: cpu占用情况,如果是多核设备,可以按数字1来回切换显示明细或者显示总体。

us:非核心层占用 CPU百分比

sy:核心层所占用 CPU百分比

id:idle,闲置百分比

wa:等待 I/O 所耗费的 CPU百分比

st:被虚拟机器 (virtual machine) 所盗用的 CPU百分比

如40核的CPU切换前后效果:

切换显示前:

按1切换显示后:

 

第四行:物理内存使用情况

 

第五行:虚拟内存(交换内存)使用情况

 

第六行:当前界面输入指令显示的地方

如:

 

下半部分

PID :进程id

USER:进程所有者

PR :Priority 优先级,越小越优先;

NI :Nice优先级,越小越优先;

VIRE:程序使用的最大内存,如java对应-Xmx配置

RES:程序使用的实际内存,如java实际使用的内存。

%CPU:CPU 使用率;

%MEM:内存使用率;

TIME+:实际使用CPU时间;

 

内存使用主要看RES

 

排序显示

默认按CPU使用率排序,按M按内存排序,按P按CPU排序(注意是大写)

离开按q或者ctrl c

 

批次查看重定向top -b -n 2

-b 以批次方式显示,通常与重定向一起用

-n 表示显示的次数,通常与-b一起用

如:

该命令会执行10秒,因为默认5秒1次,执行2次,然后将内容存入log.txt中。

查看指定进程-p

如:

top -p 2513

用于要查看的进程排后面不好找的情况。

修改进程优先级(修改nice值)

top时,记录下需要修改进程的pid号

然后按:r,然后输入pid号,如:2513

输入新的nice值,如3,回车

然后更新nice成功

pstree查看进程树

 

选项:

-A:以ascII编码显示

-U:以unicode编码显示

-u:显示用户,当前用户的不会显示

-p:显示进程pid

如:

pstree –up

 

管理进程

kill pid

前面已经说了

killall signal 命令名

如:

killall -9 http

killall -9 bash

执行了killall -9 bash后就自动退出登录了。

进程优先级

ps -l查看进程的PRI和NI列即是即优先级,越小优先级越高。一般是PRI+NI决定最终优先级,单不是普通的数字相加,系统还会根据情况做一些调整。PRI是系统指定的不能修改,NI可以修改。

root可以修改任何人的进程的NI值,范围是-20-19

一般用户只能修改自己的进程的NI值,范围是0-19,且只能改大,不能改小。

 

nice新执行命令指定进程优先级

如:

nice -n -5 vim &

renice调整已存在进程的优先级

如:

renice -5 26020

子进程ps的优先级也跟着变了

 

查看系统资源

查看内存使用free

Mem是物理内存使用情况

Swap是虚拟内存使用情况

total总数、used已使用、free剩余、buffers缓冲区、cached缓存

linux会将常用文件等都放入内存缓冲区,提高读写速度,因此,used经常会很高,是正常现象

 

-/+ buffers/cache前面一个是used-buffers-cached=228112,是程序实际使用的内存。

后一个是free+buffers+cached=784240也就是实际可以被使用的内存。

 

Swap的used不能太过,超过20%系统性能会急剧下降,因为它都是磁盘io操作。

 

选项

-t 显示Mem与Swap的和。

大小单位,

-b byte

-m mb

-k kb

-g gb

 

如:

查看系统信息uname

如:

uname –a

系统核心名为Linux、主机localhost.localdomain、核心版本2.6.32-431.el6.x86_64、该核心版本建立日期Fri Nov 22 03:15:09 UTC 2013、该核心版本适用硬件平台x86_64 x86_64 x86_64 GNU/Linux

查看启动时间与工作负载uptime

如:

uptime

就是top的最上面那一行。

查看通信状态netstat

分为外部连接与内部连接两部分

Active Internet connections是外部连接,对外的连接。

各列含义:

Proto:协议,如tcp

Recv-Q:接收队列

Send-Q:发送队列

Local Address:本机在外网的地址

Foreign Address:连接本机的机器ip

State:连接状态,如ESTABLISHED

 

Active UNIX domain sockets是内部连接,主要是内部socket之间的通信

各列含义:

Proto:协议,一般都是unix

RefCnt:连接到此 socket 的进程数量

Type :socket 存取的类型。主要有需要确认连接的 STREAM 与不需要确认的 DGRAM 两种;

State:状态,如CONNECTED

Path: 连接到此 socket 的相关程序的路径

 

 

选项:

-l

只显示LISTEN的进程,默认是不显示LISTEN的(一般用于找网络后门),如:

ESTABLISHED也没有显示

 

-t

只显示tcp协议的进程,默认是显示所有的,如:

 

-n

以ip+端口替代进程名的显示,如:

 

-p

显示pid号

综合示例,如:

只显示了LISTEN的进程,并且只显示tcp协议的,显示pid号,以ip+端口替代进程名。

 

查看硬件检测的信息dmesg

dmesg可以查看系统开机检测硬件的信息,内容比较多,一般用dmesg | more浏览

如:

动态查看系统资源变化vmstat

如:

vmstat 2

每隔2秒刷新1次,无限刷新。

 

每隔1秒刷新1次,一共刷新3次

 

各列含义:

procs:

r:等待中的进程数量

b:不可被唤醒的进程数量

这两个越多代表系统越忙碌

 

memory:

swpd:已使用的虚拟内存

free:空闲内存

buff: 缓冲区使用内存大小

cache:缓存使用内存大小

buff与cache都可以看做free

 

swap:

si:交换区写入

so交换区读取

这两个越大代表交换区使用大,物理内存可能不足

 

io:

bi:磁盘写入

bo:磁盘读取

这两个越大代表磁盘io越大。

 

system:

in:每秒被中断的程序次数;

cs:每秒钟进行的事件切换次数;

这两个数值越大,代表系统与周边设备的沟通非常频繁,周边设备如磁碟等。

 

cpu:

us:非核心层占用 CPU百分比

sy:核心层所占用 CPU百分比

id:idle,闲置百分比

wa:等待 I/O 所耗费的 CPU百分比

st:被虚拟机器 (virtual machine) 所盗用的 CPU百分比

 

vmstat还有其他参数,如-d可以查看磁盘详细状态:

 

SUID查看实验

用非root账号如kkk登录系统,执行passwd,然后ctrl-z放入后台,

用pstree -u查看进程的权限

自动变为了root权限,SUID实际是在进程创建的时候赋予权限。

/proc/*目录

进程的相关信息都放在内存中,但可以通过目录路径的方式查看,/proc/*下面就是进程的信息。每个进程/proc下有一个对应进程id目录名,如/proc/11表示进程id为11信息。

 

进程目录下有很多文件,代表不同含义:

如:cmdline代表启动进程的命令

environ代表进程的环境变量

 

还有全局的参数,如:

fuser查询文件或目录占用

fuser可以查询文件或目录被哪个进程占用

如:

权限列含义:

  • c :此进程在当前的目录下(非次目录);
  • e :可被触发为执行状态;
  • f :是一个被开启的档案;
  • r :代表顶层目录 (root directory);
  • F :该档案被开启了,不过在等待回应中;
  • m :可能为分享的动态函式库;

选项:

-u :列出进程拥有者;

-m :上提到该文件系统的最顶层,对 umount 不成功很有效!

-v :列出命令

-k :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;

-i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!

-signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9)

如:

找出了/proc目录的文件系统的占用者。

 

找到占用目录"."的进程并试图杀掉,确定以后就把当前bash杀掉了

lsof查看程序开启的文件

与fuser相反,lsof查看程序开启了哪些文件

选项:

-a :and条件连接符

-U :仅列出 Unix like 系统的 socket 文件类型;

-u :后面接 username,进程所有者;

+d :后面接目录,仅在该目录下找。

 

如:

lsof -u root -a –U

找出root用户开启socket文件。

 

lsof +d /dev

找出目前已打开的设备文件

 

lsof -u root | grep bash

找出root的bash打开的文件

 

 

pidof查询进程的pid

例如:

开启了2个vim放入后台,就会显示2个的。

服务

服务是常驻内存中的进程,daemon是实现service服务的程序,也是守护进程的意思,可不用区分daemon与service的区别。

服务分类

服务分为可独立启动的stand_alone与通过super daemon来统一管理的两大类。

stand alone常驻内存,响应速度快

super daemon只有等到有请求,才启动相应的服务,速度慢一些

super daemon又可以分为单线程(single-threaded)和多线程(multi-threaded)两种。

 

服务形态

服务有两种形态:

signal-control:基于信号机制,有请求立即处理

interval-control:轮询机制,到时间才执行任务。

 

服务命名规则

通常以d结尾,daemon的意思,如:mysqld、atd、crond等。

服务的端口

服务都对应一个端口,通过ip+端口访问服务,如httpd服务使用80端口,浏览器输入网址时,浏览器默认访问80端口。通讯协议就是约定俗称的服务放在固定端口。

服务的端口配置在/etc/services

如:

cat /etc/services

第1列是daemon名字,第2列是端口号/网络链路层协议

查看端口占用常用命令

如:

netstat -tnlp | grep 8083

服务启动脚本目录

服务启动脚本:/etc/init.d/*

/etc/init.d/*

公认的目录,centos放到/etc/rc.d/init.d,两个地址是链接,同一个目录

服务初始化配置:/etc/sysconfig/*

 

super daemon配置:/etc/xinetd.conf,/etc/xinetd.d/*

需要首先安装xinetd才有/etc/xinetd.conf文件,yum install xinetd

/etc/xinetd.conf是superdaemon的整体配置

/etc/xinetd.d/*下面是super daemon管理的daemon的配置

 

各服务自己的配置:/etc/*

 

服务的资料库:/var/lib

服务运行产生的文件

服务的pid记录:/var/run/*

这目录记录服务的pid

 

stand alone服务的启动

一般说的开关某个port,就是启停某个服务的意思。

直接文件命令启动

直接命令执行/etc/init.d下的服务文件即可,如rsyslog

rsyslog不接参数,告诉你用法,可以接哪些参数

rsyslog status查看服务状态

rsyslog restart重启服务

重启后pid变了,2126变成了2151。

service命令启动

service [service name] (start|stop|restart|...)

如:

service crond restart

 

查看所有服务状态

service --status-all

super daemon下服务的启动

super daemon本身也是一个stand alone服务,它下面管理的其他daemon就不是,下面的服务是否启动是配置在各自的脚本中的/etc/xinetd.d/*,如:

cat /etc/xinetd.d/rsync

rsync默认是不启动的。

grep -i 'disable' /etc/xinetd.d/*可以查询哪些服务是不启动的

 

如果要启动rsync,把disable = yes改为disable = no,再执行/etc/init.d/xinetd restart

重启super daemon即可。

grep 'rsync' /etc/services查看服务的端口号是873

netstat -tnlp | grep 873查看873端口的状态

 

ps:service xinetd restart也可以重启xinetd服务

 

super daemon的配置

全局配置文件在/etc/xinetd.conf,每个服务的个性配置文件在/etc/xinetd.d下面

cat /etc/xinetd.conf

# 服务启动成功或失败,以及登录行为的日志

log_type = SYSLOG daemon info <==记录服务类型

 

log_on_failure = HOST <==发生错误时需要记录的信息为主机 (HOST)

log_on_success = PID HOST DURATION EXIT <==成功启动或登录时的记录信息

 

# 允许或限制连接的默认值

cps = 50 10 <==同一秒内的最大连线数为 50 个,若超过则暂停 10 秒

instances = 50 <==同一服务的最大同时连线数

per_source = 10 <==同一来源的用户端的最大连线数

# 网路 (network) 相关的默认值

v6only = no <==是否仅允许 IPv6 ?可以先暂时不启动 IPv6 支援!

# 环境参数的设定

groups = yes

umask = 002

includedir /etc/xinetd.d <==更多的设定值在 /etc/xinetd.d 目录下

 

cat /etc/xinetd.d/rsync

格式:

service <service_name>

{

<attribute> <assign_op> <value> <value> ...

.............

}

service_name对应/etc/services下面的服务

 

连接符含义

=:设定参数

+=:原参数中追加

-=:原参数中去掉

 

参数列表:

 

attribute (功能)

说明与范例

一般设定项目:服务的识别、启动与程式

disable

设定值:[yes|no],预设 disable = yes

(启动与否)

disable 为取消的意思,此值可设定该服务是否要启动。预设所有的 super daemon 管理的服务都不启动的。 若要启动就得要设定为' disable = no '

id

设定值:[服务的名称]

(服务识别)

虽然服务在设定档开头' service 服务名称'已经指定了,不过有时后会有重复的设定值,此时可以用 id 来取代服务名称。 你可以参考一下 /etc/xinetd.d/time-stream 来思考一下原理。

server

设定值:[program 的完整档名]

(程式档名)

这个就是指出这个服务的启动程式!例如 /usr/bin/rsync 为启动 rsync 服务的指令,所以这个设定值就会成为: ' server = /usr/bin/rsync '

server_args

设定值:[程式相关的参数]

(程式参数)

这里应该输入的就是你的 server 那里需要输入的一些参数啦!例如 rsync 需要加入 --daemon , 所以这里就设定:' server_args = --daemon '。与上面 server 搭配,最终启动服务的方式'/usr/bin/rsync --daemon'

user

设定值:[使用者帐号]

(服务所属UID)

如果 xinetd 是以 root 的身份启动来管理的,那么这个项目可以设定为其他使用者。此时这个 daemon 将会以此设定值指定的身份来启动该服务的程序喔!举例来说,你启动 rsync 时会以这个设定值作为该程序的 UID。

group

跟 user 的意思相同!此项目填入群组名称即可。

一般设定项目:连线方式与连线封包协定

socket_type

设定值:[stream|dgram|raw],与封包有关

(封包类型)

stream 为连线机制较为可靠的 TCP 封包,若为 UDP 封包则使用 dgram 机制。raw 代表 server 需要与 IP 直接对谈!举例来说 rsync 使用 TCP ,故设定为'socket_type = stream '

protocol

设定值:[tcp|udp],通常使用 socket_type 取代此设定

(封包类型)

使用的网路通讯协定,需参考 /etc/protocols 内的通讯协定,一般使用 tcp 或 udp。由于与 socket_type 重复, 因此这个项目可以不指定。

wait

设定值:[yes(single)|no(multi)],预设 wait = no

(连线机制)

这就是我们刚刚提到的 Multi-threadedsingle-threaded !一般来说,我们希望大家的要求都可以同时被启用,所以可以设定' wait = no ' 此外,一般 udp 设定为 yes 而 tcp 设定为 no。

instances

设定值:[数字或 UNLIMITED]

(最大连线数)

这个服务可接受的最大连线数量。如果你只想要开放 30 个人连线 rsync 时,可在设定档内加入:' instances = 30 '

per_source

设定值:[一个数字或 NULIMITED]

(单一用户来源)

如果想要控制每个来源 IP 仅能有一个最大的同时连线数,就指定这个项目吧!例如同一个 IP 最多只能连 10 条连线' per_source = 10 '

cps

设定值:[两个数字]

(新连线限制)

为了避免短时间内大量的连线要求导致系统出现忙碌的状态而有这个 cps 的设定值。第一个数字为一秒内能够接受的最多新连线要求, 第二个数字则为,若超过第一个数字那暂时关闭该服务的秒数。

一般设定项目:登录档的记录

log_type

设定值:[登录项目 等级]

(登录档类型)

当资料记录时,以什么登录项目记载?且需要记载的等级为何(预设为 info 等级)。这两个设定值得要看过下一章登录档后才会知道哩!这边你先有印象即可。

log_on_success

设定值:[PID,HOST,USERID,EXIT,DURATION]

log_on_failure

在'成功登入'或'失败登入'之后,需要记录的项目:PID 为纪录该 server 启动时候的 process ID , HOST 为远端主机的 IP、USERID 为登入者的帐号、EXIT 为离开的时候记录的项目、DURATION 为该使用者使用此服务多久?

(登录状态)

  

进阶设定项目:环境、网路埠口与连线机制等

env

设定值:[变数名称=变数内容]

(额外变数设定)

这一个项目可以让你设定环境变数,环境变数的设定规则可以参考第十一章。

port

设定值:[一组数字(小于 65534)]

(非正规埠号)

这里可以设定不同的服务与对应的 port ,但是请记住你的 port 与服务名称必须与 /etc/services 内记载的相同才行!不过,若服务名称是你自订的,那么这个 port 就可以随你指定

redirect

设定值:[IP port]

(服务转址)

将 client 端对我们 server 的要求,转到另一部主机上去!呵呵!这个好玩呦! 例如当有人要使用你的 ftp 时,你可以将他转到另一部机器上面去!那个 IP_Address 就代表另一部远端主机的 IP 啰!

includedir

设定值:[目录名称]

(呼叫外部设定)

表示将某个目录底下的所有档案都给他塞进来 xinetd.conf 这个设定里头!这东西有用多了, 如此一来我们可以一个一个设定不同的项目!而不需要将所有的服务都写在 xinetd.conf 当中!你可以在 /etc/xinetd.conf 发现这个设定呦!

安全控管项目:

bind

设定值:[IP]

(服务介面锁定)

这个是设定'允许使用此一服务的介面卡'的意思!举个例子来说,你的 Linux 主机上面有两个 IP ,而你只想要让 IP1 可以使用此一服务,但 IP2 不能使用此服务,这里就可以将 IP1 写入即可!那么 IP2 就不可以使用此一 server 啰

interface

设定值:[IP]

与 bind 相同

only_from

设定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]

(防火墙机制)

这东西用在安全机制上面,也就是管制'只有这里面规定的 IP 或者是主机名称可以登入!'如果是 0.0.0.0 表示所有的 PC 皆可登入,如果是 192.168.1.0/24 则表示为 C class 的网域!亦即由 192.168.1.1 ~ 192.168.1.255 皆可登入!另外,也可以选择 domain name ,例如 .dic.ksu.edu.tw 就可以允许昆山资传系网域的 IP 登入你的主机使用该 server !

no_access

设定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]

(防火墙机制)

跟 only_from 差不多啦!就是用来管理可否进入你的 Linux 主机启用你的 server 服务的管理项目! no_access 表示'不可登入'的 PC 啰!

access_times

设定值:[00:00-12:00, HH:MM-HH:MM]

(时间控管)

这个项目在设定'该服务 server 启动的时间',使用的是 24 小时的设定!例如你的 ftp 要在 8 点到 16 点开放的话,就是: 08:00-16:00。

umask

设定值:[000, 777, 022]

还记得在第七章提到的 umask 这个东西吗?呵呵!没错! 就是那个鬼玩意儿啰!可以设定使用者建立目录或者是档案时候的属性!系统建议值是 022 。

如:

 

rsync对应端口在:

端口是873,小于1024的端口都只能由root启动

rsync设置实例

无效果,待研究

应该这样才对:


服务的防火墙管理

概念

xinetd所管理的服务,可以/etc/hosts.allow与/etc/hosts/deny中配置防火墙规则,

防火墙过滤都是/usr/sbin/tcpd这个软件实现的,只有支持TCP Wrappers函数库的服务才能用/etc/hosts.{allow,deny}来管理防火墙

查看服务是否支持TCP Wrappers函数库可以用ldd命令,如:

ldd $(which sshd httpd)

可以看出sshd支持,而httpd不支持,所以sshd可用/etc/hosts.{allow,deny}来管理防火墙,而httpd服务不能。

配置

如:

rsync : 127.0.0.100 127.0.0.200:deny

表示这两个ip无法访问rsync服务

 

等同于

rsync : 127.0.0.100 : deny

rsync : 127.0.0.200 : deny

或者

rsync : 127.0.0.100

rsync : 127.0.0.200

 

第三列可以不写,/etc/hosts.allow中的默认allow,/etc/hosts.deny中的默认deny

 

/etc/hosts.allow的配置优先于/etc/hosts.deny

第二列还可以是这些:

ALL:代表所有

LOCAL:代表本机

UNKNOWN:代表不知道的ip、domain、服务

KNOWN:代表知道的ip、domain、服务

 

如配置:

/etc/hosts.allow

rsync: 140.116.0.0/255.255.0.0

rsync: 203.71.39.0/255.255.255.0

rsync: 203.71.38.123

rsync: LOCAL

 

/etc/hosts.deny

rsync : ALL

 

 

表示只允许 140.116.0.0/255.255.0.0 与 203.71.39.0/255.255.255.0 这两个网域,及 203.71.38.123 这个主机可以进入我们的 rsync 服务器,其他IP全部拒绝

TCP Wrappers的特殊功能

TCP Wrappers可以将被拒绝的访问者的ip等相关信息记录下来,进行一些处理(如发邮件给root用户等),还能自定义显示给被拒绝者的警告信息。

需要先安装TCP Wrappers,查看是否安装:

rpm -q tcp_wrappers

 

由于是拒绝机制,所以一般写在/etc/hosts.deny中。

配置,如:

rsync : ALL: spawn (echo "security notice from host $(/bin/hostname)" ;\

    echo; /usr/sbin/safe_finger @%h ) | \

    /bin/mail -s "%d-%h security" root & \

    : twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" )

上面这四行共有三个冒号来隔开成四组,含义分别是:

  1. rsync: 表示rsync服务;
  2. ALL: 指的是来源,这里是所有。
  3. spawn (echo "security notice from host $(/bin/hostname)" ; echo ; /usr/sbin/safe_finger @%h ) | /bin/mail -s "%d-%h security" root &: 表示用safe_finger抓取请求者信息,然后用管道命令将它们发送到root邮箱。mail 会将该消息以标题为 security 的字样寄给 root由于 spawn 只是中间的过程,所以还能够有后续的动作!
  4. twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" ): 这个动作会将 Warning 的字样传送到用户端主机的荧幕上! 然后将该连接中断。

流程是:

  1. 利用 safe_finger 去追踪出对方主机的信息 (包括主机名称、使用者相关信息等);
  2. 将该追踪到的结果以 email 的方式寄给我们本机的 root ;
  3. 在对方屏幕上面显示不可登入且警告他已经被记录的信息

查看系统的服务

ps可以查看所有的服务,netstat可以查看开启了网络监听的服务,一般都比较关心网络监听,因此netstat用得更多。

如:

查看系统开启了网络监听的服务,

netstat –tulp

可以加-n显示端口

 

如:

netstat –lnp

 

查看所有服务运行状态:

service --status-all

服务开机启动

不同的linux运行等级(0~6),如5是图形界面,3是文字界面,开机启动服务是不同的,可以用chkconfig命令查看或者设置。

如:

查看全部服务

chkconfig --list | more

 

查看单个服务,如

chkconfig --list httpd

 

查看在运行等级3启用的服务:

chkconfig --list | grep '3:启用'

 

设定开机启动

让 atd 这个服务在 run level 为 3, 4, 5 时启动

chkconfig --level 345 atd on

 

不加—level 345默认设置所有run level

设定开机启动并不会马上启动该服务,需要重启生效,如:

设定开机不启动

如:

chkconfig --level 4 atd off

运行等级4的atd不启动

 

chkconfig atd off

所有运行等级的atd都不启动

 

chkconfig也能够管理super daemon的服务,如:

ntsysv图形化界面设置开机服务

ntsysv命令界面

如:

上下键:移动选择服务

空格:选择(有星号)或取消选择

tab:切换到确定、取消按钮

F1:查看该服务的说明

设定自己写的服务开机启动

默认开机启动脚本都放在

/etc/init.d

所有需要先将脚本放在这个目录如:

第二行是:

chkconfig: [runlevels] [启动顺位] [停止顺位]

 

需要chkconfig –add kkk先将服务加入chkconfig管理

chkconfig –del kkk是将kkk移除chkconfig管理。

软件安装

yum

yum通过分析RPM的标头,自动分析软件之间依赖关系,yum服务器上有各种软件,本地只要配置合适yum源的地址即可使用。

 

选项:

-y :当 yum 要等待使用者输入时,默认都选y;

--installroot=/some/path :自定义软件安装路径在 /some/path 而不使用默认路径

 

yum查询(list|info|search|provides|whatprovides)

yum list列出软件

列出软件名称与版本,类似rpm -qa

yum list默认列出所有软件,如:

 

yum list pam*

列出以pam开头的所有软件

 

上面是已经安装的软件

下面是可以安装或升级的软件。

 

yum list updates

列出可以升级的软件

yum search查询软件

根据名称或描述查询软件,如:

搜索名称或描述中含有raid关键字的软件。

yum search raid

 

下面的冒号左边是软件名称,右边是rpm的name

 

yum info查看软件安装信息

类似于rpm -qai如:

yum info mdadm

yum provides通过文件搜索软件

类似于rpm -qf

列出含有passwd文件的软件

yum provides passwd

yum安装升级(install|update)

如:

yum -y install pam-devel

会自动下载软件,自动安装

yum卸载(remove)

如:yum remove pam-devel

yum配置地址

仓库地址配在:/etc/yum.repos.d/CentOS-Base.repo

 

每个中括号是一个容器,如[base]、[updates]等

 

yum容器清单在:/var/cache/yum/

 

如果出现yum本地容器清单与服务器上的不一致,可以用yum clean命令清理,如:

yum clean all

 

[root@www ~]# yum clean [packages|headers|all]

选项与参数:

packages:将已下载的软体档案删除

headers :将下载的软体档头删除

all :将所有容器资料都删除!

 

yum群组(grouplist)

grouplist可以安装大型的软件组

yum grouplist查看所有软件组

 

yum groupinfo查看某个组的安装情况,如:

yum groupinfo XFCE-4.4

 

posted @ 2020-12-16 10:18  吴克兢  阅读(246)  评论(0)    收藏  举报