何为操作系统?按照自己的理解,操作系统就类似一个平台,上面可以运行各种应用程序,向下可以屏蔽各种硬件差异对用户带来的影响,是用户与计算机硬件系统之间的接口。
看看《计算机操作系统》中对操作系统是怎么定义的:
OS作为用户与计算机硬件系统之间的接口;
OS作为计算机系统资源的管理者;
OS实现了对计算机资源的抽象;
OS是铺设在计算机硬件上的多层系统软件,它们不仅增强了系统的功能,而且还隐藏了对硬件的操作细节,由它们实现了对计算机硬件操作的多个层次的抽象。
多用户多任务操作系统的含义是:允许多个用户通过各自的终端使用同一台机器,共享主机系统的各种资源,而每个用户程序又可以分为几个任务,使他们能并发执行,从而可进一步提高资源利用率和系统吞吐量。
计算机体系结构的分层关系:
应用程序 |
库(API) |
内 核 |
硬 件 |
API规范:POSIX规范 遵循POSIX规范之后各种应用程序可以运行在不同的系统之上。
上层用户跟内核交互的机制:中断,系统调用(system call)
系统调用:从用户态切换到内核态 以能够实现所有功能但是消耗资源最少
中断:停止正在执行的任务,转而执行对实时性要求更高的进程。分为硬终端还软中断
Redhat封装了GNU多个应用程序再加上Linux的内核编译成通用的二进制形式,并提供安装形成发行版。
LFS──Linux from
Scratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式。它不是发行版,只是一个菜谱,告诉你到哪里去买菜(下载源码),怎么把这些
生东西( raw code) 作成符合自己口味的菜肴──个性化的linux,不单单是个性的桌面。(来自百度百科)
Redhat Linux经历了6.0 7.0 8.0 9.0。自2002年起,Redhat将产品分为两个系列,即由Red
hat公司提供收费技术支持 和更新的RHEl服务器版,以及由Fodora社区开发的桌面版本Fedora Core(FC),目前通用的Redhat
Enterprise版本为5.4 5.5以及刚刚发行的6.0版本。
常用的两种体系架构有 IA-32,x86 AMD64,x86_64两种平台
除了常用的Intel ,AMD处理器之外,还有Power,PowerPC,Ultrasparc,安腾,M68K,Mips ,Arm(只制作标准)等。
应用程序之上有一种特殊的程序 SHELL 计算机和人相互交接的一个界面。
进程是用户意图代表。
Linux下两种人机交互接口:CLI :bash (windows)sh ksh csh zsh
GUI (X-window) Desktop Gnome KDE XFace
红帽默认Gnome
Linux下各种设备都是以文件的形式存在于磁盘中。
Linux环境下用户分为两类Root :superuser administrator; Commonuser:student不建议使用管理员身份登录。普通用户的家目录是/home/username 管理员Root /root。
几个常用命令的使用:Ctrl+shift+T 可多打开多个终端
Ctrl+Pageup(Pagedown)之间相互切换
Crtl+shift+C 复制
Shift+Pageup(pagedown)上下翻页
Alt+F10 窗口最大化
Alt+F9 窗口最小化
Less 分屏查看文件
往下翻一行 space键?--->b 翻一页Enter?->k
补齐分为命令补齐和路径补齐。
命令有两种:内部命令:shell
外部命令 PATH 有一个可执行的程序 #echo $PATH
su switch user 用户切换
su [-] login 不加横线 shell是root 环境下不会发生改变, 加横线su – student会改变(为当前用户创建一个新的shell)。
sudo 不再切换用户的情况下使用另外一个用户执行命令。
!! 使用上一个命令
!fin 查找从后往前第一个以fin开头的命令
!数字 表示执行命令历史列表中的第N条命令
!-n 表示倒数第N条命令
^/etc^/dev 把上一条命令的etc转换为dev
!$或者Esc+. 调用上一条命令的最后一个参数
Ctrl+r
Histsize 命令历史的长度 最多保存多少条 redhat默认1000条
Histfilesize控制文件里保存多少条 默认1000条
Histfile 定义文件的保存位置 /root/.bash_history
清空命令历史列表 history –c
文本编辑器 :纯粹处理纯文本文件,字符本身没有任何修饰信息。行编辑器 :sed,全屏编辑器 :nano vim emacs。
命令格式:# command [options] 选项 [arguments]参数
选项:修改命令的执行动作
长选项 - -开头 eg –help 不能组合
短选项 -开头 eg -l 可以组合 eg -lhd
参数: 制定命令的执行对象
<>表示必须的 [-x|-y|-z]可选的,多选一
clock显示硬件时间,即bios里边的时间。
更改时间 Date hhmmMMDDYY.ss
hwclock –w 把系统时钟写到硬件里边去
hwclock –s 把硬件时间写到系统时钟里边去
Date +“%m-%d-%y”
%s表示从unix元年到此刻所经过的秒数
如何获得帮助
命令 -h 内部命令获得帮助的方式
命令 --help 外部命令获得帮助
Man ——》查找manual 手册 /usr/share/man
Man command 查看命令手册
man –k =apropos 非精确搜索
info –p在节点间进行跳转 –n跳转到下一个命令 作为man命令的补充使用的
Whatis makewhatis 手动建立whatis数据库
/usr/share/doc
n/N 下一个,前一个
Linux文件系统结构:
/bin二进制文件的存放目录(可执行文件)一般都显示为绿色
/dev 设备特殊文件
/etc 系统管理和配置文件
/etc/rc.d 启动的配置文件和脚本
/home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
/lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件
/sbin 系统管理命令,这里存放的是系统管理员使用的管理程序(二进制文件)
/tmp 公用的临时文件存储点
/root 系统管理员的主目录(呵呵,特权阶级)
/mnt 系统提供这个目录是让用户临时挂载其他的文件系统。
/lost+found 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里
/proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/var 某些大文件的溢出区,比方说各种服务的日志文件
/usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含:
/usr/X11R6 存放X window的目录
/usr/bin 众多的应用程序
/usr/sbin 超级用户的一些管理程序
/usr/doc linux文档
/usr/include linux下开发和编译应用程序所需要的头文件
/usr/lib 常用的动态链接库和软件包的配置文件
/usr/man 帮助文档
/usr/src 源代码,linux内核的源代码就放在/usr/src/linux里
/usr/local/bin 本地增加的命令
/usr/local/lib 本地增加的库
两个挂载点:/media 挂载便携式媒介 /mnt 挂载格外硬盘
/opt 可有可无的
/var /srv (service 服务器在工作当中,产生一些中间数据,放在此目录下) 数据文件的存放目录
伪文件系统 /proc 正在内存当中运行的内核信息的映射
/sys 导出系统的硬件设备信息
/lib 功能模块 可执行文件 动态库 静态库 符号库
linux 内核在/boot分区
/swap 交换分区,一般是物理内存的二倍。
以点开头的文件表示隐藏文件
.表示当前目录 ..表示父目录
动态装入器,ld.so.conf, ld.so.conf.d/*.conf 将路径添加进去即可。
FHS规范:规范在根目录(/)下面各个主要目录应该放什么样的文件。FHS定义了两层规范,第一层是, /
下面的各个目录应该要放什么文件数据,例如/etc应该要放置设置文件,/bin与/sbin则应该要放置可执行文件等等。第二层则是针对/usr及
/var这两个目录的子目录来定义。例如/var/log放置系统登录文件、/usr/share放置共享数据等等。
文件或目录名 255个字符 严格区分大小写 除 /不能用以外原则上其他任何都可以用
有特殊符号的话 如* 空格 ,要加引号‘’ eg: touch ‘c d’ 。
查看student用户信息:id student
finger student
pwd 显示当前工作目录
cd – 返回上一个工作目录
Mkidr –pv z/y 如果z不存在,先创建z v选项表示显示创建过程
- 普通文件 在使用ls –l时,所列内容的第一项的第一位为“-”。系统中源码、文本和shell程序等都是正规文件。
D 目录文件 目录是一种特殊的文件,它的内容是所包含的文件的信息:文件的位置、大小、文件的创建时间等。使用ls –l时,第一项第一列的标识为“d”。目录文件只能由操作系统或专门的程序来读取和修改,普通用户无法直接访问目录文件,只能读取目录文件的内容。
L 链接文件(link file)
系统中的链接是一个已经存在的文件的另一个名字,它不复制文件的内容。有两种链接方式,一种是硬链接(hard
link),另一种是符号链接(symbolic
link),又称软链接。硬链接和原有文件是存储在同一物理地址的两个不同的名字,因此硬链接是相互的;符号链接的内容只是一个所链接文件的文件名,在使
用ls –l时,符号链接的第一项的第一位为“l”。
C 字符设备 一次传输一个字符 装置文件里边的串行端口设备,例如键盘,鼠标
B 块设备 一次读一个数据块 装置文件里边可供储存的接口设备;
S 套接字文件 socket 进程间通信
socket是linux系统中用于计算机之间相互通信的应用程序的接口它将完成网络上的I/O操作。在linux系统中,socket并不是一个真正的
文件,但是它被抽象成一个文件,使用ls –l命令时,第一项第一位的标识为“s”。
P管道文件 进程间通信的一种机制
查看文件的三个时间:访问时间access 修改时间 modify 改变时间change(文件属性 文件名改变)
stat a 显示a的状态
touch 将三个时间都改为当前时间
touch –a access time改为当前时间
-m 改变最近一次修改时间
-t 改变成指定时间
cp src dst
如果目标文件存在,则覆盖目标文件
如果目标不存在 则把源文件拷过来,并以目标文件名命名
cp /etc/issue /m/a..txt
-f 强行覆盖目标文件
-i 如果目标文件存在,提示你是否覆盖
alias 要想使用原命令,绕过别名,直接使用命令原来的意义,在命令前边加”\”
mv
rm -f 强制删除 -r递归删除
file 简单判断文件内容的不同
用户:使用标识可以获取资源的集合。
组:容器
linna——>UID ——>/etc/passwd
password——>/etc/shadow 同时也包含着账户密码的属性信息
mygrp——>GID——>/etc/group 组账号
/etc/gshadow 组密码
用户账号:
类别 管理员 系统用户和普通用户
root
1——499 系统用户
500<UID<60000 普通用户
文件和目录的访问权限分为三类:
属主的权限:定义了文件和目录属主可对其进行的操作
l 同组用户的权限:定义了与属主在同组的其他成员可对其进行的操作。
l 其他用户的权限:定义了除去属主和同组的成员外,其他用户可对其进行的操作。
组 三类
私有组 公共组
基本组(主组)和附加组(额外组)
对文件来说
9 8 7 6 5 4 3 2 1 0
- r w x r - x r - x
r 查看 例如cat less
w修改
x 执行(脚本) 可执行文件
对于目录来说r查看内容 例如ls
w 建立新文件 删除原有文件 修改文件
x进入目录权限
useradd 建立一个新用户
passwd username 为用户添加密码
文件权限修改方法:同时操作所有用户权限
只操作一类用户权限
用户:u 组 g 其他 o 所有 a
chgrp 改变文件所属群组
chown 改变文件所属人
chmod 改变文件的属性、SUID等等的特性
chmod u=
只操作某一类用户某一位用户权限
chmod –R 递归改变权限
chown/chgrp [-R(子目录文件权限都改变)] groupname filename
chown username;grpname filename 改变所属用户和组
chown --reference =src dst
chmod –reference=src dst
把src的权限改成dst的权限
超级权限
suid sgid sticky
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的u g o三组的 rwx位。
suid 期望其他用户不是以自己身份来运行脚本,而是以文件属主的身份来运行
sgid
sticky o:w 全局可写通常只能用在目录上
4:suid
2:sgid
1:sticky
S表示原来没有执行的权限 s表示在原来执行的权限上再加一个s
Lecture 6
12月29号整理
bash shell 快捷键 提供命令编辑功能
Ctrl+a 将光标快速移到命令行首部
Ctrl+e 将光标快速移到命令行行尾
Ctrl+ —> (<—)一次移动一个单词
Ctrl+k 删除当前光标至命令行尾部的内容
Ctrl+u 删除当前光标至命令行首部的内容
Ctrl+l 或者clear都是用来清屏的
(emacs风格) set –o vi 转换为vi风格
文件名通配
* 匹配零到任意个、任意长度的字符
?匹配任意单个字符 eg:ab?d.mp3 匹配abcd.mp3
[]指定一个取值范围的单个字符,匹配只能从中括号中的字符选取
[0-9] [a-z] [:alpha:] 大小写字母 本身就是一个集 要想使用的话再加上一个中括号eg [[:alpha:]]b.mp3
[:lower:]小写字母 [:upper:]大写字母 [;digit;]数字 [:punct:]标点符号
[;alnum;]字母和数字 [:space:]空白字符 文件名通配
rm –f *.doc
file 查看文件
命令行展开 ~,{},
ls ~redhat
touch {a b}_{c d}
shell 应用程序,提供用户作为系统接口
命令
编程功能
软件编程:编译类:源代码——》目标代码(编译) C C++ java
脚本类:源代码 (解释器 bash) 一般来说 面向应用层
脚本语言:perl(redhat 5.8)面向过程
python面向对象 更适合于构建大型应用
ruby (on rail)日本
shell
shell, bsh(sh) 标准shell 开发者bourn 1979年 贝尔实验室
Bill joy 伯克利大学 csh——>tcsh(改进版) FreeBSD 默认cshell
korn,ksh,GNU ksh(跟原来的ksh不是一回事)
bourn again shell bash shell 遵循GPL Linux目前使用最广泛的
zsh 功能强大 体积庞大 最年轻的
cat –n 显示行号
-A --show-all 显示非打印字符
-T 显示制表符
不带参数 默认从键盘读取内容
cat /etc/shells
显示可用的shell的种类
切换shell 输入名字即可 eg:ksh
其他shell返回bash shell 的时候一般先exit
不然会在当前进程下再创建一个子进程,会浪费资源
变量:(容器) 命名的内存空间
变量就是以一组文字或者符号等,来取代一些设定或者是一串保留的数据。
在脚本语言里,任何一种类型都会被识别为字符型
bash:本地变量 只对当前程序有效(类似于局部变量)
环境变量 shell中其他进程可以使用 共享型变量
export CLASS=3 导出变量值 可以被一个进程和子进程共用
unset NAME 撤销变量值
只有在引用(取变量的值)的时候加$
位置参数变量
特殊变量 $?
本地变量的声明:NAME=linna
或者 set CLASS=3
unset 取消变量值
引用:取变量值 “ ”,’ ’, ``
“ ” 弱引用 会做变量替换
‘ ’ 强引用 不会做变量替换
``(反引号) 命令引用 反引号内的命令会先执行,执行完的信息在传回到外部命令来处理。
通配符与特殊符号:
printf 不会自动在后面加”\n” 不会自动换行
{} 告诉变量名的范围 echo ${NAME}s 在name变量后边再加上s输出
命令引用:
FILE=`ls /root`
FILE=$(ls /var)
把命令的执行结果当做变量的值赋给FILE
声明的变量不想被人撤销或者改变 使用readonly命令声明
eg :readonly NAME
几点规则:——《鸟哥的linux私房菜》
1.变量与变量内容以等号来连接;
2.等号两边不能直接接空格符;
3.变量名称只能是英文字母和数字,但是数字不能是开头字符;
4.若有空格符可以用双引号或者单引号将变量内容结合起来,但要注意,双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符仅为一般字符;
5.必要时需要以转义字符“\”将特殊符号变为一般符号;
6.在一串命令中,还需要用到其他命令提供的信息,可以使用 `command` 注意是反引号
env 显示本地环境变量 通常用来保证运行一个命令的时候只在定制的路径下的命令
eg:env PATH=/bin/ls
不带任何参数也可以显示环境变量。
几个常用变量
PS1 export PS1=‘[\[email protected]\h \W]$’
PS2
PS3
PS4
LANG 定义语言
locale 查看定义的语言区
LOGNAME
OLDPWD 记录上一个工作目录
SHELL
RANDOM 随机数,使用echo RANDOM时会产生一个随机数,介于0——32767之间。
如果想输出一个0——9之间的随机数,可以这样:
echo $? 返回上一个命令的执行状态值 eg 0 2 127
declare 声明变量类型
-a 将变量声明为数组(array)
-i 将变量声明为整数数字(integer)
-x =export 将变量声明为环境变量
-r 将变量声明为只读(readonly)
alias 定义命令别名
alias cdnet=’cd etc/sysconfig/network-scripts’
不想使用别名,在别名前加”\” .
unalias 撤销 仅对当前shell生效
登录信息显示数据 /etc/issue
/etc/motd 用户登录后显示信息
永久使用 编辑环境配置文件
#!/bin/bash
脚本中调试功能 set –x
set +x
之间的命令
bash –x 脚本名称 调试整个脚本
系统级别:全局/etc/profile , /etc/profile.d/* , /etc/bashrc
用户定义:~/.bash_profile , ~/.bashrc , ~/.bash_history , ~/.bash_logout
交互式 profile 通常用于放置环境变量的设置定义等
/etc/profile---à /etc/profile.d/*---à~/.bash_profile---à~/,bashrc---à/etc/bashrc
后面的会覆盖前边的
非交互式 bashrc别名等的定义
~/.bashrc---à/etc/bashrc----à/etc/profile..d/*
退出之前需要做些清理工作 ~/.bash_logout
使设置的别名生效 source 或者. 别名
lecture 7 标准I/O及管道
程序 <代码 数据>
总线 BUS ,PCI, ISA,EISA,AGP,USB
文件句柄 handle ,文件描述符
标准输入 keyboard 0
标准输出 monitor 1
标准错误输出 monitor 2 跟正常输出不是同一个数据流
I/O重定向:
>输出重定向 set –C (?---->set +C)拒绝别人信息的覆盖
如果一定要覆盖:> | 强行覆盖
<输入重定向
>>追加重定向 不会覆盖原有文件
<< here document 可以在脚本中生成文件
2>&1 === &> 标准错误输出重定向
管道
管道的最后一个命令是在一个子shell 中运行的
例子: echo ‘abcd’ | tr ‘a-z’ ‘A-Z’
tee
echo ‘abcd’ | tee /tmp/tee.out |tr ‘a-z’ ‘A-Z’
自定义文件描述符 exec 3> /tmp/custom.out
取消文件描述符 exec 3>&-
多次往一个文件中写入内容,可以提高脚本输出地效率,因为只需打开一次,关闭一次
lecture 8
less
more
tail -f 一直查看,命令不会退出
less
grep 全面搜索正则表达式 并打印出来
pattern 模式,从文件中匹配整个模式 而后显示包含了匹配到的内容的行
正则表达式 基本表达 扩展正则表达
* 次数匹配 匹配前边字符0次或任意次
.匹配任意单个字符
.*匹配任意字符0次或者任意次(任意长度任意字符)
?零次或一次
+ 一到任意次
默认处于贪婪模式,越长越好
r.\{2\} 只能出现两次
r.\{0,2\}出现0到2次
r.\{2,\ } 至少两次
[a-z] [A-Z] 匹配任一个字符
[^a-z]除了a到z
锚定符:
^root 以root开始
root$ 以root结尾
\<锚定单词词首
\>锚定单词词尾
\b 匹配词首词尾 \broot\b
\<root\> 只寻找含有root的字符
[abc] 匹配中括号中单个字符,
\(..\) love your lover \(love).*\1r
^[[:alpha:]]*[^.][0-9]*
寻找精度为2的小数
\<\[0-9]\{1,\}.[0-9]\{2\}\>
总结:
* 0<=
? 0 ,1
+ 1<=
| 或者
grep 全面搜索正则表达式 并打印出来
–v 反向显示 匹配到的不显示 而不匹配到的显示
-i 忽略大小写
-n 在匹配到的结果里只挑取有限范围行
-An 每一个匹配的行下边再显示N行
-Cn 每一个匹配的行上下边再显示N行
-E 使用扩展正则表达式
--color=auto 自动添加默认颜色
export GREP_COLOR=’01;32’ 改变显示颜色
grep –v “^$” ($以空白开头 以空白结束)把空白行去掉
egrep 使用扩展正则表达式
fgrep 快速搜索正则表达式 = grep –f 不做任何正则表达式的匹配,不把任何字符当做元字符
如何从一个文档中找出正确的ip地址
1[0-9]\{0,2\}|2[0-5]\{2\}\.[0-1]\{1\}[0-9]\{0,2\}|2[0-5]\{0,2\}\.[0-1]\{1\}[0-9]\{0,2\}|2[0-5]
\{0,2\}\.[0-1]\{1\}[0-9]\{0,2\}|2[0-5] \{0,2\}
sort –o 指定保存在什么文件里边
-r 逆序
-n 以数值来排序
-u 把相同的行给去了
-t 指定以列排序
-k 指定第几段
-f 忽略大小写的差异
-b 忽略最前面的空格符部分
uniq 去除重复的行 假设两行一摸一样且连续
-c 显示每一行重复的次数
-u 只显示不重复的行
-d 只显示重复的
-i 忽略大小写
示重复的行er
cut –d: 后面接分隔符。与-f 一起使用
-f 依据-d 的分隔字符将一段信息分割成数段,用-f 取出第几段
-c 以字符(character)的单位取出固定字符区间
ifconfig | grep “inet addr” | cut –d: –f2
wc word count 计算字符
-l 仅列出行
-w 仅列出多少字(英文单字)
-m 多少字符
who | grep“^root”|wc –l
写一个脚本显示某用户登录了多少次 以及登录时间
/dev/null 垃圾桶 把命令丢弃
条件测试 test express
0真 1假
&& 前面条件为真,后面一定会执行
前面条件为假,后面一定不执行
|| 前面条件为假,后面一定会执行
前面条件为真,后面一定不执行
grep “^root” /etc/passwd || (who | grep “^root” |wc -l)
grep “^roooot” /etc/passwd &&(who | grep “^root” |wc -l)
grep “^roooot” /etc/passwd &> /dev/null && (who | grep “^root” |wc -l)
grep “^roooot” /etc/passwd &> /dev/null || echo “Hello,world”
条件判断三种表达方式:
test expression #test 1 –gt 2
[expression] #[ 1 –gt 2]
[[expression]] #[[ 1 –gt 2]]
-a 与
-o 或
! 非
短路操作符
&&
[]&&[]只要前面为假,后边就不再运行
[]||[]
[2 –gt 3] || echo “3 is max”
cut -d: -f1 /etc/passwd | grep “^student$” && echo “Student exists” || echo “student is exists”
比较两个数大小
#!/bin/bash
[ $1 –gt $2 ]&& echo $1 || echo $2
条件测试分为三种:
整数测试
-gt -lt -ge -le -eq -ne
(($A>$B))
> >=
字符串测试
= != > < -z -n
文件测试
-e FILE
-f FILE
-d FILE
-r FILE
-w FILE
-x FILE
-L/-h FILE 测试一个文件是否为符号链接文件(软链接)
-O FILE 测试此文件属主是否是你自己
-G FILE
测试文件存在否 不存在就创建
diff/patch 比较两个文件的不同不同之处
diff vimrc virmc2 > vimrc.patch 生成一个补丁
patch vimrc <virmrc.patch 打补丁
diff virmc virmc2 比较
-u 用统一格式输出两个文件的不同
diff dir1 dir2 目录下同名的文件逐一比较
-p2
aspell 词法检查
tr ‘a-z’ ‘A-Z’ 字符转换
sed stream editor 行编辑器 一次只处理一行
非交互编辑器
没有破坏性 不修改源文件 除非使用shell的重定向
sed (stream editor) 流编辑器
sed是一个行编辑器,它逐行处理要被处理对象文件的内容,并会把结果输送至屏幕
sed [options] ‘patitern/operation’ File
‘/root(模式)/p(操作结果)’/etc/passswd
-n 不显示模式空间的内容,只显示匹配并处理的内容
sed s/(模式)/ROOT(模式/
默认只替换每行中第一个 全部替换使用选项-g
i 忽略大小写
分隔符可以使用任意你想要的符号 :[email protected]@@
指定地址范围 add1,add2s/// /root/,/student/ s/root/ROOT/第一个出现root的行,第一个出现student的行
10,$(最后一行)s/root/ROOT/g
-i对原文件进行直接替换 默认不会改变原文件
-e 同时实现多项修改
-f 可以从文件中读取条件的选项
sed.txt的内容
-s 查找并替换
-a 在某行的后面进行追加
后面的“g”表示全局替换 global
1,5表示指定地址范围
operation p 显示
d 打印
vi 模式化编辑器
命令模式(编辑模式)
输入模式
末行模式
命令——>输入 i,a
输入——>命令 ESC
命令——>末行 输入冒号
末行——>命令 Esc (敲两下)
vi vi improved, vim
退出:
:wq 保存退出
:q 退出
:q!修改后不保存直接退出
:w!强制写入
shift+z 连输两次,保存退出
打开后光标处于第N行上 vim +n file
直接匹配到有redhat的哪一行 vim +/redhat file
光标移动:h 左 j下 k上 l右
行内移动:^第一个非空白字符的行首 0绝对行首 $绝对行尾
以单词为单位:w 一次移动一个单词(word)到下一个单词的词首 b (backward)上一个单词的词首,或当前单词的词首 e (end )跳到当前或下一个单词词尾
行间移动:nG 1G 跳到第一行
G 跳到最后一行
末行模式下实现行间跳转 :n
句间跳转: )(
段落间跳转: }{
命令模式——>输入模式:i:insert在当前光标所在处插入
I:在当前光标的行首
a:append 追加 在当前光标的后边插入 A在当前光标的行尾
o:在当前光标所在行上方插入新行
O:在当前光标所在行下方插入新行
cw 先删除一些东西,在转换到插入状态
c$
C
r (replace)字符替换
R (替换模式)所有操作都会替换原来的内容
删除 x 删除当前光标所在处(往后)的字符
X 删除光标往前的内容
d 连敲两次,用于删除 光标当前所在行
nd 用于删除光标下n行
复制操作
yy 复制一行 p粘贴
Y=yy
3yy 复制三行
p当前光标所在行的下方粘贴
P当前光标所在行的上方粘贴
移动内容
:,. +100
可视模式
v
V
查询:
/pattern
?pattern
\$[A-Z]\{1,\}
查找并替换:
:addr1,addr2s///gi
%全文搜索
:%s/red/RED/gi
:%s/^#//g
%s/^[[:space:]]\{0,\}#[[:space:]]*//g
%s/^[[:space:]]\{0,\}#[[:space:]]*.*$//g
ctrl + r 撤销上一次操作
redo 重做 不能重做撤销 ,一般是撤销之前的命令
一次打开多个文件
vim a b c d
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
-o 水平分割当前窗口
-O 用于垂直分割窗口
末行模式下 vsplit
set 定制vi编辑器
number:行号
autoindent 自动缩进
ignorecase忽略大小写
vimtutor vim练习器
shell算术运算:
$((expression))
$[expression]
let
面向对象:顺序 选择 循环
根据RH033课程整理而成。
12月19号
Lecture 10
进程:活体,程序的副本
定义:进程是进程实体的运行过程,是系统进行资源分配和调度的基本单位。——《计算机操作系统》 进程的三种状态:就绪态、执行态、阻塞态。
基本属性:可拥有资源的独立单位;进程同时又是一个可独立调度和分派的基本单位。
计算机利用进程PID来区别不同的进程
init :PID永远为1 ,inintial(初始化)的简写,作用:让操作系统系统启动起来,并让操作系统启动就绪,并给用户提供一个登陆界面,所有的进程都源于它。比喻:耶稣
所有的进程都是由父进程克隆来的。
进程调度 根据进程优先级来进行进程调度,在某一时刻,要满足优先级高的进程。静态优先级 0-99,动态优先级100-139。数字越小,优先级越高。
进程类型:CPU密集型进程:尽可能多的占用cpu;
I/O密集型进程,I/O比较多。
通常来说,IO密集优先级稍微高点
进程间通信:是指进程之间的信息交换。高级通信机制可以分为三大类:共享存储器系统,消息传递系统以及管道通信系统。例如:信号、共享内存(share memory)、socket
查看进程 ps
默认情况下是当前用户在当前终端上正在执行的进程。
守护进程:也称服务进程,是保证系统的正常运行必须要启动的。linux环境下通常是daemon。
由用户发起的进程:前台进程,调度进程(用户定期定时调用的进程)
-e 显示所有进程
PID 进程号 TTY 由哪个终端发起的(F1——F6) “?”表示守护进程,跟终端没关系
TIME 占用CPU运行时间之和。CMD 发起进程的命令。
-f 完全格式
-F 打印出额外信息,比-f显示信息更多
ps –eF
加[]表示内核线程,由内核线程(thread)发起的。
线程 thread:轻量级进程(LWP)。引入线程的概念是为了使多个程序能并发执行,以提高资源的利用率和吞吐量。线程作为调度和分派的基本单位,但不拥有资源。线程的切换不会引起进程的切换。linux没有真正意义的线程。
UID 进程的发起者; PID 进程号;PPID 父进程号; C CPU time累计时间;
SZ 所占用的空间;RSS物理内存占用的实际大小;PSR 显示进程运行在哪个CPU上
pstree 显示所有进程的关系
-u 显示某一用户发起的进程
-o 用户自定义,指定只显示哪些字段
-H显示子进程与父进程的关系
ps –ejH
-j 以job 的方式来显示进程间的关系
ps axjf (BSD风格)
a 包含所有进程
x 表示前台进程
STAT 表示进程状态
进程的状态:运行态running (R) 就绪态 runnable(R) 停止态stopped(T)
睡眠sleep:【可中断睡眠(S),不可中断睡眠(D)】 僵死态(Z)
< 高优先级的进程
N低优先级的进程
s 会话的发起者(leader)
+ 前台进程组中的进程
l 多线程的进程
ps –eo 自定义显示
pgrep grep 风格来显示进程
信号:进程间通信的一种机制,很小的信息,由一个进程发个另一个进程。
查看可用信号:kill –l
man -7
ctrl+C 一般就是信号SIGINT 打断
kill –n PID 默认选择15
kill –SIGKILL PID
killall comm. 把comm的全部删除 不能跟进程号 要跟发起这个进程的命令
pkill 以匹配的方式把进程kill掉。
前面讲过,进程是有优先级的,静态优先级 0-99,动态优先级100-139。数字越小,优先级越高。
有一种值nice,可以调节优先级,默认nice值都为0 -20—19
0——》5优先级降低了
只有管理员才能把nice调低,其他的用户只能调高
两种方式调节nice值:(1)启动命令的时候明确指定:nice –n N bash;
(2)renice 进程号(普通用户只能调高,不能调低)。
top 用于动态查看进程信息 通常每隔5s刷新一次
-d 指定每隔多长时间显示一次 默认5s
-b batch mode 批方式来显示 类似于ps
-n N指定在-b模式下显示几次
gnome-system-monitor
作业管理:job 一个任务包含了多个进程
加&,会释放命令提示符,将作业转入后台执行
crtl + Z 直接把作业送到后台去
bg %n 省略号可省 把一个前台作业送到后台去
fg 把一个后台作业送到前台去 默认的是把带“+”号的作业调出来
fg %n 百分号可省略
删除作业的时候kill kill %3 “%”不能省略
所有的作业在终端退出的时候都会自动终止。
nohup cp /etc/ /tmp/ -r & 送到后台运行,终端退出,依然可运行
jobs z查看当前正在运行的作业
[2]表示作业号
+当前运行的作业
Running状态
Firefox 那个命令运行的作业
Lecture 11
实现IP地址配置:GUI:窗口
CLI:ifconfig
system-config-network-tui
/etc/sysconfig/network-scripts/ifcfg-ehX
网卡命名:lo 本地回环
eth0, eth1 以太网卡
ppp0 拨号连接 串行的点到点的链接
ip addr show 显示当前网络正在使用的网卡
编辑/etc/modrobe.conf文件可以实现对网卡名字的修改
显示当前系统上所有的网络连接:ifconfig
启用一个网络连接:ifup
禁用一个网络连接:ifdown
图形窗口下指定IP地址:system-config-network-gui
临时设置 ifconfig
格式:ifconfig ethX IP/MASK 会立即生效,但是禁用启用后会失效,做集群的时候实现地址漂移
永久设置:(1)system-config-network-tui 字符界面下的图形窗口(重启网络服务)活用setup类似于windows 的控制面板
(2)vim编辑/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network 全局配置 亦可以设置网关
添加网关:GATEWAY=192.168.0.254
当二者网关不一样的时候,以/etc/sysconfig/network-scripts/ifcfg-ehX为准
修改主机名:
(1)编辑/etc/sysconfig/network HOSTNAME= 设置本机主机名 保证下次重启生效,永久生效
(2)hostname www.a.com 立即生效,只对当前有效
或者修改 /proc/sys/kernel/hostname echo “www.b.com” > /proc/sys/kernel/hostname 临时有效 跟hostname一样的效果
打印机
Printing Queue
使用服务 cups
service cups status
打印命令lp lpr
lpq lpstat查看打印队列
lprm cancle +打印作业号 用于删除一个打印作业
设置系统时间:
GUI:system-config-date NTP网络时间协议
hwclock -s以硬件时间为准
-w以系统时间为准
在指定的未来一次性的运行:at
周期性运行:crond
atq 列出当前系统作业队列
(ctrl+D)提交
移除一个作业 atrm =at –d
at只能在制定未来一次性的运行
watch 监控作业的执行情况,将结果输出地屏幕上
batch 类似于at 但是不需要指定时间,自己会选择在cpu利用率较低时候执行。
crond 系统守护进程 周期性地运行
系统cron 7个字段 /etc/crontab
从左自右:min,hour,day,mon,week,
用户定义的cron 命令:crontab
/var/spool/cron/usrname 6个字段
* :通配 -:范围 2-9 ,:离散的范围 2,6,9 / :每多长时间 */2 每两分钟
crontab -e创建
-l 列出 查看
-r 移除所有作业
anacron 如果因为关机作业没有执行,开机后会检查没有执行的作业
几个常用的参数变量:$# 保存当前通过脚本向命令行传递过来的参数的个数
[email protected] 保存所有通过命令行传递过来的参数 将每个字符串独立显示
$* 保存所有通过命令行传递过来的参数 将所有的参数当做一个字符串
$! 最近一次运行的进程的进程号
$$ 当前进程的进程号
$0 命令本身
lecture 12
三个查找工具:locate,find,Gnome Search tool
locate 全系统的级别查找,但是基于某个database,通常不存在,需要创建
模糊匹配
–i 忽略大小写
-n 指定在查找的时候只显示n行
updatedb 手动生成locate查找时所用到的数据库
find 【起始目录…】 【查找标准】 【执行的动作(默认print)】
-name 文件名精确匹配 严格区分大小写
find /etc –name “ pass”
-iname 忽略名字的大小写
-user 以文件的用户来查找
-uid 通过属主的ID来查找
-gid 通过属组的ID来查找
-group 以文件的属组来查找
支持正则表达式
-type
f d l b c s p 以文件类型作为标准来查找
连接多个条件: -a and -o or -not 取反 或者!
默认是and
优先级: not>and>or
例如:寻找属主是student 属组不是student的文件
书269练习3
根据权限来查找:
-perm mode 精确匹配
-perm +mode 由任何一个用户的权限满足即可 包含也可以 比如 7包含6
-perm –mode 所有类别用户的权限都要满足
-size 根据文件大小来匹配
-size n 精确匹配 写成1的情况比较特殊,只要小于1M都会显示,系统会将1默认为单位
-size +n +1M 大于nM
-size -n -1M 小于nM
根据访问时间
-atime 3正好三天 +3超过三天 (三天前访问过) -3三天以内(三天内访问过)
-mtime 以修改时间为选项
-ctime 以改变时间为选项
-amin 3 3分钟
-mmin 以修改分钟为选项
-cmin 以改变分钟为选项
查找后执行的动作:
-ls
-exec command {}口\; 找到后执行
-ok command {}口\; 任何一个操作执行前先进行提示
lecture 13
客户端:图形界面下的访问工具,如浏览器
wget: 非交互式网络下载工具
--tries 指定重试次数
--wait 需要等待时间(s)
--recursive 递归下载
--convert 转换所有链接到当前目录下载目录,转换成本地可用链接,以本地链接的方式进行查看
links 纯字符界面下查看网页
从网上下载软件并安装到本地的过程:
cd /etc/yum.repos.d
wget ftp://192.168.0.254/pub/gls/centos.repo
yum install evolution thunderbird
mutt 非图形界面邮件客户端
pidgin 即时聊天工具
Nautilus 实现文件的访问和传输
SSH 字符界面下连接一个linux主机 secure Shell
OpenSSH
客户端工具:ssh,sshd(服务器端工具),scp在不同的主机之间安全的copy文件
sftp 加密的方式实现文件的传输
ssh hostname
ssh [email protected]
ssh –l user hostname
ssh –X 192.168.0.120 在本地服务器上作为X server去执行远程服务器上的图形窗口的命令。
ssh 192.168.0.123 ‘ifconfig’ 在对方服务器上执行一个命令,并将命令的结果取回来
scp ./ centos.repo 192.168.0.210:/tmp将本机目录下文件拷到远程服务器指定目录下
scp 192.168.0.120:/etc/fstab ./ 将远程服务器目录下文件拷到本地指定目录下
-r 递归拷贝 将目录下的文件拷贝过来
-p 保留时间标签和权限信息
rsync 只拷贝目录下不同的文件,效率比scp高 默认是明文传输
rsync –e ssh 调用ssh工具代为传送 所以为加密传送
-r –a
ftp客户端:GUI:gftp gftp&打开图形界面
CLI:ftp lftp lftpget 不用登录直接下载
smbclient -L 192.168.0.1(访问windows的共享目录)
根据RH033课程整理
lecture 14
12月27号整理
用户:获取系统资源权限的集合。
管理员:UID 0
系统用户:UID 1-499
普通用户:UID >500
authentication 认证
authorization 授权
组: GID 容器 权限的集合
私有组:只有一个用户,组名和用户名是一样的,ID号也一样。
公共组:一个组中可能有多个用户。
系统组 :专门存储系统用户
AUTHENTICATION 认证
AUTHORIZATION 授权
/etc/passwd 冒号隔开 七个字段
1 2 3 4 5 6 7
1 用户名
2 密码占位符,有密码但是加密的,在/etc/shadow中
3 UID
4 GID 与/etc/group 有关
5 使用信息说明栏
6 用户家目录
7 用户默认shell
/etc/shadow 存放用户密码
使用md5,salt加密
单项加密:algo,定长加密,不可逆 ,特征码,雪崩效应
雪崩效应: 在任何时候,输入两段数据,在这两端数据中只要有一个二进制位不一样,则输出的结果中至少有一半都不一样
MD5 定长输出:128位 麻省理工学院 linux中广泛采用
sha1 160位 哈希算法
1 账号名称 必须要与/etc/passwd相同
2 密码 使用函数加密后的密码,如果第一个字符为“*”,“!”表示此账号不能使用
3 最近改动密码的日期,以unix元年为始
4 密码不可被改动的天数
5 密码需要重新设置的天数,默认9999,即不需要重新设置
6 密码变更前的警告期限
7 密码过期后还能再使用的天数
8 账号失效的日期
9 保留位
useradd :添加一个用户
-u UID 直接指定一个特定的UID给这个账号
-g GID 基本组
-G groups 附加组
-s shell 指定shell类型
-M 强制 不为此用户创建家目录
-m 强制 要建立使用者家目录
-c 说明信息
-d 指定某个目录成为用户家目录,而不使用默认家目录
chsh user2 改变用户的shell类型
-l 列出当前系统上可用的shell
-s 设定修改自己的shell
usermod
-u 改UID
–g 改GID
-G 修改使用者支持的附加组 –a 追加进去 二者通常一起用
-s 修改shell
-d 修改账号的家目录 –m 将原家目录的内容一同迁移到新家目录 二者通常一起用
-l 改变用户的login name
-c 改变用户的说明信息
-e 修改过期时间
-f 修改密码过期后还能再使用的天数
-L 将密码锁定
-U 将用户解锁 将/etc/shadow密码栏中的!去掉
passwd
-l 锁定账号
-u 将锁定的账号解锁
--stdin 将一串字符直接设定为密码
-n 密码不可被改动的天数
-x 密码需要重新设置的天数,即最长天数
-w 密码变更前的警告期限
-S 显示目前username的相关信息
/etc/group 文件
1 群组名称
2 群组密码
3 GID
4 支持的账号名称,账号以此组为附加组,多个账号之间用逗号隔开
/etc/gshadow 文件
1 群组名称
2 密码栏,开头为!表示无法登录
3 群组管理员的账号
4 该群组所属的账号 与(/etc/group相同)
groupadd
-g GID 用来直接给于某个GID
-r grp_name 建立系统群组
groupmod
-g 修改既有的GID数字;
-n 修改既有的GID名称
gpasswd 给组设一个密码
newgrp 临时性切换自己的组到另外一个组,给组加一个密码,提示用户输入
userdel 删除一个用户
-r 连同使用者家目录一起删除
使用者身份切换
su
- 如果执行 su - 时,表示该使用者想要变换身份成为root,且使用root的环境设定参数档,如/root/.bash_profile等
-l 后面可以跟使用者
过去一段时间内曾经成功登录系统的用户
/var/log/wtmp<------list –n 最近10次的登录
过去一段时间内尝试登录系统但没有成功的用户
/var/log/btmp <-------lastb –n 最近10次尝试登录但没有登录成功的用户
umask 设置仅对当前shell生效
SUID 任何一个文件置了SUID位,当一个用户去执行这个文件时,默认的执行者身份不是这个用户,而是以文件属主的身份去执行。 chmod u+s file
SGID 当一个用户去执行这个文件时,默认的执行者身份不是这个用户,而是以文件属组的身份去执行。 chmod g+s file
sticky 粘滞位,通常对目录来讲的,尤其是public dir 全局可写,
意思就是这个目录是公共的,任何人都可以写,但只能删除自己写入的内容。
chmod o+t file
chmod (1/2/4)755 file
Lecture 15
文件系统:用于实现有效高效管理文件的机制。
windows 常用文件系统:fat32,NTFS
linux支持类型(靠虚拟文件系统(VFS)来支持):
fat32,NTFS,(windows);
jfs(IBM),xfs(SGI),(UNIX);
reiserfs;
iso9660;
网络文件系统:NFS,SMBFS,
集群文件系统:GFS(全局文件系统),GFS2,OCFS(oracle)
常用类型:ext2,ext3(RHEL5),ext4(RHEL6默认)
VFS:虚拟文件系统,相当于一个接口,将不同文件系统转换成磁盘上真正使用的文件系统。
ext3 比ext2多了一个日志功能和acl(访问控制列表)功能。
格式化的过程就是建立文件系统的过程。
Boot Block |
Block Group 0 |
Block Group 1 |
. . . . . |
Block Group n |
Super Block |
GDT |
Block Bitmap |
Inode Bitmap |
Inode Table |
Data blocks |
Boot Block:引导块,引导此分区上系统的一些相关信息。
super Block超级块:放的整个文件系统的信息,包括数据块的个数,大小,一共多少个块组,每个块组中包含多少个数据块等等。属于全局描述信息,描述整个分区的信息。
GDT块组描述符:描述这一块组的信息。
Block Bitmap:按位图的方式来存储数据块是否可用。0表示可用,1表示不可用。是实现快速决定一个大容量空间中的文件系统的块是否可用的机制。
inode Bitmap:用来存储当前磁盘分区上一共有多少个inode号,以及使用与否。
混合索引方式(《计算机操作系统223页》)
1) 直接地址
为提高对文件的检索速度,在索引节点中可设置10个直接地址项,即用iaddr(0)~iaddr(9)来存放直接地址。换言之,在这里的每项中所
存放的是该文件数据项所在盘快的盘块号。假设每个盘块大小为4KB时,当文件不大于40KB时,便可直接从索引节点中读出该文件的全部盘块号。
2) 一次间接地址
对于大中型文件而言,只采用直接地址是不现实的。为此,可
再利用索引节点中的地址项iaddr(10)来提供一次间接寻址。这种方式的实质就是一级索引分配方式。图中的一次间址块也就是索引块,文件系统分配给文
件的多个盘块号计入其中。在一次间址块中可存放1K个盘块号,因为允许文件长达4MB。
3) 多次间接地址
当文件大于4MB+40KB时(一次间址与10个直接地址项),系统还须采用二次间址分配方式。这时,用地址项iaddr(11)提供二次间接地
址。该方式的实质是两级索引分配方式。系统此时是在二次间址块中记入所有一次间址块的盘号。在采用二次间址方式时,文件最大长度可达到4GB。同理,地址
项iaddr(12)作为三次间接地址,所允许的文件最大长度可达到4TB。
目录仅仅是一种寻址路径而已。是一种特殊的文件,也需要一个inode的号指向一个磁盘块。通常一个目录只占一个磁盘块。大小为4096k。块中的内容如图所示:
块里边存放的是一个表,表里是这个目录下所有的文件的名字及inode号。每一行(条目)用以指定目录中一个文件的属性。每一个目录都有两个特殊文件:“.” 目录自身 ,“ . .”当前目录的父目录。
一个partition(filesystem)所能容许的最大文件数,与inode的数量有关,因为一个文件至少要占用一个inode。
根是一种特殊的文件系统,称之为“rootfs”,是自引用的。通过根的inode号,找到根所存储的磁盘块。在这个块下存放的是根下每个目录下所存储的文件名和inode所对应的关系。
读取一个文件的简单流程(以/etc/crontab为例):——《鸟哥的Linux私房菜》
1.操作系统根据根目录(/)的相关资料取得/etc这个目录所在的inode,并前往读取/etc/这个目录的所有相关属性;
2.根据/etc的inode的资料,可取得/etc这个目录底下所有的文件的相关数据时放置在哪一个Block中,并前往该block读取文件的相关内容;
3.由以上步骤的block可知道crontab这个文件的inode所在地,并前往该inode;
4.由以上步骤的inode当中,可取得crontab这个文件的所有属性,并且可前往由inode所指向的block区域,顺利的取得crontab的文件内容。
链接:通过多条路径找到同一个文件。类似于windows下的“快捷方式”。
硬链接:两个文件名指向同一个inode。但是两个文件必须在同一个磁盘空间。如果其中一条路径被删除,只要还有其他路径能指向这个inode,那么这个文件依然存在。
硬链接文件本身也是普通文件。
ls –l 第一个数字显示的是硬链接的次数。每一个目录都是2,因为每个目录被自身和父目录所引用。
软链接:类型为“l”,也成为符号链接。创建一个软链接就相当于创建了一个新文件。有自己的inode号。在inode所指向的磁盘块上放的是所链
接的文件的路径。事实上,在创建一个软链接时,如果路径非常短的话就直接放在inode的内部,如果路径足够长,才从新开辟一个磁盘块去存放路径。(可以
跨分区,可以指向目录),一旦源文件被删除,那么链接也就失效了。
使用命令:ln 创建一个硬链接
-f 如果目标文件存在,就主动将目标文件直接移除后再建立
-s 创建一个软链接
创建一个硬链接:
创建一个软链接:
文件大小指的是源文件路径字符的长度。
小常识:我们平时删除文件通常只是将文件的inode号给删除了,文件依然存在。
特殊文件:b 块设备 c 字符设备 不占用空间大小
第一个数字表示主设备号:指的是设备类型。第二个数字表示次设备号。
检查磁盘空闲空间 baobab 图形界面查看
du 显示磁盘空间利用情况
-a 列出所有的文件与目录容量,预设仅统计目录下面的文件量而已
-s 显示目录总共占用多大空间
-h 以用户易读的方式做单位换算 默认kb
-k 以KB列出容量显示
-m 以MB列出容量显示
du –sh 经常用
df 显示磁盘空间的空闲情况
-h 以用户易读的方式做单位换算 默认kb
-T 显示磁盘分区文件系统类型
-i 显示inode号一共有多少个
-a 列出所有的文件系统,包括系统特有的/proc等文件系统;
-k 以KB 的容量显示文件系统
磁盘分区:
linux上所有设备都对应一个设备文件放在/dev目录下。
IDE:/dev/hd*
SCSI SATA USB都在/dev目录下以/dev/sd*来表示
硬盘接口类型不同,显示文件名称的表示方式也不一样。
同一块硬盘上的不同分区用/dev/sda[0-3]来表示。一个硬盘上最多有四个主分区,或者三个主分区加一个扩展分区。
挂载:当我们所建立起来的磁盘文件系统想在linux上面启用的时候,一定要将它挂在到文件系统上。而所谓的挂载点则是该分区所在的目录,且该目录下的所有目录都归在该分区所有。挂载的时候得先建立起挂载的目录才行!
如果用来挂载的目录原先不为空,那么挂载了文件系统之后,原目录下的文件就是暂时隐藏起来,这里注意,并不是消失了。等到原partition被umount之后,则该目录的内容就会再次显示。
mount /dev/sdb1(设备) /mnt/usb(目录)
-a 依照/etc/fstab 的内容将所有的相关磁盘都挂上来
卸载:umount /dev/sdb1 或者 umount /mnt/usb 一定要卸载,否则数据读入可能会失败
-f 强制卸载
sync (同步),手动写入,将内存缓冲区中要求写到硬盘的内容依次写入到硬盘中。
压缩、解压缩:
compress/uncompress .Z 过时的命令
gzip/gunzip 后缀:.gz 压缩的时候会删除源文件 还可以指定压缩比1---9, 默认级别为6。 一般来说,数字越大。压缩比越大,压缩越慢。gzip –d === gunzip
bzip2/bunzip2 后缀:.bz2 比gzip更新,压缩比更大 bzip –d ====bunzip2
gzip ,bzip2 只能压缩单个文件,不能对目录进行压缩。
zip/unzip 后缀:.zip 可以压缩目录,需要指定压缩后文件的名字,能够保留原文件
格式:zip 压缩后文件名 原文件1 原文件2 原文件3 ……
归档:把多个零散的文件打包成一个单个文件。不是压缩,只是打包封存起来。
tar –c 建立一个压缩文件(create)
-x 解开一个压缩文件
-t 查看tarfile里面的档案
在参数中 c/x/t仅能存在一个,不能同时存在
-z 用gzip压缩
-j 是否用bzip2压缩
-v 显示整个创建过程或者解压缩过程
-C 指定展开到什么位置
-f 使用文件名 eg :tar –zcvPf tfile sfile 在f之后要立即加上文件名
-p 使用原来文件的属性(permission)
-P 可以使用绝对路径来压缩
tar –cf myfile.tar file1 file2 file3…. 只归档不压缩
gzip myfile.tar 再压缩即可
tar –xf myfile.tar 将内容展开,重新释放
tar -tf 不用展开的情况下看看所归档的文件
tar 可以直接调用压缩工具,即归档,又压缩
tar –zcf 使用gzip进行压缩
tar –jcf 调用bzip2进行压缩
tar –zxf 解压缩以gzip压缩的文件
tar –jxf 解压缩以bzip2压缩的文件
2011年1月2号整理
根据RH131课程整理
访问系统常用接口:CLI 、GUI。
CLI(命令行):提供一个输入命令的提示符而实现对系统的访问。
显示设备
物理终端:(设备文件)——>/dev/tty0
直连到linux系统所直接安装到的那台主机上的那台显示设备。
虚拟终端:/dev/tty1-tty6 (ctrl+Alt+F1——F6)
在同一个主机上,提供六个不同接口来访问同一个系统,对物理终端的虚拟。
程序:mingetty 在系统初始化完成以后,根据/etc/inittab这个文件的指示,结合init进程,初始化启动几个终端的那个程序。
串行终端:通过串行链路设备接入进来对系统进行访问的设备
(设备文件)/dev/ttyS* /dev/xvc0(虚拟机上的串行终端)
程序: agetty 启动串行终端
系统控制台:/dev/console 逻辑设备,
系统默认的逻辑终端设备,在系统内核在初始化过程中虚拟出来的,要想显示出来必须跟物理设备关联起来(默认/dev/tty0或/dev/fb0(虚拟机上))。默认情况下系统的启动信息都是到系统控制台上去的。
更改设置:console=ttyS0 consle=ttys1
可以设置多个参数,但只有最后一个才会显示启动信息。
模拟终端:(设备文件)——>/dev/pts/N
在X window打开的终端,
通过SSH远程连接上去的terminal
通过,telnet远程连接上去的terminal
tty 查看当所对应的终端设备文件
通过screen打开不同的屏幕,类同于在X-window上打开多个窗口的机制
GUI(图形用户界面)
X protocol(C/S),x386(商业实现) XFree86(开源实现)——>最新版X11R7 R(release)
Xorg渐渐取代XFree86
XFree86,Xorg只是提供了驱动显卡的驱动程序,并提供了几个额外的模块,让显卡能够真正工作起来,为图形应用提供低层框架的工具。
窗口管理器
桌面管理器:提供所有窗口的母窗口。Gnome 、KDE
X &——> xterm ——>twm &(窗口管理器)——>gdm(登陆管理器)——>gnome-session(桌面)
查看X server 版本号
prefdm:启动一个图形界面
Xorg.Conf的配置内容:
screen:支持在字符界面下打开多个模拟终端
查看已经关闭的终端:
权限的传递:
用户:管理员(root) 普通用户
sudo
/etc/sudoers 定义哪些用户可以在哪些主机上以什么身份执行哪些命令 who where=(who) what
例如: A 192.168.0.0/24=(root) /sbin/ofcpnfig
RH131
可以使用visudo命令编辑
添加:
百分号表示是一个系统群组
被添加的用户在使用命令执行时需要在前边加上sudo 关键字
默认五分钟内执行sudo命令不用输入密码,很人性化的。
定义一个用户组:User_Alias NETWORK=A,B,C组名必须是大写英文字母
lecture 2
操作系统是物理主机的虚拟抽象
yum yellow update manger
rpm redhat package manager——>rpm package manager
命名格式:package_name-version-release.arhc.rpm
rpm –i 或 –install
-v 显示安装进度
-h 以安装信息列显示安装进度
卸载软件包 rmp –e packagenamne(只需要指定软件包的名字)
--nodeps忽略依赖关系
--replacepkgs 重新装一次,替换原来的包,达到修复的目的
--force强行安装
--test 测试一下
--justdb 仅仅更新数据库
升级 rpm –F升级 纯粹升级,在原来的基础上进行
rpm –U更新 原来的包存不存在都没关系 --oldpackage 降级安装
内核一般不能以升级的方式安装
-q 查询
-qi 列出详细信息
-ql 列出该软件包的所有文件与目录所在完整名(list)
-qf 找出该文件是由那个安装包来的
-qc 列出安装包完成后所生成的配置文件
-qR 列出软件包的依赖信息
--querytags 定制查询
--scripts 查看安装时执行了哪些脚本文件
校验:
-V pkg_name 查看系统的安全信息
tripwire
数字签名,保证数据完整性
单项加密:MD5
rpm --initdb 更新信息的 不会覆盖原有数据库
rpm --rebuilddb 无论如何都要覆盖原有数据库
rpm –qa gpg-pubkey查看系统公钥
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
rpm –K package_name 校验
--checksig package_name 校验
三种文件共享方式:file:/// 、 http:// 、ftp://
yum –y install pkg_name 不提示,默认安装
-y reintall 重装
yum remove 卸载软件包
update 升级软件包 可以升级kernel
yum list all 列出所有的软件包
yun list installed 列出安装过的
yum provides|whatprovides 谁提供的
grouplist 列出已装组和所有可用组
groupinstall 组安装
localinstall
建立一个本地yum源
直接将光盘上的软件包作为yum源
先挂载光盘
createrepo 直接创建一个yum源
Lecture 7
硬盘盘面结构示意图
硬盘片旋转一圈所画出来的就是磁道(track)
所有硬盘片上相同半径的那个磁道就组成了柱面(cylinder)
数据是按照柱面来存取的。
第0磁道上的0扇区不能被分区。用于表示当前磁盘上有几个分区以操作系统所在的分区,成为引导扇区,MBR (主引导记录) 512B 前446B放置一段程序,成为boot loader
引导加载器,后64B用来标示分区,每16B用来标示一个分区
硬盘最小的存储单位是扇区(512B),数据所存储的最小单位是逻辑块(block)
每个分区就是一个文件系统,而每个文件系统开始位置的那个块就称为超级块(superblock)。超级快的作用是存储文件系统的大小,空的和填满的块,以及它们各自的总数和其他诸如此类的信息。
查看当前系统上所有的块存储设备及分区信息:fdisk –l
* 表示在此分区上有操作系统
查看系统分区信息:
HAL 硬件抽象层:实时探测内核中新插入的设备,将新插入的设备属性信息,通过HAL将这些信息导入到用户空间的进程中去。
hal-device 输出整个系统上所有的硬件设备信息
fdisk /dev/sda 对硬盘设备进行分区
mkfs——>make filesystem
-t type 类型
mkfs –t ext3= mkfs.ext3
mke2fs 创建ext2文件系统
-j 格式化为ext3
-l 设定卷标
-b 指定块大小 默认1024B=1K
-c 慢速格式化
-i 指定字节和inode比率
-n 指定一个分区上inode个数
-m为超级用户在当前分区上所预留的空间大小的比率 默认百分之五
mount [options] [-o options] /dev/device /path/to/mount_point
不加参数显示当前系统上已经挂载的设备和类型
umount /dev/device [/path/to/mount_point]
-o rw 读写挂载 (自定义选项)
-a 挂载/etc/fstab 所有设备
remount 重新挂载
mount –n –o remount,rw 重新挂载
gnome-mount 自动挂载 默认在media目录下
gnome-umount 卸载
partprobe /dev/sda 更新内核中分区信息
如果需要自动挂载的话需要修改/etc/fstab
要挂载的设备 挂载点 文件系统类型 挂载选项(-o指定) 是否需要转储(1备份) 自检标识(根分区为1 其他分区为2)
lecture 5
系统初始化
显示系统版本号
uname –a 显示所有信息
-r 显示内核发行号
-n 显示当前系统名称
-v 显示内核版本(什么时候编译的)
-p 显示系统架构
运行级别 runlevel 在启动的时候所启动的服务不一样
0——6
查看运行级别
init 0 关机
init 6 重启
init 3 字符界面正常模式
init 5 图形界面正常模式
init 1 单用户模式 不启动网络服务 用于修复系统 不需要用户认证登录
init 2 多用户模式 不启动NFS服务
init 4 保留
s S single:单用户 /etc/rc.d/rc.sysinit
emergency: 紧急模式,不会读取/etc/rc.d/rc.sysinit 用于系统修复
init N 切换运行级别
chkconfig –list 列出所有的服务在不同运行级别下开启情况
chkconfig –level nnnnnnn service_name on|off 特定的关掉某个级别下的服务
没加级别默认是2.3.4.5
ntsysv –level 2345
开机启动流程
1. 加载BIOS信息,并取得第一个启动设备的代号;
2. 读取第一个启动设备的MBR的引导加载程序(lilo,grub等)的启动信息;
3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备;
4. 核心执行init程序并获取运行信息;
5. init执行/etc/rc.d/rc.local文件;
6. 启动核心的外挂模块(/etc/modprobe.conf);
7. init执行运行的各个批处理文件(scripts);
8. init执行/etc/rc.d/rc.loacl文件;
9. 执行/bin/login程序,等待用户登录;
10. 登录之后开始以shell控制主机。
BIOS(Basic Input Output
System)记录了主机板的芯片组与相关的设定,如CPU与接口设备的通信频率、启动设备的搜索顺序、硬盘大小与类型、系统时间、外部总线是否启动即插
即用、各接口设备的I/O地址,以及与CPU通信的IRQ中断等信息。
|
BIOS与引导加载程序及核心加载流程示意图
init处理系统初始化流程(/etc/rc.d/rc.sysinit)
/etc/rc.d/rc.sysinit主要任务有:
自定义核心模块的加载可以将整个模块写入到/etc/sysconfig/modules/*.modules中。
启动系统服务与相关启动设置文件(/etc/rc.d/rc.n 与/etc/sysconfig)
目录里边文件全是软链接,所以/etc/init.d与/etc/rc.d/init.d是一样的。
以S为开头的文件,为启动时需要“启动,start”的服务
以K开头的文件,为“关机时需要关闭的服务,stop”的文件链接
S与K后面的数字,表示该文件的执行顺序 范围0——99 数字越小,优先级越高
用户自定义引导启动程序(/etc/rc.d/rc.local)
任何想要在开机时执行的工作,直接写入到/etc/rc.d/rc.local。该工作就会在启动的时候自动加载。比如自己制作的shell脚本。
根据/etc/inittab 设置加载终端或X-Window界面
运行等级为2345时,都会执行/sbin/mingetty 而且执行6个。
mingetty 启动虚拟终端
如果运行级别为runlevel 5 init还会执行/etc/X11/prefdm –nodaemon 命令,启动X-window。
对模块进行一些参数的设计 /etc/modprobe.conf
/etc/sysconfig/* 再整个启动过程中,在/etc/sysconfig读取服务的相关设置
核心与核心模块
存放位置:
引导加载程序:Grub
grub对硬盘的代号设置于传统的linux磁盘代号完全不同,如(hd0,0)
1. 硬盘代号以小括号()括起来
2. 硬盘以hd表示,后面接一组数字
3. 以“搜索顺序”作为硬盘的编号,而不是根据硬盘排线的排序
4. 第一个搜索到的为0,第二个为1号,以此类推
5. 每个硬盘的第一个分区代号为0,以此类推
第一个硬盘MBR安装处的硬盘代号是“(hd0)”,第一个硬盘的第一个分区的超级块代号是“(hd0,0)”,第一个硬盘的第一个逻辑分区的超级块代号是“(hd0,4)”。
(0——3)——>(P+E)
如果/boot单独分区,则/vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
如果boot在根目录下,则/boot/vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
内核=内核核心+模块(kernel object)
内核本身就是模块化设计,只提供了最核心的功能,核心上有很多接口,可以去加载对应的模块,其他的功能都被做成了二进制的模块,放在/lib/modules/`uname –r`/
kernel里边的内容:
lsmod 显示当前已加载模块
modprobe 模块名 加载模块
-r 模块名 卸载模块
ldd /bin/ls 查看一个命令执行过程中需要调用哪些库
Lecture 10 Filesystems for Group Collaboration
用户 组 权限
SGID 用来创建一个共同(collaborative)的目录
当一个目录被置SGID位时,在此目录下所创建的文件同属该目录所在的组,而不是创建者的基本组
chmod g+s directory
Sticky (粘滞位)允许只有文件的创建者可以删除该文件
通常情况下对一个目录具有写权限的用户可以删除此目录中的任何文件,不管该文件的属主或者权限
chmod o+t directory
acl: access control list 访问控制列表
在不改变文件属主属组的情况下,实现设定某个用户的访问权限。
getfacl 查看某个目录的访问控制权限
setfacl -m 设定权限
-x 取消权限
格式:
setfacl -m u:<user>:<perms> filename
新建的磁盘分区在挂载到目录下后默认不支持acl功能,需要在挂载的时候指定acl,如:
mount -o remount,acl /dev/sda5 /share
开机自动挂载:编辑/etc/fstab文件,在defaults后面加上acl
setfacl -x u:< user> filename 取消acl 的功能
为组设定acl:setfacl -m g:<group>:<perms> filename
取消:setfacl -x g:<group>:<perms> filename
setfacl -m d:u:<user>:<perms> filename 为目录创建默认权限,在目录中创立的任何文件都会继承目录的访问控制列表
setfacl -m m:<perms> filename设置掩码位
Lecture 8 Additional Storage
Linux上所有的存储设备都需要有一个设备文件对应,这些设备文件位于/dev/目录下。
USB,SCSI,SATA,iscsi设备以sd开头,IDE以hd开头。表示方式:/dev/sd[a-z]N。
这些设备文件由udev创建,特殊文件,没有大小,有主设备号和次设备号。主设备号用于描述这些设备属于哪个总线系统(哪类设备)。属于同一个总线的设备属于同一类设备,一个总线上可以挂载不同的主设备。次设备号用于区别总线上不同的设备。
mknod ,MAKEDEV 创建一个设备
mknod /eev/mydevice [c|b] Major_num Minor_num
手动创建的设备文件在系统重启后会丢失。
/dev/null 黑洞(相当于一个垃圾桶)
/dev/zero 0 零设备 初始化磁盘设备
/dev/random /dev/urandom 随机数
所有字符设备都是线性的。所有的块设备都是随机设备。字符设备和块设备没有大小。
lsmod 显示所有模块的状态信息
modinfo 显示一个模块的摘要信息
modprobe 装载 卸载模块
-r 卸载模块
depmod 生成模块间依赖关系的列表
insmod 需指定具体路径
rmmod 从内核中移除模块
-f 强行卸载
mkinitrd 自动生成一个initrd文件。
--with 用于额外指定附加什么样的模块
sfidsk 可以在脚本中使用的分区工具,可以保存当前磁盘分区的分区表,能够备份磁盘分区
sfidsk -d /dev/sdb > /root/part_back/sdb.partitions 备份
sfidsk /dev/sdb </root/part_back/sdb.partitions 恢复
partprobe 通知内核更新一下分区信息 ,存放位置:/proc/partitions。
格式化磁盘:
mkfs /dev/device 默认是格式化为ext2
mkfs -t ext3=mkfs.ext3
-L label 为磁盘添加卷标
mkfs -t -L MYDEV /dev/sda5
也可以为卷标指定一个UUID(随机数)
blkid 查看id 和卷标
e2label /dev/sda5 查看卷标
设定卷标
e2label /dev/sda5 DEV
mount LABEL=DEV /mnt/test 使用卷标挂载
mke2fs -L label 指定卷标
-j journal 有日志功能 (ext3)
-b 指定block块大小 Specify the size of blocks in bytes。
-c 检查坏块(不常用) Check the device for bad blocks before creating the file system.。
-i bytes/inode 字节和inode的比率。Specify the bytes/inode ratio.
-N 手动指定bytes/inode
overrides the default calculation of the number of inodes that
should be reserved for the filesystem (which is based on the number of
blocks and the bytes-per-inode ratio). This allows the user to
specify the number of desired inodes directly.
-m 预留比例,为管理员所预留的磁盘分区的块数占总数的比例。
Specify the percentage of the filesystem blocks reserved for the
super-user.This avoids fragmentation, and allows root-owned
daemons, such as sys-logd(8), to continue to function correctly after
non-privileged processes are prevented from writing to the filesystem.
The default percentage is 5%.
tune2fs 专门用于调整mke2fs创建的文件设备的信息
adjust tunable filesystem parameters on ext2/ext3 filesystems
-L 改卷标
-j 把ext3文件格式转换为ext3格式
-c 指定最大挂载次数,超过指定次数后分区会自检 0 禁用自检。
Adjust the number of mounts after which the filesystem will be checked by e2fsck(8)
tun2fs -c0 /dev/sda5
-i 经过多长时间要自检一次 ,默认180天。
Adjust the maximal time between two filesystem checks
-m 调整预留比例
-r 明确指定保留多少块
-u 保留空间可以供谁用
-o 用于调整默认挂载选项
mount -o 调整默认选项
rw 可读写
suid 允许设定了suid和sgid的执行正常功能
dev 允许启用设备文件
exec 允许执行上面的二进制文件
auto 可以自动挂载
nouser 禁止普通用户挂载此设备
async 异步写入,提高磁盘性能
acl 允许使用acl功能
-t 指定挂载的时候所使用的文件系统类型
mount -o defaults,acl /dev/sda5 /mnt/test
默认显示挂载属性
loop 挂载本地回环设备
mount -o loop /root/boot.iso /mnt/test
user_xattr 允许用户使用文件的扩展属性
mount -o defaults 直接设定默认选项
dumpe2fs 显示一个e2fs文件设备的详细信息
findsfs label 根据卷标来查找设备
findfs LABLE=DEV
remount 重新挂载
/etc/mtab 保留了当前系统上挂载的所有的设备,无论是自动挂载(/etc/fstab)的还是用户手动挂载的
umount -a /etc/mtab
卸载mtab下的文件,即卸载掉所有挂载的设备
fuser -v 显示哪个用户正在访问挂载点
fuser -km 将访问用户强行踢出
再卸载
创建一个交换分区:
mkswap /dev/sda6 将某一个分区格式化为虚拟分区
swapon /dev/sda6 启用虚拟分区
swapoff /dev/sda6 关闭虚拟分区
swapon -a 启用所有交换分区
创建一个交换分区:
dd if=/dev/zero(数据来源) of=/var/local/swapfile(放到哪里去) bs=1k(一次读多大数据块)count=1M(读取多少个这样的数据块)
mkswap /tmp/swapfile
swapon /tmp/swapfile
free 查看
RH131 Lecture 9 User Administration
vipw 编辑/etc/shadow文件 在编辑的时候锁定此文件
vigr 编辑/etc/gshadow文件 在编辑的时候锁定此文件
Quota 磁盘配额: 用于定义某个用户在磁盘上或者某个分区上最多只能使用的磁盘空间,或者最多只能建立的文件的个数。
磁盘配额在内核中实现,实际上是在文件系统上实现的,跟文件系统相关。只能对一个分区来做。
两种配额标准:空间配额:定义一个用户最多只能使用多少个磁盘块,以k为单位。
文件配额:定义一个用户最多只能使用多少个文件。
两种配额类型:软限制:可以超出限定的配额数。
硬限制:无论如何不能超过。
二者可以结合起来使用。
磁盘配额对管理员无效。
在文件系统上,使用磁盘配额时要在分区上指定特殊的挂载选项。
两种策略:usrquota (针对用户) grpquota(针对组) 各自实现,存储在各自特定的文件中。在某个分区启用了配额功能之后,会在从磁盘分区的根目录上创建两个文件:
aquota.user aquota.group,记录用户配额的定义。
实现过程:编辑/etc/fstab文件,在defaults 后面加上使用的策略
重新挂载,查看:
quotacheck 默认创建aquota.user aquota.group两个文件
-c 检查aquota.user aquota.group,无论文件是否存在,均重新创建
-u 检查用户配额
-g 检查组的配额
-m 无论如何,不要把此文件系统挂载为只读文件系统
quotaon 打开某个文件系统上磁盘配额功能 quotaoff 关闭
edquota -u(可省略) username 编辑某个用户的磁盘配额
su 到student下进 行验证:
使用dd命令验证一下:
限定用户使用的文件数,使用edquota编辑
总结:1.启用usrquota,grpquota
2.检查对应分区所挂载目录下是否存在aquota.user 或aquota.group两个文件,如果没有,使用quotacheck -cugm来创建
3 quotaon 启用此分区上配额
4 编辑用户配额
edquota -p 把一个用户的配额复制到另一个用户上
setquota 在脚本中以非交互的模式实现磁盘配额
edquota -t 改变默认软限制和硬限制用户所能够使用的宽限期
warnquota /home 报告当前系统上使用磁盘配额的文件系统上任何一个超出配额的用户,向其发送邮件通知。
quotaoff /home 临时性地关闭磁盘配额
lecture 3 system service and security
几个常用的日志信息:
/var/log/dmesg 记录内核在启动过程中所产生的信息
命令:dmesg 查看系统引导过程中所产生的信息
/var/log/messages 系统标准日志文件
使用tail 命令查看 -f 不用退出就可以查看日志文件里实时产生的新的信息
/var/log/maillog 邮件系统所产生的日志信息
/var/log/secure 记录用户账号认证过程中所产生的一些关于账号的敏感信息
安全 ,认证,及xinetd的信息
只有管理员才能查看
/var/log/audit/audit.log 审计日志,由SElinux所产生的审计用户操作信息的一些日志信息。
命令:ausearch aureport 查看
当日志信息增长到一定程度后会做日志滚动
logrotate 将旧的数据更名,并建立新的日志文件
syslogd 系统服务 用于实现日志信息的统一调配
klogd 记录由内核所产生的日志信息
syslogd和klogd都通过syslog这个服务来实现
syslog的配置文件:/etc/syslog.conf
产生日志信息的软件 存放位置
“-” :异步写入
facility·priority 设施.级别
设施:某一类程序
auth:系统认证产生的信息
authpriv:访问控制所产生的信息
daemon:后台进程或系统进程(通常是内核)所产生的日志信息
kern:内核所产生的信息
mark:syslog自身对于某些个日志信息打上标记之后进行信息记录(一般是只记录打过标记的信息)
user:默认的facility,记录跟管理员无关的用户进程所产生的信息
local7:系统启动过程中所产生的信息
* 所有
lpr 关于打印的信息
mail 关于邮件的信息
news 关于新闻组的信息
日志级别:
默认会记录比定义级别高的所有日志信息,在级别前加“=”表示只记录定义的级别的日志信息。“!”表示只记录定义级别以下的日志信息。
cron 任务计划
sysytem cron 操作系统为了自身的运行需要定时执行的任务 /etc/crontab
user cron 某个用户自身所定义的任务计划 /var/spool/cron/username/
run-parts 命令:运行目录下的每个脚本
*:通配符 ,代表任何时候都接受 ∕n:每隔N单位间隔
-:取连续范围 ,:取离散范围
重启crond服务:/etc/rc.d/init.d/crond restart
anacron,将在过去所定义的时间之内没有执行的cron任务重新执行一遍。
第一段:在多长时间之内没有执行过的任务要执行一次
第二段:在系统开机之后要等待多长时间才执行
第三段:描述信息
第四段:要执行的任务
anacron进程默认不会启动。
default daily cron jobs
tmpwatch:清除过期的文件
logrotate:日志滚动
logwatch:查看日志文件,并生成一个报告以邮件的形式发给管理员。
1 编写一个脚本使我们在写一个脚本时自动生成"#!/bin/bash”这一行和注释信息。
#!/bin/bash
if ! grep "^#!" $1 &>/dev/null; then
cat >> $1 << EOF
#!/bin/bash
# Author:
#Date & Time: `date +"%F %T"`
#Description:
EOF
fi
vim +5 $1
任意三个整数,判断最大数。
#!/bin/bash
echo "please enter three number:"
read -p "the first number is :" n1
read -p "the second number is:" n2
read -p "the third number is:" n3
let MAX=$n1
if [ $n2 -ge $n1 ]; then
MAX=$n2
fi
if [ $n3 -ge $MAX ]; then
MAX=$n3
fi
echo "the max number is $MAX."
求100以内偶数的和。
方法一:
#!/bin/bash
sum=0
for I in {1..50}; do
sum=$(($sum+2*$I))
done
echo "the sum is $sum"
方法二:
#!/bin/bash
let SUM=0
for I in $(seq 1 100); do
if [ $[$I%2] == 0 ]; then
let SUM+=$I
fi
done
echo "the sum is $SUM."
利用for语句如何ping C类网,如何ping B类网。
ping C 类网
#!/bin/bash
read –p “C network:” MYNET
PINGNET=`echo $MYNET | sed ‘s/\([0-9.]*\)\ .[0-9]*/\1/g’`
let I=1
while [ $I –le 254 ]; do
ping –c1 –W1 $PINGNET.$I &>/dev/null
[ $? –eq 0 ] && echo “$PINGNET.$I online.” || echo “$PINGNET.$I offline.”
let I++
done
ping B 类网
#!/bin/bash
read –p “B network:” MYNET
PINGNET=`echo $MYNET | sed ‘s/\([0-9]\{1,3\}\.[0-9]\{1,3\}\)\..*/\1/g’`
for P in {0..255}; do
for I in {1..255}; do
if ping -c1 -W2 $PINGNET.$P.$I &>/dev/null; then
echo "$PINGNET.$P.$I is online."
else
echo "$PINGNET.$P.$I is offline."
fi
done
done
提示输入一个用户名,判断用户是否存在,如果存在,显示一下用户默认的shell。
#!bin/bash
read –p “please input a username:” USER
if cut –d:-f1 /etc/passwd | grep “^$USER$” &> /dev/null ;then
MYBASH=`grep “^$USER: ” /etc/passwd | cut –d : -f7`
echo “ ${USER}’s shell is $MYBASH”
else
echo “$USER not exists.”
exit 4
fi
练习:监控系统登录人数,超过四个,显示已经达到四个,五秒钟检查一下,并退出脚本(exit)
#! /bin/bash
read –p “A user:” MYUSER
cut –d : -f1 /etc/passwd | grep “^$MYUSER” &> /dev/null || exit 6
let COUNT=`who | grep “^$MYUSER” | wc –l`
until [ $COUNT –ge 4 ]; do
sleep 5
let COUNT=`who | grep “^$MYUSER” | wc -l`
done
echo “$MYUSER loged 4 times.”
用sed语句实现:查看/etc/sysconfig/network-scripts/ifcfg-eth0 目录下,如果
BOOTPROTO=dhcp,把bootp改成static,并手动添加IP地址和子网掩码:
IPADDR= NETMASK= 。
#!/bin/bash
IFFILE=’/root/ifcfg-eth0’
read –p “IPaddr[192.168.0.1]:” MYIP
[ -z $MYIP ] && MYIP=’192.168.0.1’
echo “please choose your netmask [1,2,3]:”
cat << EOF
‘1’)
MYMASK =’255.255.255.0’
‘2’)
MYMASK =’255.255.0.0’
‘3’)
MYMASK =’255.0.0.0’
EOF
read CHOICE
case $CHOICE in
‘1’)
MYMASK=’255.255.255.0’ ;;
‘2’)
MYMASK=’255.255.0.0’ ;;
‘3’)
MYMASK=’255.0.0.0’ ;;
*)
[ -z $CHOICE ] && read –p “please input your mask:” MYMASK || MYMASK=”255.255.255.0” ;;
esac
[ -z $MYMASK ] && MYMASK=255.255.255.0
if grep –E “^BOOTPROTO=(dhcp)|(bootp)$” $IFFILE&>/dev/null; then
sed –i “ s/^BOOTPROTO=.*/BOOTPROTO=static/g” $IFFILE
grep
“^IPADDR=.*” $IFFILE &>/dev/null && sed –i
“s/IPADDR=.*/IPADDR=$MYIP/g” $IFFILE || sed –i ” /BOOTPRO=.*/a
\IPADDR=$MYIP” $IFFILE
grep “^NETMASK=.*” $IFFILE
&>/dev/null && sed –i
“s/NETMASK=.*/NETMASK=$MYMASK/g” $IFFILE || sed –i ” /BOOTPRO=.*/a
\NETMASK=$NETMASK” $IFFILE
fi
手动构建一个小linux系统
实验环境VMware 6.02
系统REHL5.4 (宿主机)
我们在这个系统上添加一块新硬盘来作为新系统的存储盘,将硬盘分为为两个区,一个用来存放系统内核,另一个用来存放init命令和bash等二进制文件。
具体操作过程如下:
添加一块硬盘,用fdisk –l 查看结果:。nit方
对新添加的硬盘进行分区:
分为sdb1,sdb2两个区,使用partprobe命令让内核重读分区表,用cat /proc/partitions查看分区情况,没问题吧!
将sdb1,sdb2格式化为ext3文件系统:
下面开始挂载分区,我们选择在/mnt目录下,这个目录可以是任意的。在/mnt目录下创建的两个挂载点/boot (放置grub 的目录)、/sysroot(系统根分区,)。
在sdb分区上装grub,默认就装在/mnt/boot/目录下。
查看boot目录下的文件,有grub了吧
看看grub目录下的配置配置文件,发现了没?缺了一个grub.conf主配置文件,这个我待会儿再创建。
把系统的内核拷贝到当前的boot目录下,重命名为vmlinuz。注意是在boot目录下,这里我犯了一个错误,直接拷到grub目录下,不过在后面又将vmlinuz挪到boot下了。
还需要initrd文件吧?我们没有,需要将系统的initrd修改后拷贝过来。注意系统的initrd不能直接使用,需要修改。我们在tmp目录下创建一个initrd目录,将系统的initrd拷过来展开。
我们查看一下init文件,用不到的行删去或者注释掉都行。
我们再查看一下lib目录下的文件,将用不到的统统删去,如图:
将修改后initrd重新封装输出到/mnt/boot/initrd.gz.。
查看boot目录,看!我们的内核和initrd文件都准备好了吧!这样我们就可以编辑grub.conf文件了。
编辑完成后,把数据从内存中同步到硬盘上,查看grub.conf的内容,就那么简单几句话
下面开始准备我们的根文件系统,在sysroot目录下创建文件目录
将系统/sbin/bin目录下的init文件拷贝到当前的init目录下
将系统/bin/bash目录下的bash文件拷贝到当前的bin目录下
查看一下当前目录
同时还要把两个文件所依赖的库文件拷贝到当前的lib目录下。
使用ldd查看文件所以依赖的库
将库文件拷贝过来
init要想真正运行,我们还需要一个配置文件inittab,这里我们在当前的etc目录下创建一个inittab文件并编辑。
发现了没?用来做系统初始化的rc.sysinit文件没有,我们依然需要动手创建。创建完成后,需要赋予其执行的权限,然后再同步一下。
这样,一个简单的小linux就完成了。将宿主机挂起,我们新建一个虚拟机使用刚刚配置完成的这块硬盘试一下,看!已经成功启动:
当然,这个小系统仅仅是能够正常启动,不能做任何事情。
我们来添加一个ls命令吧,把系统/bin下ls命令所依赖的库文件拷贝到/mnt/sysroot/lib目录下
重新试一下,看!ls命令能够正常运行了吧!
当然,这个linux小系统仅仅是通过拷贝的方式完成了正常的启动功能,尚不能做任何事情,需要我们在后面逐步去完善。
RAID
目的:提高冗余 提高性能
A:array 阵列
R :redundent 冗余
常见级别:0 1 5 6 10
根据硬件或者连接方式的不同,分为软件RAID和硬件RAID(专门的RAID卡)
以硬件方式实现的磁盘阵列,所对应的设备文件在/dev/下都已sd开头。
以软件的方式实现的RAID,是依靠linux自身将设备连接起来,是在内核中实现的,实现的模块为md。所对应的设备文件在/dev/下以md开头。
mdadm 多磁盘管理工具,可以是分区,也可以是独立的一块磁盘。
linear
(线性模式),将两个以上的磁盘整合成为一个实体的存数装置。所有的数据是:“一个一个填满之后,才将数据继续写到下一个磁盘上”。由于数据是一个一个写
入到不同的磁盘当中,因此整个磁盘的读取性能并不会增加。此外,数据具有连续性,若一个磁盘损毁,导致整个数据丢失。优势是:磁盘的空间会完整的被利用完
毕!
RAID0:条带(strip) 将数据分成多块,按等分放在不同的磁盘上交叉进行存储,可以提高磁盘性能,无容错功能。任何一块盘坏掉,会导致整个 数据全部丢失。
RAID1:镜像卷 将数据同时写入两块磁盘中,提供冗余功能。总容量以最小的那块磁盘为主。但是写速度明显降低,读性能明显提高。磁盘利用率百分之五十。
RAID4:至少三块磁盘,有一块盘专门用来做校验盘,缺陷:校验盘会成为系统的瓶颈。
RAID5:
至少三块磁盘,轮流做校验盘,前两块磁盘放数据,第三块磁盘放奇偶校验码,二三放数据,第一块磁盘放校验数据,依次轮流。空间利用率(N-1)/
N。只允许坏一块盘。读取性能相当于RAID0,因为要计算写入到磁盘当中的平衡信息(parity
information),所以写入的性能增加不会很明显。
PS:可以增加一块空闲盘(spare disk),一旦有一块盘发生故障可以立即顶上去。
RAID6 至少需要四块盘,两块盘做奇偶校验,轮流放奇偶校验数据。
mdadm manage MD devices aka(also known as 众所周知)linux software Raid
创建软raid 模式化工具
格式 mdadm [mode] <raiddevice> [options] <component-devices> 组成模式
常用模式(mode):assemble(装配) create(创建) follow or monitor(监控) grow(增长)manage(管理)
Assemble:把一个从别处移植过来的或者已经停用的raid重新启用起来。不用指定raid中有哪些磁盘组成,可以手动或者自动扫描。
Create :创建一个Raid ,有两个或两个以上的磁盘或者分区。
Follow or monitor:监控模式,监控raid当中磁盘的工作状态,只对1,4,5,6,10(有冗余功能)有效。
Grow:增长或者收缩raid,或者重建raid。所支持功能包括改变活动处于活动状态磁盘的大小及个数,适用于1,4,5,6具有冗余功能的级别下。
Manage:管理模式,实现特殊的管理工作,添加一个新的冗余盘或者移掉一个坏盘。在MISC模式(杂项模式)下同样可以实现。
选项 Options
-A,--assemble assemble a pre-existing array
-C,--create create a new array
-F,--follow,--monitor select monitor mode
-G, --grow change the size or shape of an active array
如果在一个设备之前已经指定了一个选项,例如 -add,--fail ,--remove 将自动被识别为manage模式。
跟模式无关的选项:
-V,--verbose 显示更详细的信息,选项较特殊,只能跟--detail (显示raid设备的详细信息), --scan(扫描) 和 --examine , --scan一起用。
-s,--scan 扫描配置文件或者/proc/mdstat(保留当前系统上处于活动或者停止状态的raid设备)来获取额外的信息。
Create 和grow 的选项
-n --raid-devices= 指定当前创建的raid一共有多少块活动的设备个数
-x --spare-devices= 指定空闲设备的个数
-c --chunk= 定义块大小,默认是64k
-l --level= 指定级别
在VMware上模拟raid0的创建过程:
先创建两个分区
[[email protected]rver27 ~]# fdisk /dev/sda
保存退出,sda7和sda8为已经准备好的两个分区。
两个5G分区已经创建完毕,注意此时一定不要格式化分区。
[[email protected] ~]# mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sda7 /dev/sda8
mdadm: array /dev/md0 started.
-a yes 当设备启动的时候自动创建设备文件
-l 0 创建级别
-n 2 指定磁盘个数
创建完毕后查看一下:
[[email protected] ~]# cat /proc/mdstat
格式化设备:
[[email protected] ~]# mkfs -t ext3 -L RAID0 /dev/md0
创建一个挂载点,然后挂载:
[[email protected] ~]# mkdir /raid
[[email protected] ~]# mount /dev/md0 /raid
:
/dev/mdo 已经工作正常。
设置开机自动挂载,编辑/etc/fstab 文件,添加:
/dev/md0 /raid ext3 defaults 0 0
在VMware上模拟raid1的创建过程:
三块分区已经创建好了 /dev/sda9, /dev/sda10, /dev/sda11
[[email protected] raid]# partprobe
分区信息与内核同步一下,一定不要忘了
[[email protected] raid]# cat /proc/partitions
准备工作已经完成,下面开始Raid1的创建,过程跟raid0 差不多
[[email protected] raid]# mdadm -C /dev/md1 -a yes -l 1 -n 2 -x 1 -c 32 /dev/sda9 /dev/sda10 /dev/sda11
[[email protected] raid]# cat /proc/mdstat
[[email protected] raid]# mdadm --detail /dev/md1
查看某个Raid设备的详细信息
模拟raid的创建过程:
PS:创建raid5 至少需要三块盘,如果再加一块冗余盘的话,至少需要四块。
四个分区已经准备完毕: /dev/sda12, /devsda13, /dev/sda14 ,/dav/sda15
[[email protected] raid]# partprobe
[[email protected] raid]# mdadm -C /dev/md2 -a yes -l 5 -n 3 /dev/sda{12,13,14}
[[email protected] raid]# cat /proc/mdstat
添加一块冗余盘
[[email protected] raid]# mdadm -a /dev/md2 /dev/sda15
[[email protected] raid]# mdadm --detail /dev/md2
移除一块冗余盘:
[[email protected] raid]# mdadm -r /dev/md2 /dev/sda15
查看一下:
格式化设备
[[email protected] raid]# mkfs -t ext3 /dev/md2
创建一个挂载点,并挂载
模拟磁盘坏掉的情况 --fail --set-faulty
[[email protected] md2]# mdadm --set-faulty /dev/md2 /dev/sda14
依然可以正常访问。
增加一块新盘:
[[email protected] md2]# mdadm -a /dev/md2 /dev/sda15
正在重建,等会儿会显示正常
将坏盘移除
[[email protected] md2]# mdadm -r /dev/md2 /dev/sda14
将Raid停止
先卸载
[[email protected] ~]# mdadm -S /dev/md2
如果想重新使用需要重新装配
[[email protected] ~]# mdadm -A /dev/md2 /dev/sda{12,13,15}
如果想保留raid 的详细信息需要手动去编辑。在/etc/下mdadm.conf(默认不存在)
[[email protected] ~]# mdadm --detail --scan
显示磁盘上所有处于活动装状态的阵列
[[email protected] ~]# mdadm --detail --scan >> /etc/mdadm.conf
再来查看一下mdadm.conf 已经有信息了
来验证一下,看能不能使用
停掉md2 在重新装配一下
[[email protected] ~]# umount /md2
[[email protected] ~]# mdadm -S /dev/md2
mdadm: stopped /dev/md2
[[email protected] ~]# mdadm -A --scan
mdadm: /dev/md2 has been started with 3 drives .
PS:格式化的时候有一个选项要注意
mkfs.ext3 -j -b 4096 -E stride=16 /dev/md0
-E指定扩展选项,stride= chuck/block 写上之后可以提高raid的性能