Linux 培训课程
第一章:UNIX发展史
1.1 Unix的历史
Unix是历史上最悠久的通用的操作系统
1969年,贝尔试验室的两位研究人员K.Thompson和D.M.Ritchie在
DEC PDP-7上用汇编语言完成了UNIX代码。
1973年D.M.Ritchie研究出了C语言,用C重写了UNIX。
1975年,Unix步出贝尔试验室之外,在大学校园中尤其风行。很快在加州大学伯克利分校派生出了BSD版本, 成为Unix家族的一名新成员。
至此有了两个UNIX流派:
UI(UNIX International): AT&T、 Sun、东芝等组成。
OSF(Open Software Foundation):IBM、DEC、HP、NEC等组成。
随着互联网的诞生,基于Intel平台的linux蓬勃发展起来,这类我们又称之为“类UNIX”
1.2 Unix创始人及诞生的平台
1.3自由软件基金会
1983 年 Richard Stallman(自由软件业的精神教父) 创办 GNU(GNU’s not Unix)计划
开始于1984年,旨在发展一个类-Unix 且为自由软件的完整作业系统
GNU计划的赞助单位
FSF(Free Software Fundation)提倡免费软件
FSF自由使用权的三个意义:
可自由复制GNU的软件
可自由修改原始码
可自由发布修改过的原始码,但不得收取任何版权费用
1.4 Linux 源起之 Minix
到了贝尔试验室的 System V 第七版时,终于推出了针对 x86 的 Unix,因此终于能够在个人计算机上安装 Unix。代表人物是荷兰阿姆斯特丹大学的 Tanenbaum 教授,他以教学为目的,希望能有一个x86平台上的操作系统,但是因为贝尔实验室的那条规定:“不能向学生公开源码”,于是 Tanenbaum就不看 Unix 源码,编写了兼容 Unix 的
针对 x86 的Minix 操作系统。
因为Minix只是教学使用,功能并不强;芬兰赫尔辛基大学的学生 Torvalds 利用GNU的bash作为开发环境,gcc 当做编译工具,编写了Linux kernel-v0.02。但是一开始Linux 并不能兼容Unix,因此Torvalds修改了Linux,并遵循P(Portable Operating System Interface)规定。
1991年8月,这位曾经的黑客出身的学生, 今天的“linux之父”在comp.os.minix 新闻组贴上了以下这段話:
「你好,所有使用minix的人 -我正在为386(486) AT 做一个免费的操作系統(只是为了爱好),不会像GNU那样很大很专业。」
1.5 Linux发行版
1)红帽Linux
Red Hat公司创建于1994年,是全球最大的开源技术厂家,其产品也是全世界应用最广泛的Linux。公司总部位于美国北卡罗来纳州,在全球拥有多个分部。
Red Hat从1994年-2003年经历了发行了1-9版,之后分兵两路,一路是开源免费的Fedora(测试版),另一路是商业收费的企业版(RHEL)。
RHEL从第2版开始发行,现在已经到了第7版。
Red Hat Linux的最终版本是9。已经成为历史了
2)CentOS
值得一提的是另有一家秉持开源精神的Linux品牌叫CentOS,
CentOS是依照RHEL开放源代码规定释出的源代码所编译而成,也就是说CentOS与RHEL出自同样的源代码,区别只是Logo不同,所以众多要求高度稳定性的服务器操作系统同时又不愿意支付服务费用的企业,纷纷以CentOS替代商业版的RHEL。因此,CentOS也成为很多企业和个人服务器的首选。
CentOS发布的版本号与RHEL对应。
3)Oracle Linux
Oracle的Linux版也是RHEL的衍生版,换了Logo,少量的加了些自己的东西。
4)Ubuntu
Ubuntu为Linux的桌面普及(服务器早已占据绝对市场)做出的贡献,使得Linus Torvalds和开源社区不得不承认Ubuntu是Linux 的发行版。
Ubuntu是香港即时科技隶属于Canonical 公司的发行版。创始人是华人。版本分为服务器版和桌面版。
- OpenSUSE
有桌面版和SUSE Linux Enterprise Server服务器版,服务器版获得Oracle认证支持
- 红旗 Linux
1.6 Linux内核版本
第二章:VirtualBox下安装RHEL5及Oracle11gR2
2.1虚拟机设置
目录是F:/linux培训
Linux的安装镜像文件,版本是RHEL5.10
location:表示virtual box软件安装目的地,缺省是c盘,可以选择其他地方。
全局设定指定虚机相关信息存放的位置,在此位置下每个虚机有一个独立的子目录,存放它自己的配置信息、快照、日志等。
为将来Oracle11gR2指定2G内存
虚机名称是vbox,以这个名字会在全局变量指定的位置下建立一个独立的子目录,存放和这个虚机有关的内容(虚盘+相关信息)
动态分配可以按需分配空间,开始就给2M,所以虚拟盘建立的很快。
Vbox子目录下将来会有两样东西,vbox.vdi(虚盘)+相关信息
2.2 RHEL5安装
可以从这里选要安装的linux镜像文件
键入回车,继续
先配置swap,交换区配置成4096M,以备后用
配置/root
最后配置/
设置网络:关闭DHCP动态分配,手工设定静态IP:192.168.3.88
我输入的密码是beijing
关闭防火墙
关闭安全控制
虚机端的网络选Host-Only
配置WIN7端的IP地址
要和虚机保持同一网段
[root@cuug ~]# vi /etc/hosts
关闭sendmail服务、做虚机快照
[root@cuug ~]#chkconfig sendmail off
Linux安装结束
2.3 Oracle11gR2安装
一)建用户,组,目录,权限
1)创建用户和组
有两个组,oinstall是主组,dba是附组
[root@cuug ~]#groupadd oinstall
[root@cuug ~]#groupadd dba
[root@cuug ~]#useradd oracle -g oinstall -G dba
[root@cuug ~]#passwd oracle
Changing password for user oracle.
New UNIX password:oracle
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:oracle
passwd: all authentication tokens updated successfully.
[root@cuug ~]#
2)创建oracle安装目录
[root@cuug ~]#mkdir -p /u01/oracle
[root@cuug ~]#chown -R oracle:oinstall /u01
[root@cuug ~]#chmod -R 775 /u01/oracle
[root@cuug ~]#
二)设置系统参数
1)根据Oracle11gR2文档,设置核心参数值
在/etc/sysctl.conf文件中加入下列行:
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
运行下列命令使修改的核心参数立即生效
# sysctl -p
2)设置Shell Limits(系统资源限制),提高软件的运行效率
在/etc/security/limits.conf文件中加入下列红色行:
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
3)在/etc/pam.d/login文件中加入下列行,如果里面没有的话:
session required /lib/security/pam_limits.so
session required pam_limits.so
4) 在/etc/profile后加入以下语句:
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
5)在/home/oracle/.bash_profile中删掉原来的最下面三行,然后加添下面的oracle环境变量
# add for oracle11g
ORACLE_BASE=/u01
ORACLE_HOME=$ORACLE_BASE/oracle
ORACLE_SID=prod
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
NLS_LANG="simplified chinese"_china.AL32UTF8
export NLS_LANG
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
export NLS_TIMESTAMP_FORMAT='yyyy-mm-dd HH24:MI:SSXFF'
export NLS_TIMESTAMP_TZ_FORMAT='yyyy-mm-dd HH24:MI:SSXFF TZR'
- 在/etc/hosts中添加一行信息
192.168.3.88 cuug
三)使用yum工具安装需要的包,按照联机文档要求去检查
检查的方法是rpm -qa 包名,如果没有证明缺这个包,要补上
经检查有两个包没有装好上, 需要安装libaio-devel和sysstat包,但安装可能遇到依赖关系,为此使用yum方法安装包。
yum工具可以自动解决软件包之间的依赖关系,使用之前要先创建软件仓库
创建方法:
root用户配置yum install安装工具
1)生成yum配置文件
[root@cuug ~]#cd /etc/yum.repos.d/
进入到该目录下生成一个配置文件
[root@cuug yum.repo]#ls
[base]
name=Red Hat Enterprise Linux
baseurl=file:///media/Server
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[root@cuug yum.repos.d]#vi rhel-debuginfo.repo
文件内容改为如下:
2)分配linux 安装镜像文件给光驱
3)手工mount光盘
[root@cuug yum.repos.d]#mount /dev/cdrom /media
查看一下目录下文件,看到许多包,至此,yum仓库构建完成。
[root@cuug yum.repos.d]# ls /media/Server|more
- 根据文档提示,使用yum安装缺失软件包
[root@cuug yum.repos.d]#yum install libaio-devel* -y
[root@cuug yum.repos.d]#yum install sysstat* -y
[root@cuug yum.repos.d]#yum install unixODBC-2* -y
[root@cuug yum.repos.d]#yum install unixODBC-devel* -y
[root@cuug yum.repos.d]#umount /media
5)别忘了从虚机中移除光驱,否则下次引导不了磁盘
上传Oracle安装介质
[root@cuug ~]# mkdir /soft
[root@cuug ~]#cd /soft
[root@cuug soft]#ls -al
总计 2229604
drwxr-xr-x 2 root root 4096 11-25 09:01 .
drwxr-xr-x 25 root root 4096 11-25 08:58 ..
-rw-r--r-- 1 root root 1285396902 11-25 09:01 linux_11gR2_database_1of2.zip
-rw-r--r-- 1 root root 995359177 11-25 09:01 linux_11gR2_database_2of2.zip
-rw-r--r-- 1 root root 95310 11-25 09:01 rlwrap-0.41-1.el5.i386.rpm
[root@cuug soft]#unzip linux_11gR2_database_1of2.zip
[root@cuug soft]#unzip linux_11gR2_database_2of2.zip
[root@cuug soft]#rpm -ivh rlwrap-0.41-1.el5.i386.rpm
四)安装Oracle软件
1)配置xmanager
打开xstart,如果提示要创建一个session name,就先给这个对话起个名,然后输入host,protocol选择ssh,command选择3 xterm(linux type 2)然后点run
X窗口:
xhost +:表示server端(虚机)不检查访问控制列表,所有client端都可登录
xclock: 弹出一个时钟,表示图形可以显示在client端
export DISPLAY环境变量把输出显示到ip指定的client端
激活runInstaller图形界面
后面需要运行的图形界面软件,也直接在这个X窗口执行调用。
选仅安装数据库软件,层次更清晰
这些目录是从.bash_profile中读出来的,请核对
/目录oracle用户权限不够,放到/u01下
Orainventory记录安装过程,类似日志,安装时必须的,装完软件就没什么大用了
dba组的特权说明,这个Linux组的用户可以使用OS验证登录oracle
两个脚本在root用户下依次执行
第一个脚本在授权,第二个脚本修改了/etc/oratab配置文件
- NETCA配置监听器
安装前首先检查三个网络文件已经配置好
X窗口内netca激活图形界面
这一步主要是为后面EM软件安装启动一个监听器,一路回车即可
- DBCA创建数据库
X窗口内dbca激活图形界面
单实例数据库名和实例名同名即可
这个就是配置EM
初学者使用文件系统,以后的RAC课程将涉及ASM
可以启用归档,也可以将来再配置
勾选示例方案,就有了Scott用户
练习用的环境,内存不用太大
数据库字符集选AL32UTF8,这是Oracle推荐的Unicode标准,支持汉字没问题
安装完毕,点击退出选项
可以设置sqlplus显示效果,指定列表宽度和页长度
[root@cuug ~]#vi /u01/oracle/sqlplus/admin/glogin.sql
末尾添加
set linesize 120
set pagesize 50
2.4测试安装
- 验证数据库启动关闭正常,访问scott的emp表正常
#su - oracle
$sqlplus / as sysdba sys用户登录数据库
SQL>startup 启动数据库
SQL>alter user scott identified by scott account unlock;
SQL>conn scott/scott
SQL>select * from emp;
SOL>conn / as sysdba; 连接sys用户
SQL>shutdown immediate; 关闭数据库
SOL>startup
- 验证监听启动正常
再克隆一个session
#su – oracle
$lsnrctl start
$lsnrctl status
- 验证em服务启动正常
$emctl start dbconsole
IE浏览器登录http://192.168.3.88:1158/em
4)做备份
- 生成快照
- 导出虚机,生成.ova文件
- :Linux常用命令
3.1命令分类
内部命令:属于Shell解释器的一部分(已调入内存)
外部命令:独立于Shell解释器之外的程序文件(在磁盘上)
获得命令帮助
1)内部命令help
查看Bash内部命令的帮助信息
2)命令的“--help” 选项
适用于大多数外部命令
3)使用man命令阅读手册页
使用“”、“”方向键滚动文本
使用Page Up和Page Down键翻页
按Q或q键退出阅读环境、按“/”键后查找内容
- 使用info命令阅读信息页
3.2命令格式
命令字 [选项] [参数]
选项及参数的含义
选项:用于调节命令的具体功能
以 “-”引导短格式选项(单个字符),示例“-l”
以“--”引导长格式选项(多个字符),示例“--color”
多个短格式选项可以写在一起,只用一个“-”引导,示例“-al”
参数:命令操作的对象,如文件、目录名等
3.3基本命令
一)目录操作命令(pwd、cd、ls、mkdir、rmdir、du)
1)显示当前所处目录位置
#pwd
2)列出文件或目录
#ls
#ls -l 等同ll
#ls -al参数a把隐藏目录也列出来了
#ls -alt 参数t使显示按时间排序
#ls -ald 参数d显示目录,但不显示目录内容
3)建立目录
#mkdir /abc
#mkdir –p /test/mydir建立子目录,如果父目录不在,一并建立。
- 切换目录
绝对路径:以“/”开始的路径,表示从Linux目录结构的最顶点算起
相对路径:不“/”开始的路径,可以相对于当前目录作为起始点
#cd..
#cd /etc/rc.d/rc3.d
#cd ../rc5.d相对路径转换,结合上一条看,退一进一,完成同 级目录变换
5)删除目录(rmdir或rm)
#rmdir bbb 功能是删除一个空目录,bbb里不能有文件。
#rm –rf bbb删除目录及文件(常用)
- 显示目录下的使用空间
#du -sh
二)文件操作命令(touch、file、cp、rm、mv、which、who、find、ln等)
1)移动文件或更换文件名
#mv a1.sh /tmp/a1.sh
#mv b1.sh b2.sh
#mv /etc/rc.d /tmp把rc.d目录及子目录的内容全移到/tmp里去,并保持文件属性不变。
2)复制文件或目录
#cp al.sh /tmp/a1.sh
#cp /u01/oradata/timran11g/*.ctl ./拷贝文件到当前目录(常用)
#cp -R abc /tmp abc是目录,把abc这个目录及下文件复制到/tmp下
3)删除文件
#rm /abc/test1.sh
6)查找某文件
#find / -name test.txt 从根目录下查找test.txt这个文件。
7)建立一个空文件
#touch /test/testing 在test目录下建立一个名为testing的空文件。
8)跟踪文件
#tail -f /u01/diag/rdbms/prod/prod/trace/alterPROD.log
- 显示外部命令的路径
#which cp
- 显示当前登录的用户
#who
11)ln 链接命令
不同目录下的链接映射,要使用绝对路径描述(不能使用相当路径)
软链接:
#ln -s yy zz 将文件yy产生一个软链接zz,即zz--->yy
软链接就是一个映射,类似Windows的快捷方式
硬链接:
#ln yy xx 将文件 yy 产生一个硬链接
硬链接实在,同一份数据对应多个文件,实际是多了一条访问路径
- 文件内容操作(cat、more、less、head、tail、wc、grep,重定向符等)
1)列出文件内容
#cat /abc/mytest一次性全部显示完
#more /abc/mytest分页显示,空格键转下页,Ctrl/C 中断显示。
2)跟踪文件尾部信息
#tail -f /abc/myfile 使用CTL/C退出
3)输出重定向符:“>”和“>>”
#ls > abc.out “>” 符号表示把ls 输出的内容定向到abc文件中去
#ls >>abc.out “>>”在abc.out文件里的字符末尾追加输出内容
- 管道符”|”
实际上是将一个程序的标准输出写到一个临时文件中去,再将这个
临时文件的内容作为另一条命令的标准输入。它的作用就是将多个命令结
合起来。
5)grep是‘择选’的意思,可以单独使用,也可以结合|使用
#grep - v ^# /etc/inittab 不显示带#号的注释行
#grep -v ^# /etc/inittab|grep -v ^$ 不显示带#及空行的行
#ps -ef |grep ora把oracle的后台进程输出到显示设备
#ps -ef |grep tty |grep -v 'grep tty'
6)wc 统计行数
#wc -l /tmp/test
#grep ^# /etc/inittab |wc -l
四)压缩和归档命令(gzip、bzip2、tar等)
1)压缩与解压缩 zip, unzip
#zip –r file.zip * 将当前目录下的子目录一并压缩成file文件
#unzip file.zip 逆操作,解压缩还原了
- 归档tar命令(顺序是先写打包名,后写数据源)
将整个/etc目录下的文件全部打包到/tmp下
#tar -cvf /tmp/etc.tar /etc 仅打包,不压缩!
#tar -zcvf /tmp/etc.tar.gz /etc 打包后,以 gzip 压缩
#tar -jcvf /tmp/etc.tar.bz2 /etc 打包后,以 bzip2 压缩(压缩比最高)
3)查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
#tar -ztvf /tmp/etc.tar.gz
4)将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 下
#cd /usr/local/src
#tar -zxvf /tmp/etc.tar.gz 参数z要在首位
3.4 Vi编辑器
vi 共分为三种模式
一般模式:以vi打开一个档案就直接进入一般模式了(这是默认模式)。在这个模式中,你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容,也可以使用『复制、贴上』来处理你的文件数据。
编辑模式: 在一般模式中可以进行删除、复制、贴上等等动作,但是却无法编辑文件内容的!要等到你按下『i,I,o,O,a,A,r,R』等任何一个字母之后才会进入编辑模式。注意了!通常在 Linux 中,按下这些按键时,在画面左下方会出现『INSERT或REPLACE』的字样,此时才可以进行编辑。而如果要回到一般模式时,则必须要按下『Esc』这个按键即可退出编辑模式。
指令模式: 在一般模式当中,输入『:/?』三个中的任何一个按钮,就可以将光标移到最底下那一行。在这个模式当中, 可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开vi、显示行号等等的动作则是在此模式中达成的!
光标移动
复制、粘贴、删除
文本内容检索
文本内容替换
- :Linux用户管理
4.1用户类型
Linux是一个真正意义上的多用户、多任务操作系统。
root用户:
超级用户,即系统管理员,在Linux系统中有且只有一个root用户,
对系统的一切都具有完全的访问权限的用户,并可由它建立多个普通用户。
root用户的密码在系统安装时由安装者设定。
普通用户:
可以创建许多普通用户,并为其指定相应的权限,使其有限地使用Linux系统。
4.2登录
系统在建立之初,仅有root用户,其它的用户则都是由root用户创建的。
以root用户登录,系统提示符是“#”;Linux是这样的,Unix未必。
以普通用户身份进入系统,系统提示符为“$”。
4.3口令
为了更好地保护用户帐号的安全,Linux允许用户在登录之后随时使用passwd命令修改自己的口令。修改口令需要经历:
输入原来的口令,如果口令输错,将中止程序,无法修改口令;
输入新的口令;
提示重复一遍新的口令,如果两次输入的口令相吻合,则口令修改成功。
root用户修改口令,则不需要输入老密码。root用户可以修改任何用户的口令。
4.4开关机
Shutdown 命令
功能:让用户退出系统,其功能和login指令相互对应,是登录的相对操作。
在结束Linux系统运行时,应先关闭操作系统,然后关机,而不能直接切断电源。因为在关闭系统时,Linux的一些系统进程可能正在对文件进行操作。
只有root用户才能够关闭系统。
标准的关闭系统的命令:shutdown -h now
其他:
#shutdown +5 维护时使用,提示5分钟后到单用户状态
#Init 0 以中断调用的形式关闭系统
#reboot 重启动(相当于shutdown -r now)
#halt 相当按了halt键
4.5创建组和用户
每个用户账户会涉及/etc目录下三个配置文件
/etc/passwd 记录用户账户信息,每个用户一行记录
/etc/group 包含组信息,每个组一行记录
/etc/shadow 口令文件,每个用户一行记录
初学者应该结合这三个配置文件学习创建组、用户、口令等命令
- 创建组、删除组
groupadd
功能:建立用户组。在/etc/group文件登记一行组信息
命令常见形式
#groupadd g1 g1是组名
#groupadd -g 200 g2 200是组号
#groupdel g1 删除组
2)useradd命令
功能:建立用户帐号。在/etc/passwd文件总登记一行该用户的基本信息
格式:useradd [选项]... 用户名
常用命令选项
-u:指定 UID 标记号
-d:指定宿主目录,缺省为 /home/用户名
-g:指定用户的基本组名(或UID号)
-G:指定用户的附加组名(或GID号)
创建一个新用户,必定与两件事件相关:
(1)新用户必然属于一个组,如果不说明,则默认建立一个该用户同名的组,也可以指定用户属于一个已存在的组,组信息保存在/etc/group文件中。
(2)新用户登录时必然有其自己的主目录(即家目录),如果不说明,则默认在 /home下建立一个与该用户同名的目录作为主目录,也可以令新用户建立指定的主目录。
分析以下几种常见的命令形式
#useradd tim 最简单的形式,自动建立tim组,将tim用户加入其中
#useradd -g g1 tim 建立tim用户,加入已存在的g1组
#useradd tim -g g1 等同上句
#useradd -g g1 -u 201 tim 在上句基础上指定了用户号
#useradd -g g1 -u 201 -G g2 -d /abc tim 类似上句指定了辅组和家目录
3)passwd命令
功能:对指定帐号的用户设置口令,还可以用做修改已存在用户的口令或当前登录用户的口令。这个命令修改了/etc/shadow文件
root用户能修改系统中所有用户的口令,而普通用户只能变更自己的口令。
[root@cuug ~]#passwd tims
[root@cuug ~]#su - tim
[root@tim ~]$passwd
4.6删除用户、删除组
只能由root用户执行。
userdel命令
格式:userdel [-r] <用户帐号>
功能:删除用户帐号与相关文件。若不加参数,则仅删除用户帐号,不删除文件。
#userdel -r tim 参数-r同时删除该用户的家目录
#groupdel g1 非空的组不能删除
4.7 修改用户帐号的属性
usermod命令
格式:usermod [选项]... 用户名
#usermod -g g1 tim 把tim用户所在组变更为g1
4.8切换用户
root用户与普通用户的身份转换
#su - tim root用户转换到普通用户
#id 查看当前用户及组
$su - 普通用户转换到root用户,要求操作者提供root用户口令
4.9家目录
1)用户登录时的目录叫家目录(宿主目录)
root用户的家目录是/root
普通用户的家目录缺省是/home/用户名,也可指定其他目录。
2)家目录的文件来源
新建用户帐号时,从 /etc/skel 目录中复制而来
家目录中有三个隐含文件:
~/.bash_profile:用户每次登录时执行
~/.bashrc:个性环境变量的描述,可由~/.bash_profile调用
~/.bash_logout:用户每次退出登录时执行
3)快速进入家目录的方法
方法1:#cd<回车>
方法2:#cd ~<回车> “~”代表家目录,小破折号和一些命令配套使用很常见
4.10 应用示例:提供root密码安全性
1)root密码丢失
如果忘记了RHEL5的root密码,可以使用单用户的模式来修改root密码。
启动RHEL5,在第一次出现选项读秒时打Enter键,到如下的画面:
按下键盘上的“a”
接下来的画面的最后输入一个空格,然后输入一个数字1,再按下Enter键。
这就可以进入单用户模式,接下图:
系统重启动到单用户模式
可以使用passwd命令修改root密码了
- root二级密码
可以看出只要能接近服务器,就可以通过进入单用户模式修改root密码,root密码并不安全!
对此,我们可以在进入单用户模式选单之前先设置一道grub密码,见提示:先键入‘p’键,输入grub密码后,才能进入单用户模式。
grub密码设在了/etc/grub.conf文件中。见上图, 高亮部分是新补充的一行password 后面的Timran就是密码。
当启动读秒阶段,键入回车想进入单用户时, 系统首先进入第一级密码,即grup密码。
提示:
Lock
Err0r 32: must be authenticated
Press any key to continue…
弹出红色字体:
Red Hat Enterprise Linux Server(2.6.18-194.e15)
Press p
接下来出现
Password:******
光标末尾处输入密码, 回车。
Red Hat Enterprise Linux Server(2.6.18-194.e15)
光标又回到红字体原处,再回车,将验证grup密码,通过后,
系统自动进入linux启动阶段,再通过第二级密码(root密码)。
grub密码设在了/etc/grub.conf文件中。进入root账户后可以修改
- :Linux服务介绍
5.1什么是Service? 什么叫Daemon?
Service:可以分为系统Service和应用Service
liunx里service通常包含一些二进制可执行程序和shell控制脚本(通过shell脚本启动或停止执行程序)。系统级的可执行程序一般存储在/sbin或/bin下;而shell控制脚本一般存储在/etc/rc.d/init.d下,且控制service的脚本的格式相对固定,至少支持start,stop,status参数。
Daemon:守护进程
在linux中daemon一般指由系统提供的Service,daemon作为系统进程往往是自动启动,不像一般应用service会受用户登录或退出的影响。
按照启动方式的不同,daemon可以分成两类
1)可以独立启动的daemon,叫做stand alone。大部分属于这种。
2)daemon归由xinetd统一管理的。可以使用xinetd根据需要去激活或撤消。不一定常驻内存。xinetd也是独立启动的,因此也叫做super daemon。
5.2 Linux启动流程
MBR中的主引导加载程序是一个512字节大小的映像,其中包含程序代码和一个小分区表。前446个字节是主引导加载程序,接下来的64个字节是分区表,其中包含4个分区的记录(每个记录的大小是16个字节)。最后2个字节会用来进行MBR的有效性检查
在/boot/grub下可以看到两个文件stage1和stage2,其实stage1的内容已经在安装时写进了MBR,这个目录下的stage1只是个MBR的备份,如果MBR坏掉,可以用来恢复,MBR就是stage1,它的目的是为了引导stage2。
init进程
这个进程是系统中所有进程的父进程,所谓的核心(vmlinuz和initrd.img)引导进内存后,就要把控制权交给init,由init去完成接下来的系统启动的引导工作。init进程是从/sbin/init程序加载起来的,然后调用下面的一些脚本。
/etc/inittab脚本
Linux的init程序依赖于/etc/inittab文件提供的init启动和初始化系统中各种服务的详细过程。
系统启动会对应某种运行级别,一共有7个运行级别,分别是
0:关机状态
1:单用户模式
2:字符界面的多用户模式(不支持网络)
3:字符界面的完整多用户模式
4:未分配使用
5:图形界面的多用户模式
6:重新启动
默认级别常见的选择是3和5,最下面那行:
id:3:initdefault:中的3对应的就是默认启动3级别。
这功能没大用,ctl+alt+delete=reboot
linux可以在主机终端上再开六个虚拟终端,对应alt+(F1-F6),这有什么用呢?如果你只有一个主机终端,若系统被某进程搞死了,远程也登不上去,从任一个虚拟终端进去把那个进程干掉。Ok!
/etc/rc.d这7个运行级别分别对应了7目录,每个目录下都有相应的运行脚本。在这些目录下的脚本都是以S、K开头的,后面接一个两位的数字和一个进程名。
S表示使用START参数启动进程
K表示使用STOP参数不启动进程
数字是脚本执行的顺序号
/etc/rc.d/rc.sysinit脚本
从inittab中可以看出,系统在确定运行其中某个目录下的脚本之前,还要构建初始化环境,这个任务由sysinit负责完成。
在系统最初始的启动过程中,由/etc/rc.d/rc.sysinit脚本程序控制系统所做的动作,执行如下任务:
设置计算机的名称、网络参数
设置区域时间
检查文件系统,无误后进行安装
删除临时文件
启动系统守护进程
5.3运行级别的目录结构图
这7个运行级别分别对应了7链接目录,每个目录下都有相应的运行脚本。在这些目录下的脚本都是以S、K开头的,后面接一个两位的数字和一个进程名。
S表示使用START参数启动进程,在启动时按照S后的序号顺序依次启动服务
K表示使用STOP参数不启动进程,在关闭时按照K后的序号顺序依次关闭服务
数字是脚本执行的顺序号
这是运行级别3在启动和关闭时需要执行的脚本
5.4开机服务的启动/停止
不建议直接去修改/etc/rcX.d目录下的文件名,因为一个错误的序号很容易产生问题,使有些服务起不来。正规的做法是通过chkconfig命令完成相应的操作,让linux系统去判断并产生一个合理的序号。
Setup菜单命令可以在主控台字符界面下操作,简化管理
5.5 启动或停止当前服务的方法
两种方法:
1)/etc/init.d/服务名 控制参数
2)service 服务名 控制参数
常用控制参数
start:启动服务
stop:终止服务
status:查看服务状态
restart:重新启动服务程序
[root@cuug ~]#/etc/init.d/crond status
crond (pid 2672) 正在运行...
[root@cuug ~]#/etc/init.d/crond stop
停止 crond: [确定]
[root@cuug ~]#/etc/init.d/crond status
crond 已停
[root@cuug ~]#service crond start 换第二种方法
启动 crond: [确定]
[root@cuug ~]#service crond status
crond (pid 2701) 正在运行..
5.6进程监控
1)查看进程命令—ps
#ps -l 列出同自己当前shell有关的进程信息
#ps -ef 显示系统中所有进程的全面信息
#ps -ef |grep ora_ 筛选出oracle的进程(常用)
#ps -aux 显示所有终端上所有用户的有关进程的所有信息
2)查看系统当前状态命令—top
top命令和ps命令的基本作用是相同的,但是top是一个动态显示过程
如果在前台执行,该命令将独占前台,直到用户终止该程序为止
例:每30秒实时更新一次系统中运行的进程的状态
#top d 30
第一行依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。
第二行依次为进程总数、运行进程数、休眠进程数、 终止进程数、僵死进程数。
第三行为CPU状态,依次为用户占用、系统占用、优先进程占用、闲置进程占用。
第四行为内存状态,依次为平均可用内存、已用内存、空闲内存、缓存使用内存。
第五行为交换状态,依次为平均可用交换容量、已用容量、闲置容量、高速缓存容量。
3)结束进程命令—kill
通常终止一个前台进程可以使用Ctrl+C组合键。但是,对于一个后台进程就须用kill命令来终止,可以通过ps命令来确定进程号。
#Kill -9 2293 进程号是2293,-9 代表强制终止
5.7环境变量
环境变量相当于给系统或用户应用程序设置的一些参数, 比如PATH, 是告诉系统, 当要求系统运行一个程序而没有告诉它程序所在的完整路径时, 系统除了在当前目录下面寻找此程序外, 还应到哪些目录下去寻找。
Linux的环境变量是和Shell紧密关联的,RHEL使用的是bash。
环境变量的产生又可以分为两层面,即系统层面和用户层面。
1)系统启动时自动读取/etc/profile配置文件所产生的变量叫做系统变量。
2)用户登陆时在自己家目录会自动读取的.bash_profile配置文件,从而产生用户变量。
系统变量是全局的,由系统管理员管理,一般不做修改。
用户变量是在管理员创建用户时,在用户家目录下复制了/etc/skel中
的模板内容。用户可以在自己的家目录里添加自定义的变量。
示例:
oracle用户可以在自己的家目录下增加自定义的环境变量(这些变量可以只对oracle用户永久生效)
下面是一个实例:向oracle家目录(/home/oracle)下的.bash_profile里添加变量
$vi /home/oracle/.bash.profile
ORACLE_BASE=/u01
ORACLE_HOME=$ORACLE_BASE/oracle
ORACLE_SID=prod
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH
这里要注意几点:
1)大写一般表示为环境变量。
2)等号两边不要空格。
3)PATH有“:”隔开,位置有关系,搜索按前后顺序。
4)export 是把自定义变量“输出”成环境变量。
5)每个变量前加export也是可以的,如:export ORACLE_BASE=/u01
6)显示环境变量可以ENV命令或echo命令, 如:
#env |grep ORA
#echo $ORACLE_BASE
5.8应用示例:配置crond守护进程
1)crond是什么?
很多时候我们需要定时不断重复执行一些命令,crond守护进程相当一个定时器,允许用户自动执行一些重复的系统管理任务,如备份、数据库更新、清除不必要的文件等。crond的服务脚本是/etc/init.d/crond,它在系统启动时自动执行。
2)crond的工作原理:
crond启动以后,首先搜索/var/spool/cron目录,检查是否有用户设置了crontab文件,如果没有就转入休眠状态
每分钟crond“醒”过来一次,重复前面的动作。
- crontab任务调度表相关命令
crontab -e:编辑任务调度表
crontab -r:终止任务调度表
crontab -l:列出当前调度表
一个用户只能定义一个任务调度表,普通用户指定自己的调度表,root用户可以为任何用户指定调度表,调度表的路径及命名方式为/var/spool/cron/用户名
调度表是一个文本文件,其标准格式为:分 时 日 月 周 命令
4)时间数值的特殊表示方法
* 表示该范围内的任意时间
, 表示间隔的多个不连续时间点
- 表示一个连续的时间范围
/ 指定间隔的时间频率
我们重点应该掌握任务调度表中时间的表示方法:
示例:
0 17 * * 1-5 周一到周五每天17:00
30 8 * * 1,3,5 每周一、三、五的8点30分
0 8-18/2 * * * 8点到18点之间每隔2小时
0 * */3 * * 每隔3天
- 测试
第一种情形:
每隔一分钟就把当前系统日期写入/tmp/mytest文件中
每隔二分钟把日历写入/tmp/mytest文件中
整个过程就如进入 vi 编辑画面一样, 这里我们按题意应该编辑两行命令,然后看看/var/spool/cron里生成了什么? 再使用tail –f /tmp/mytest查看结果
#crontab -e
*/1 * * * * date>>/tmp/mytest (>>表示添加)
*/2 * * * * cal>>/tmp/mytest
第二种情形
如果一组命令都在一个时间点开始执行,最好把要执行的命令都写到一个shell脚本里,比如写到/tmp/abc.sh文件里(让abc.sh包含要执行的那一组语句)。然后在crontab -e 中设置脚本运行时间
比如每隔一分钟就把日期和日历一起添加到/tmp/mytest文件中。可以这样做:
1)准备空文件
[root@cuug ~]# crontab -r 停掉定时器
[root@cuug ~]# cat /dev/null > /tmp/mytest 清空文件
2)写一个shell小脚本
[root@cuug ~]#vi /tmp/abc.sh
date>>/tmp/mytest
cal>>/tmp/mytest
3)设定crontab定时器,每1分钟执行一次
[root@cuug ~]#crontab -e
*/1 * * * * sh /tmp/abc.sh
4)跟踪结果
[root@cuug ~]#tail -f /tmp/mytest
- :安装管理应用程序
6.1应用程序与系统命令的关系
典型应用程序的目录结构
常见的软件包封装类型
我们重点关注RPM包和源代码软件包的安装方法,比如:
上面的tar.gz是源代码软件包,从开源社区下载而来
下面的.rpm是RPM包,已按照RPM形式封装好了
它们都可以完成同样的功能,只是存在形式不同。
6.2 RPM软件包
RPM Package Manager
由Red Hat公司提出,被众多Linux发行版所采用
建立统一的数据库文件,详细记录软件包安装、卸载等变化信息,能够自动分析软件包依赖关系
RPM软件包一般命名格式:
RPM命令格式
几个常用的rpm包命令:
1)查询
#rpm -qa |grep libaio-devel 查询是否已经安装libaio-devel包
- 安装
#rpm -ivh libaio-devel-0.3.106-5 安装libaio-devel-0.3.106-5包
rpm -ivh *.rpm 安装当前目录下所有的rpm包
- 卸载
#rpm -e libaio-devel-0.3.106-5 卸载libaio-devel-0.3.106-5包
实验:
[root@cuug ~]# mkdir /soft
上传这两个文件到/soft下
[root@cuug ~]# cd /soft
[root@cuug soft]# ls -al
总计 107232
drwxr-xr-x 2 root root 4096 12-01 13:44 .
drwxr-xr-x 25 root root 4096 12-01 13:42 ..
-rw-r--r-- 1 root root 95310 12-01 13:44 rlwrap-0.41-1.el5.i386.rpm
-rw-r--r-- 1 root root 109574432 12-01 13:44 VirtualBox-4.3.12-93733-Win.exe
[root@cuug soft]# rpm -qa |grep rlwrap
[root@cuug soft]# rpm -ivh rlwrap-0.41-1.el5.i386.rpm
warning: rlwrap-0.41-1.el5.i386.rpm: Header V4 DSA signature: NOKEY, key ID 217521f6
Preparing... ###########################################[100%]
1:rlwrap ###########################################[100%]
[root@cuug soft]# rpm -qa |grep rlwrap
rlwrap-0.41-1.el5
[root@cuug soft]# rpm -e rlwrap-0.41-1.el5
[root@cuug soft]# rpm -qa |grep rlwrap
6.3解决软件包依赖关系
1)什么是依赖关系 安装A需要B,安装B需要C,安装C需要A。
安装有依赖关系的多个软件是,被依赖的软件包需要先安装
同时指定多个.rpm包文件进行安装,也就是说把所有依赖关系的包都找到,问题就解决了。
卸载与安装类似,也是遵循有依赖原则,只不过是安装的逆序
- 解决依赖关系的一个好方法是使用YUM(Yellow dog Updater,Modified)机制
这部分内容我们放到后面的Oracle安装章节中去做。
6.4源代码软件包
使用源代码安装软件的优点
1)获得最新的软件版本,及时修复bug
2)根据用户需要,灵活定制软件功能
步骤:
1)解包
[root@cuug soft]# tar -zxvf rlwrap-0.30.tar.gz -C /usr/src 解压到/usr/src下
[root@cuug soft]# cd /usr/src
[root@cuug src]# ls -al
总计 44
drwxr-xr-x 6 root root 4096 12-01 15:02 .
drwxr-xr-x 14 root root 4096 11-28 14:31 ..
drwxr-xr-x 2 root root 4096 2009-10-01 debug
drwxr-xr-x 3 root root 4096 11-28 14:31 kernels
drwxr-xr-x 7 root root 4096 11-28 14:33 redhat
drwxrwxrwx 8 500 500 4096 12-01 15:03 rlwrap-0.30
- 配置
[root@cuug rlwrap-0.30]# ls -al configure*
-rwxr-xr-x 1 500 500 217282 2008-01-08 configure
-rw-r--r-- 1 500 500 9860 2008-01-08 configure.ac
[root@cuug rlwrap-0.30]#./configure
3)编译
[root@cuug rlwrap-0.30]# make
4)安装
[root@cuug rlwrap-0.30]# make install
- 验证
[root@cuug rlwrap-0.30]# find / -name rlwrap*
- 卸载
最好看一下这个/usr/src/rlwrap-0.30/下的README,如果没有卸载说明,就根据5)的显示结果删除与其相关的目录和文件,主要是这三个目录及文件:
/usr/src/rlwrap-0.30
/usr/local/bin/rlwrap
/usr/local/share/rlwrap
把上面三个都删了就行了,反正Linux也没有注册表。
- :Linux文件管理
7.1文件(目录)是如何访问的
1)inode是什么?
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
- Unix/Linux如何识别文件?
系统内部不使用文件名,而使用inode号码来识别文件。在Linux中创建一个文件,系统就为该文件分配一个惟一的inode,文件的inode用于访问文件的属性。表面上, 用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取 inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
- Unix/Linux如何识别目录?
目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
4)查看某个文件的inode信息:
[root@cuug ~]# stat /etc/hosts
File: “/etc/hosts”
Size: 166 Blocks: 16 IO Block: 4096 一般文件
Device: 802h/2050d Inode: 1078190 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2015-12-03 14:58:10.000000000 +0800
Modify: 2015-12-02 02:05:57.000000000 +0800
Change: 2015-12-02 02:05:57.000000000 +0800
[root@cuug ~]# ls -ali /soft
总计 296
4116673 drwxr-xr-x 2 root root 4096 12-01 15:00 .
2 drwxr-xr-x 26 root root 4096 12-03 11:55 ..
4116675 -rw-r--r-- 1 root root 184037 12-01 14:06 rlwrap-0.30.tar.gz
4116674 -rw-r--r-- 1 root root 95310 12-01 14:06 rlwrap-0.41-1.el5.i386.rpm
5)查看一个磁盘分区的inode使用情况
[root@cuug ~]# df -i
文件系统 Inode (I)已用 (I)可用 (I)已用% 挂载点
/dev/sda2 7318528 127440 7191088 2% /
/dev/sda1 26104 34 26070 1% /boot
tmpfs 223858 1 223857 1% /dev/shm
7.2目录的功能介绍
根据1994年发布的文件系统标准(FSSTND),所有的Linux文件系统都有标准的文件和目录结构。那些标准目录又包含一些特定的文件。下面来简要介绍一下每个目录的作用。
1)根目录(/)
根目录位于分层文件系统的最顶层,用斜线(/)表示。它包含一些标准文件和目录,因此可以说它包含了所有的目录和文件。
2)/bin
/bin目录,也称为二进制目录,包含了那些供系统管理员和普通用户使用的重要的Linux命令的二进制(可执行)映像。这个目录下的文件要么是可执行文件,要么是其他目录下的可执行文件的符号连接。目录/usr/bin存放了大部分的用户命令。
3)/boot
/boot目录下存放的是Linux系统启动时要用到的所有文件,包括Linux内核的二进制映像。当用lilo引导Linux时,会用到这里的一些信息,grub的配置文件也放在这里。
4)/dev
/dev目录,也称为设备目录,存放连接到计算机上的设备的对应文件,包含了Linux 系统中使用的所有外部设备,它实际上是访问这些外部设备的端口,你可以访问这些外部设备,与访问一个文件或一个目录没有区别。
5)/etc
/etc目录存放了系统管理时要用到的各种配置文件和子目录,示例网络配置文件、文件系统、X窗口系统配置文件、设备配置信息、设置用户信息等;/etc目录不包含任何二进制文件。这个目录下的文件主要由管理员使用;普通用户对大部分文件有读权限。
6)/home
用户的基本目录,/home 如果建立一个名为“xx”的用户,那么在/home目录下就有一个对应的“/home/xx”路径,用来存放该用户的主目录。
7)/lib
/lib目录下存放了各种编程语言库,包括库文件和kernel模块。典型的Linux系统包含了C、C++、FORTRAN语言的库文件。/lib目录下的库映像文件可以用来启动系统并执行一些命令。实际上它包含了标准C库/lib/libc.so.*,数学库libm.so.*,共享的动态链接库/lib/ld/so以及目录/lib和/sbin下命令用到的其他共享库。
8)/lost+found
/lost+found 该目录在大多数情况下都是空的。但当突然停电、或者非正常关机后,有些文件就临时存放在这里。
9)/mnt
/mnt目录在一般情况下也是空的,主要用来临时装载文件系统,系统管理员执行mount命令完成装载。工作在系统中,这个目录包含了光驱、磁盘和软驱的装载点。这样,当装载了一个设备时,如光驱,就可以通过访问目录/mnt/cdrom的文件来访问相应光盘上的文件。
10)/proc
/proc目录存放了进程信息和系统信息,这些信息是在内存中由系统自己产生的。
11)/root
许多Linux系统都将目录/root作为根用户(超级用户)的主目录。该目录受到完全保护,不受普通用户的影响,普通用户没有权限访问/root目录。
12)/sbin
/sbin 该目录用来存放系统管理员的系统管理程序。
目录/sbin、/usr/sbin、/usr/local/sbin包含系统管理工具、实用程序和通用的根用户专用命令。
13)/usr
/usr目录是Linux文件系统中最大的一个部分,要用到的应用程序和文件几乎都存放在这个目录下面。它包含了主机之间可以共享的只读数据。在多数Linux系统中,/usr至少包含了下面的子目录:X11R6、bin、doc、games、include、lib、local、man、sbin、share、src和tmp。
14)/tmp
/tmp目录用来存放不同程序执行时产生的临时文件。一些命令和应用程序要用到该目录。您也可以用该目录存放自己的一些临时文件。该目录中的所有文件会被定期删除,以保证磁盘(或磁盘分区)不会被临时文件所塞满。/tmp目录下某个文件的生命期是由系统管理员设定的,而且因系统而异,但通常只有若干分钟。多数系统都为/tmp目录设置了粘滞位(sticky bit),这样只有文件的所有者才能从该目录中删除文件。
15)/opt
/opt目录用来安装附加软件包。用户调用的软件包程序放在目录/opt/package_name/bin下,package_name是安装的软件包名称。软件包的参考手册放在/opt/package_name/man下。
16)/var
/var目录是系统在工作时预先设置的工作目录,如各种服务的日志文件和收发的邮件等。/var目录用于放置变量数据(当系统运行时这些数据不断变化)。
7.3文件和目录属性
7.4文件和目录的访问权限
7.5更改属性及权限的方法
1)更改目录或文件所有者及组
由root用户去执行,常用命令是:
chown [R] 用户:组 [目录|文件]
R表示递归,即该目录下所有目录和文件都一同更改。如:
#chown -R oracle:oinstall /u01
2)更改目录或文件的权限
由root用户和所有者都可以去执行,有三种方法
第一种:权重法
r(权重)=4,w(权重)=2,x(权重)=1。如:
#chmod 755 abc 赋予abc权限为rwxr-xr-x
[R]是递归,有效性截止到命令发出之前,对命令之后创建目录或文件无效
第二种:赋值法
#chmod u=rwx,g=rx,o=rx abc 同上例
这里:u=用户权限,g=组权限,o=不同组其他用户权限
第三种:加减法
#chmod u-x,g+w abc 给abc去除用户执行的权限,增加组写的权限
#chmod a+r abc 给所有用户添加读的权限
权限的理解需要注意两点:
- 凡是对某个文件有写动作的操作,不是看你是否对这个文件是否有W权限,而是看你对这个文件的上级目录的是否有W和X权限,因为你的写操作是对目录的内容的写操作。
2)root用户一般不受权限的限制,谁的目录或文件root都可以做写操作,但执行一个shell脚本所有用户必须有X权限,root也不例外。
[root@cuug abc]# cat a1.sh 这个shell文本里只包括一句执行命令
date
[root@cuug abc]# ls -al
总计 16
drwxr-xrwx 2 root root 4096 12-03 18:01 .
drwxr-xr-x 26 root root 4096 12-03 17:03 ..
-rw-r--r-- 1 root root 5 12-03 18:01 a1.sh
[root@cuug abc]# ./a1.sh 显而易见root缺省X权限,受限
-bash: ./a1.sh: 权限不够
[root@cuug abc]# sh a1.sh或bash a1.sh,此办法可以,因root调用了shell解释器
2015年 12月 03日 星期四 18:03:35 CST
[root@cuug abc]# chmod u+x a1.sh
[root@cuug abc]# ls -al
总计 16
drwxr-xrwx 2 root root 4096 12-03 18:01 .
drwxr-xr-x 26 root root 4096 12-03 17:03 ..
-rwxr--r-- 1 root root 5 12-03 18:01 a1.sh
[root@cuug abc]# ./a1.sh
2015年 12月 03日 星期四 18:04:12 CST
[root@cuug abc]#
7.6使用附加权限
1)SET位权限
主要用途:
为可执行(有 x 权限的)文件设置,权限字符为“s”
其他用户执行该文件时,将拥有属主或属组用户的权限
SET位权限类型:
chmod u=rws,o=rx
-rws---r-x:表示对属主用户增加SET位权限
应用示例/usr/bin/passwd
2)粘滞位权限(Sticky)
主要用途:
为公共目录(示例,权限为777的)设置,权限字符为“t”
用户不能删除该目录中其他用户的文件
应用示例:/tmp、/var/tmp
3)设置SET位、粘滞位权限
设置权限字符chmod o±t 目录名...
示例:
第一步 建立公共目录,不同用户建立的各自的文件
[root@cuug /]#mkdir /abc root用户建立一个公共目录
[root@cuug /]#chmod 777 /abc 授予所有用户rwx权限
[root@cuug /]#ls -ald /abc
drwxrwxrwx 2 root root 4096 12-09 21:32 /abc
[tim@cuug ~]$touch /abc/timfile 以tim身份建立一个timfile
[ran@cuug ~]$touch /abc/ranfile 以ran身份建立一个ranfile
[ran@cuug ~]$ls -al /abc 查看一下文件的属性和权限
-rw-r--r-- 1 ran g1 0 12-09 21:41 ranfile
-rw-r--r-- 1 tim g1 0 12-09 21:40 timfile
第二步 测试ran用户可以删除timfile
删除后,tim重建/abc/timfile
第三步 为/abc目录设置粘贴位,
测试ran用户删除timfile时报错
[root@cuug ~]#ls -ald /abc
drwxrwxrwx 2 root root 4096 12-09 22:02 /abc
[root@cuug ~]#chmod o+t /abc 为/abc设粘贴位
[root@cuug ~]#ls -ald /abc
drwxrwxrwt 2 root root 4096 12-09 22:02 /abc
[ran@cuug ~]$rm /abc/timfile 用户ran删别人的文件会报错
rm:是否删除有写保护的 一般空文件 “/abc/timfile”? y
rm: 无法删除 “/abc/timfile”: 不允许的操作
4)附加权限的特点
1、系统中要尽量避免使用set位,可以适当使用粘滞位
2、Set位只能设置在文件上,而且只当文件有执行权限时才有意义。
3、粘滞位只能设置在目录上,而且不需要指定设置在针对谁的权限上。
7.7应用示例:搭建一个文件服务器
搭建一个学生资料文件服务器,
需求目标描述:
1)root用户为每个班(一共两个班)设计存储空间,存储空间包含两类
私有空间:
每个学生有自己的私有空间,能通过文件服务器上传下载文件,但彼此不能共享。
共享空间:
2)一个目录放视频,一个目录放课件,同一班组的学生只能下载属于自己班组的公共资料(不能上传资料)
3)上传(更新)公共资料管理只能由root用户完成。
4)本练习不涉及磁盘限额,真实系统是把所有相关的目录建立在一个独立的磁盘分区中,然后对所有班组学生加以磁盘限额,这也是为什么建立用户时未使用默认家目录的原因。
一)设计目录名、用户名、组名:
1)在/usr下,每个班级对应一个目录,比如有两个班分别是class01和class02,则对应的目录分别是/usr/class01和/usr/class02,为方便起见,目录名和组名使用了相同的名字,即/usr/class01目录对应class01组,/usr/class02目录对应class02组。类推…
2)每个目录下有该班的两个公共文件夹,如class01班的两个公共目录分别取名为c1_pub1和c1_pub2,如果是class02班,则对应的是c2_pub1和c2_pub2,类推…
3)每个班级目录里包含该班的所有学员,每个学员对应一个私有目录,如ran学生是class01班的,其私有目录是/usr/class01/ran。类推…
二)建立目录、用户、组和口令
mkdir -p /usr/class01/c1_pub1
mkdir -p /usr/class01/c1_pub2
mkdir -p /usr/class02/c2_pub1
mkdir -p /usr/class02/c2_pub2
groupadd class01
groupadd class02
useradd -g class01 -d /usr/class01/ran ran
useradd -g class01 -d /usr/class01/wang wang
useradd -g class02 -d /usr/class02/liu liu
passwd ran (输入密码)
passwd wang (输入密码)
passwd liu (输入密码)
三)授予属主、属组和权限
chown -R root:class01 /usr/class01
chown -R root:class02 /usr/class02
chown ran:class01 /usr/class01/ran
chown wang:class01 /usr/class01/wang
chown liu:class02 /usr/class02/liu
chmod -R 750 /usr/class01
chmod -R 750 /usr/class02
chmod 700 /usr/class01/ran
chmod 700 /usr/class01/wang
chmod 700 /usr/class02/liu
- 验证
使用Xmanager或SecureCRT工具验证需求目标
- :基本网络配置
8.1 OSI模型和TCP/IP模型
1)国际标准化组织(International Standard Organization,ISO)于1984年颁布了开放系统互连(Open System Interconnection,OSI)参考模型
OSI参考模型是一个开放式体系结构,它规定将网络分为七层,从下往上依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
2)TCP/IP网络模型是Internet所采用的基本模型,它先于ISO的网络模型用于实际的网络中。标准的TCP/IP有四层:
接口层[host-to-net]: 数据的传输,相当于数据链路层和物理层
网间层[inter-network]: 网络间的寻址和数据的传输,相当于网络层。
传输层: 提供可靠的传输服务,相当于传输层。
应用层: 实现一切与应用程序相关的功能,相当于应用层、表示层、会话层。
8.2设备与层的对应关系
8.3 TCP/IP协议族的组成
什么是ARP协议
局域网中主机的通信,通过IP地址与MAC地址
Address Resolution Protocol,地址解析协议,将一个已知的IP地址解析成MAC地址
8.4 IP地址
分为公网Internet IP和私网IP
公网IP又分IPv4(32位)和未来的IPv6(128位)
我们这里讨论的是IPv4的结构
一个B类的Ip地址
8.5子网与子网掩码
网络掩码是来确定两个IP是否属于一个网段(或子网)
如果两台主机的IP地址和网络掩码的“与”的结果相同,则这两台主机是在同一个网络中。
标准网络掩码(没有子网)是:
A类地址的掩码是255.0.0.0;
B类地址的掩码是255.255.0.0;
C类地址的掩码是255.255.255.0
在实际应用中,一般会将一个网络分为多个子网,如可将一个A类网络分成256个B类子网络,同样,B类地址、C类地址也可以分层。
同一网络中的不同子网用子网掩码来划分,子网掩码是标准网络掩码的扩充。
示例:清华大学校园网是一个B类网络,但它分成了几十个子网。
如:计算中心子网由四个C类地址构成,IP地址范围为
166.111.4.1--166.111.7.254;
子网掩码为255.255.252.0。
广播地址是166.111.7.255。
我们就从判断一下下面的三台主机是否在一个网段呢:
主机1:166.111.4.5
主机2:166.111.5.1
主机3:166.111.80.16
三个IP地址转换成二进制后,分别同子网掩码进行逻辑“与”。
红色部分是“与”后的结果,它表示子网的网络地址。
可以清晰的看出地址1和地址2在一个子网中,而地址3是另一个子网。
8.6 Linux的基本网络配置
一)三个基本配置文件
1)主机名称配置文件/etc/sysconfig/network
- 网络卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-eth0:第1块以太网卡的配置文件
ifcfg-eth1:第2块以太网卡的配置文件
- 本地IP与别名配置文件/etc/hosts
二)脚本文件/etc/init.d/network
用途:重新加载网络服务,设置相关网络参数
两种方法:
1)/etc/init.d/network 控制参数
2)service network 控制参数
常用控制参数
start:启动服务
stop:终止服务
status:查看服务状态
restart:重新启动服务程序
- 查看网络状态
1)ifconfig命令可已查看和设置网络接口的属性
显示:
#ifconfig
#ifconfig -a
#ifconfig -eth0
另有一个常用的类似命令
#ip ad sh
临时修改,
#ifconfig eth0 192.168.0.99 hw ether 00:11:00:00:11:11
netmask 255.255.255.0 broadcast 192.168.0.255 up 不改配置文件,下次启动无效
临时禁用启动网卡
#ifconfig eth0 up
#ifcofnig eth0 down
- route命令可查看和维护系统路由表信息,可查看和设置缺省网关的地
3)ping命令用于测试当前主机与目标主机之间的网络连接
4)traceroute命令用于测试当前主机与目标主机间的所有网络节点的连接状态(window下tracert www.sohu.com)
[root@cuug ~]# traceroute 192.168.3.99
- netstat用来显示各种各样的与网络相关的状态信息, 有网络信息大全之称
常用命令选项
-a:显示所有活动连接
-n:以数字形式显示
-p:显示进程信息
-t:查看TCP协议相关信息
-u:查看UDP协议相关信息
-r:显示路由表信息
- :Linux磁盘管理
9.1 linux硬盘的基本概念:
1)在linux中,每一个硬件设备都会以一个文件的形式映射到/dev目录下,第一个IDE设备定义为hda, 第二个IDE设备就定义为hdb,以此类推,而SCSI设备就应该是sda、sdb、sdc等。
- 对于每一个硬盘(IDE/SCSI)设备,linux分区分配一个1-16的序列号码,这就代表了硬盘上面的分区号码,示例:加一块SCSI硬盘,第一个分区是编号是sdb1,第二个分区就是sdb2,以此类推…
- 有三种分区,分别是主分区,扩展分区和逻辑分区,主分区的作用是启动操作系统,所以linux的启动系统或引导程序都应该存放在主分区上。逻辑分区实际上是扩展分区的具体体现,扩展分区要占用一个设备号。linux规定了主分区(或者扩展分区)一共最多是4个,分别占用1至16号码中的前四个号码,示例:第一个SCSI硬盘的主分区(或扩展分区)占用sda1, sda2, sda3, sda4,而逻辑分区则可以占用sda5到sda16等12个号码,这就对应上了前面所说的最多16个分区。
- linux安装时一般选择ext3格式,这个文件格式存取效率较高,是一种日志型文件系统,但是windows是不识别的,ext3是GNU/linux系统中标准的文件系统。
一个分区做成了ext3文件系统后,如果要使用必须挂载它(mount), 系统缺省提供了一个目录,就是/mnt,当然你可以根据需要再建其他的目录作为挂载点,只读设备如光驱也如此。
9.2 挂载、卸载文件系统
1)mount命令
用途:挂载文件系统、ISO镜像到指定文件夹
格式:mount [ -t 类型 ] 存储设备 挂载点目录
2)umount命令
用途:卸载已挂载的文件系统
格式:umount 存储设备位置
3)如何在vbox下mount光盘
第一步,分配光驱
这一步相当于把光盘插入光驱
第二步,手工mount光盘
[root@cuug]#mount /dev/cdrom /media
4)系统挂载表
/etc/fstab文件称为系统挂装表
作用是当系统启动时自动mount的文件系统
只需要用文本编辑器修改系统挂装表,添加相应的mount记录即可。
第一字段:设备位置
第二字段:挂载点
第三字段:文件系统类型
第四字段:挂载参数,即mount命令“-o”选项后可使用的参数,如defaults、rw等
第五字段:表示文件系统是否需要dump备份(dump是一个备份工具),一般设为1时表示需要,设为0时将被dump所忽略
第六字段:该数字用于决定在系统启动时进行磁盘检查的顺序,0不进行检查,1优先,2其次。对于根分区应设为1,其它分区设为2
此表修改要小心,因改写错误可能使系统不能启动,如果提示发现文件是只读的,
请尝试重新mount后再次修改fstab文件
#mount -n -o remount, rw /
9.3增加SWAP分区
扩充一块swap空间最好来自一个单独的分区,尽量避免使用根分区,但我们这里只是讲解一下步骤,就使用一次根分区吧
[root@cuug ~]# free –m 查看内存空间分配
[root@cuug ~]# df –h 查看磁盘空间分配
先用dd命令生成一个空文件,把它放在/下,单位1024m,设置2G。另外bs的单位M要大写
[root@cuug ~]# dd if=/dev/zero of=/swap1 bs=1M count=2048
2)创建一个swap类型文件,名字随便
[root@cuug ~]# mkswap /swap1
3)将swpf1生成swap文件
[root@cuug ~]# swapon /swap1
查看一下,swap1起作用了
[root@cuug ~]# free –m
4)实现开机后自动使用新添swap1分区
[root@cuug ~]# vi /etc/fstab
添加swap行
/swap1 swap swap defaluts 0 0
5)修改tmpfs行 tmpfs是一个虚拟内存(物理内存+交换区)的文件系统
tmpfs /dev/shm tmpfs defaults,size=2G 0 0
6)tmpfs重置一下,使其当下有效
[root@cuug ~]#mount -o remount /dev/shm
- 如何撤销操作,返回原状
[root@cuug ~]#swapoff /swap1
[root@cuug ~]#rm -rf /swap1
修改/etc/fstab文件 逆操作回到初始状态
9.4磁盘操作相关命令
1)du用于查看磁盘使用情况。
du –s 显示当前目录总的使用量
du –h 带单位显示磁盘各个文件的使用量令
[root@cuug ~]#du -sh
888K .
[root@cuug ~]#du -sh /etc
114M /etc
2)df 用于查看磁盘剩余情况。
df -i显示系统i-node的使用剩余情况,而不是磁盘空间的大小
df -h 带单位显示磁盘信息
[root@cuug ~]#df -i
文件系统 Inode (I)已用 (I)可用 (I)已用% 挂载点
/dev/sda2 7318528 127440 7191088 2% /
/dev/sda1 26104 34 26070 1% /boot
tmpfs 223858 1 223857 1% /dev/shm
[root@cuug ~]#df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 28G 4.7G 21G 19% /
/dev/sda1 99M 12M 83M 13% /boot
tmpfs 1014M 0 1014M 0% /dev/shm
3)磁盘分区命令
fdisk 的子命令
m:显示命令帮助清单
a:激活分区的可引导标志
l:列出可选的分区类型
n:添加新分区
d:删除已经存在的分区
p:显示分区表
t:改变分区的文件系统类型
w:写分区表
q:退出
- 磁盘格式化操作
语法: mkfs <选项> <分区设备名>
如:#mkfs -t ext3 /dev/sdb1
或者: mkfs.ext3 <分区设备名>
如:#mkfs.ext3 /dev/sdb1
5)练习:添加一块虚盘(5G)
5.1)关闭虚机,创建一块5G虚盘(Disk1),启动虚机后,在Linux下对应的是/dev/sdb
[root@cuug ~]# fdisk /dev/sdb 整个盘做一个成一个分区
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-652, default 1): enter
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-652, default 652): enter
Using default value 652
Command (m for help): w 一定要存盘才有效
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
5.2)将虚盘格式化为ext3文件系统,mount到/disk1下
[root@cuug ~]#mkdir /u01
[root@cuug ~]#mkfs -t ext3 /dev/sdb1
[root@cuug ~]#mount /dev/sdb1 /u01
5.3)添加/etc/fstab描述,完成自动挂载
[root@cuug ~]#vi /etc/fstab
/dev/sdb1 /u01 ext3 defaults 0 0 添加一行
[root@cuug ~]#mount -o remount /u01 重载一下
[root@cuug ~]#df
9.5磁盘限额
Linux系统在默认情况下,并不限制每个用户或组使用磁盘空间的大小,如果某个用户疏忽或恶意将磁盘占满,将导致系统无法进行写操作甚至崩溃。
Linux提供的磁盘限额是基于磁盘分区的,而不是基于目录的。
本节实验目标是为第七章第七节(7.7)的示例提供磁盘限额功能。
一)设置磁盘限额的步骤:
(1)启动分区限额功能
(2)生成限额信息文件
(3)设置用户和组限额
(4)启动磁盘限额服务
二)实验:配置磁盘限额
1)启动分区限额功能;/etc/fstab文件中添加描述
[root@cuug ~]#vi /etc/fstab
[root@cuug ~]#mount -o remount /disk1
[root@cuug ~]#df
- 生成配额信息文件
[root@cuug ~]#quotacheck -avug
[root@cuug ~]#ls -al /disk1
drwxrwxrwx 5 root root 4096 12-10 14:52 .
drwxr-xr-x 26 root root 4096 12-10 14:11 ..
-rw------- 1 root root 7168 12-10 14:55 aquota.group
-rw------- 1 root root 8192 12-10 14:57 aquota.user
- 设置用户和组限额
3.1)设置用户限额
[root@cuug disk1]#edquota -u ran
[root@cuug disk1]#edquota -p ran wang liu 复制给其他用户
3.2)设置组限额
[root@cuug disk1]#edquota -g class01
[root@cuug disk1]#edquota -g -p class01 class02 复制给其他组
3.3)查看用户和组限额
[root@cuug disk1]#repquota -avug
参数说明:
-a 扫描/etc/fstab里有加入quota的分区,
-v 显示指令执行过程
-u 计算当前user使用磁盘空间和Inode数
-g 计算当前group使用磁盘空间和Inode数
- 启动磁盘限额服务
[root@cuug ]#quotaon -a
/disk1的磁盘限额已经开启
5)迁移/usr下用户目录到/disk1下,并建立链接
[root@cuug ~]#mv /usr/class01 /disk1
[root@cuug ~]#mv /usr/class02 /disk1
[root@cuug ~]#ln -s /disk1/class01 /usr/class01
[root@cuug ~]#ln -s /disk1/class02 /usr/class02
- 测试磁盘限额作用
以ran用户登录
[ran@cuug ~]$dd if=/dev/zero of=/usr/class01/ran/ranfile bs=1024K count=50
- 删除磁盘限额
[root@cuug ~]#quotaoff -a 关闭quota
[root@cuug ~]#rm /disk1/aquota.* 删除/disk1下的两个磁盘限额文件
[root@cuug ~]#vi /etc/fstab 去除usrquota,grpquota描述
9.6磁盘阵列的RAID存储技术
- RAID介绍
RAID技术是以硬件方式(磁盘柜及控制器)实现的存储管理技术,可以实现数据并行读写、快速的动态扩容及支持多种容错方案。
- Raid0
由两块或两块以上硬盘组成,但是每块硬盘所贡献的空间大小必须相同,读写效率高
- Raid1
由两块磁盘组成,每块磁盘提供相同大小的空间,支持容错,即一块硬盘损坏后数据不会丢失,磁盘空间利用率50%
镜像卷
磁盘 0
磁盘 1
C:
C:
数据
- Raid5
至少需要三块硬盘,每块硬盘必须提供相同的磁盘空间,提供容错功能,磁盘空间利用率n-1/n,n为磁盘数量
- Raid 1+0(或0+1)
RAID 0+1vs RAID 1+0
RAID0+1是先做两个RAID0,然后再做RAID1,因此RAID0+1允许坏多个盘,但只能在坏在同一个RAID0中,不允许两个RAID0都有坏盘。
RAID1+0是先做RAID1,然后再做RAID0,因此RAID1+0允许坏多个盘,只要不是一对磁盘坏。
结论:RAID1+0比RAID0+1安全得多,因为在同一对磁盘中,两块磁盘都坏掉的概率很低。
9.7逻辑卷管理器LVM
- 什么是逻辑卷、特点
1)Logical Volume Manager,逻辑卷管理
LVM是以完全的软件方式实现的磁盘高级管理
屏蔽了底层磁盘布局,便于动态调整磁盘容量
需要注意:/boot分区用于存放引导文件,不能应用LVM机制
- 逻辑卷有三大优点
- 在多个磁盘上条带化存储数据,提供并行IO能力
- 可以建立磁盘镜像,提供容错功能保护数据
- 扩展性好,根据需要灵活扩容存储空间
- Linux LVM如何组织并存储数据
1)线性卷:
一个线性卷可以将多个物理卷,集合到一个逻辑卷中。示例:如果有两个磁盘,60G和40G,我们可以创建一个100G的逻辑卷。其实就是将物理存储串连在一起了,写入数据到线性卷时,数据在磁盘是顺序写入的,即第一块物理盘写满了,再写入第二块磁盘。
2)条状卷:
当向LVM逻辑卷读写数据时,文件系统在基本物理卷之间部署数据。相当于同时从多个物理盘上读写(类似RAID0技术)。对于大批量的读取和写入,这样可以提高数据输入/输出的效率。
进行条状分布:所谓的round-round。
数据的第一条写入PV1
数据的第二条写入PV2
数据的第三条写入PV3
数据的第四条写入PV1
3)镜像卷:
镜像维护不同设备中的相同的副本。当向一个设备中写入数据时,也会向第二个设备中写入,即镜像保存数据(相当于RAID1)。当镜像的一个分支失败时,逻辑卷就成为一个线性卷,但仍然可访问。使用LVM,可以创建有多个镜像的镜像逻辑卷。
- LVM 的管理命令
主要命令的用法
pvcreate 设备名
vgcreate 卷组名 物理卷名1 物理卷名2
lvcreate -L 大小 -n 逻辑卷名 卷组名
lvextend -L +大小 /dev/卷组名/逻辑卷名
四)LVM应用示例
需求描述:
公司的邮件服务器由于用户数量众多,邮件存储需要大量的空间,考虑到动态扩容的需要,计划增加两块SCSI硬盘并构建LVM逻辑卷,挂载到“/mail”目录专门用于存放邮件数据
第一步,需要两块磁盘,第一块5G(已有),第2块10G(添加)
第二步,/dev/sdb1分区已有,将/dev/sdc建立磁盘分区,
第三步 Linux的LVM相关操作
步骤1、创建PV
[root@cuug ~]#pvcreate /dev/sdb1
[root@cuug ~]#pvcreate /dev/sdc1
[root@cuug ~]#pvdisplay 查看PV创建出来的结果
步骤2、创建VG
[root@cuug ~]#vgcreate mail_store /dev/sdb1 /dev/sdc1
[root@cuug ~]#vgdisplay 查看VG的信息
步骤3、从VG中划分出LV
[root@cuug ~]#lvcreate -L 6G -n mail mail_store
[root@cuug ~]#lvdisplay 查看LV的信息
[root@cuug ~]#ls /dev/mail_store/mail
步骤4、格式化LV
[root@cuug ~]#mkfs.ext3 /dev/mail_store/mail
步骤5、挂载使用
[root@cuug ~]#mount /dev/mail_store/mail /mail
[root@cuug ~]#df 查看挂载信息
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 28337624 2819848 24055060 11% /
/dev/sda1 101086 11528 84339 13% /boot
tmpfs 1037508 0 1037508 0% /dev/shm
/dev/mapper/mail_store-mail
6192704 143488 5734644 3% /mail
步骤6、从卷组 mail_store 上再划出8GB给逻辑卷mail
[root@cuug ~]#lvextend -L +8G /dev/mail_store/mail
Extending logical volume mail to 14.00 GB
Logical volume mail successfully resized
步骤7、使用resize2fs命令更新系统识别的文件系统大小
[root@cuug ~]#resize2fs /dev/mail_store/mail
[root@cuug ~]#df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 28337624 2821600 24053308 11% /
/dev/sda1 101086 11528 84339 13% /boot
tmpfs 1037508 0 1037508 0% /dev/shm
/dev/mapper/mail_store-mail
14449712 146552 13569260 2% /mnt
第四步 如何返回原状(使用XXremove命令逆操作)
[root@cuug ~]#umount /mail
[root@cuug ~]#lvremove /dev/mail_store/mail
Do you really want to remove active logical volume mail? [y/n]: y
Logical volume "mail" successfully removed
[root@cuug ~]#vgremove mail_store
Volume group "mail_store" successfully removed
[root@cuug ~]#pvremove /dev/sdb1 /dev/sdc1
Labels on physical volume "/dev/sdb1" successfully wiped
Labels on physical volume "/dev/sdc1" successfully wiped
最后删除sdb和sdc虚盘
第十章:Linux NFS服务
10.1 NFS服务简介
NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。
NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。
NFS服务器可以看作是一个FILE SERVER,它可以让你的机器通过网络将远端的NFS SERVER共享出来的目录MOUNT到自己的系统中。
在客户端看来使用NFS的远端文件就象是在使用本地文件一样。
10.2 NFS守护进程
nfsd:
它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器;
mountd:
它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。
portmap:
主要功能是进行端口映射工作。
10.3 NFS服务器的配置
1)需要的包,一般缺省都安装好了,如果需要可从镜像文件中安装
- NFS的相关配置文件和命令
/etc/exports NFS服务的主要配置文件
/usr/sbin/exportfs NFS服务的管理命令
/usr/sbin/showmount 客户端的查看命令
3)/etc/exports文件内容格式:
<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
系统并没有默认值,这个文件不一定会存在,可能要手动建立,然后在文件里面写入配置内容。
如:将NFS Server的/soft共享给192.168.3.0/24网段,权限读写。
# vi /etc/exports
/soft 192.168.3.0/24(rw)
10.4准备环境
复制第二台虚机,命名vbox_c,主机名改为cuug_c,IP改为192.168.3.99
启动vbox_c虚机, 主控台下修改三个网络配置文件
#vi /etc/sysconfig/network
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
#vi /etc/hosts
网卡配置文件由于重置了MAC,virtualbox 把原来的eth0做了一个备份eth0.bak
然后新建了eth0网卡,但是ip是缺省是dhcp的,需要简单修改一下
- vi ifcfg-eth0.bak 更改的IP地址和MAC地址(更改为重置后的MAC)
2)mv ifcfg-eth0.bak ifcfg eth0 把eth0.bak变成eth0
- service network restart 重启网络
- Ifconfig 检查网络
10.5配置并测试NFS
节点cuug
[root@cuug ~]# service portmap status 默认是启动的,否则启动它
portmap (pid 1843) 正在运行...
[root@cuug ~]# service nfs start
[root@cuug ~]# vi /etc/exports
/soft 192.168.3.0/24(rw)
[root@cuug /]# exportfs -av 扫描/etc/exports文件
exporting 192.168.3.0/24:/soft
什么是portmap服务,NFS文件系统还需要调用其它服务,由于NFS服务本身不提供文件传输功能,我们要远程使用NFS文件系统就需要RPC服务的支持;而 portmap服务用来为RPC服务进行动态端口分配和映射,所以portmap服务也是NFS服务所必须的。
[root@cuug ~]# mkdir /soft
[root@cuug ~]# touch /soft/abc
[root@cuug ~]# chmod -R 777 /soft /soft这个目录准备共享了,里面有点文件更好
[root@cuug ~]# showmount -a 查看那些客户端mount了自己,现在还没有。
节点cuug_s
[root@cuug_s ~]# service portmap status 默认是启动的,否则启动它
[root@cuug_s ~]# service nfs start
[root@cuug_s ~]# showmount -e
Export list for cuug_s:
[root@cuug_s ~]# showmount -e 192.168.3.88
Export list for 192.168.3.88:
/soft 192.168.3.0/24
[root@cuug_s ~]# mkdir /soft 客户端建立一个本地挂载点
[root@cuug_s ~]# mount 192.168.3.88:/soft /soft
[root@cuug_s ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 28337624 4920976 21953932 19% /
/dev/sda1 101086 11528 84339 13% /boot
tmpfs 1037508 0 1037508 0% /dev/shm
192.168.3.88:/soft 28337664 4920832 21954048 19% /soft
[root@cuug_s ~]# ls -al /soft
总计 296
drwxr-xr-x 2 root root 4096 12-01 15:00 .
drwxr-xr-x 26 root root 4096 12-03 10:42 ..
-rw-r--r-- 1 root root 184037 12-01 14:06 rlwrap-0.30.tar.gz
-rw-r--r-- 1 root root 95310 12-01 14:06 rlwrap-0.41-1.el5.i386.rpm
NFS测试完毕
10.6自动启动NFS和客户端自动挂载目录(可选)
服务器和客户端分别配置
[root@cuug ~]# chkconfig --list portmap 查看自动启动是否开启
[root@cuug ~]# chkconfig --list nfs
[root@cuug ~]# chkconfig portmap on 设置启动级别3将该服务自动启动
[root@cuug ~]# chkconfig nfs on
客户端配置
[root@cuug ~]# vi /etc/fstab
最后一行追加:192.168.3.88:/soft /soft nfs defaults 0 0
/soft为客户端的mount点,类型为nfs
- :编写shell管理脚本
11.1 Shell环境概述
Shell的作用及常见种类
Shell的作用 —命令解释器,“翻译官”
介于操作系统内核与用户之间,负责解释命令行
Shell环境的切换
1)登录Shell
/etc/shells 文件记录了系统支持的有效登录Shell
2)切换Shell环境
临时切换:直接执行其他Shell程序,示例ksh、zsh等
更改用户登录Shell:
需修改 /etc/passwd 文件中用户记录的最后一个字段
或执行:usermod -s Shell程序路径 用户名
Bash的命令历史
1)保存用户曾经执行过的命令操作
存放位置:~/.bash_history 文件
2)查看历史命令
使用↑、↓按键逐条翻看,允许编辑并重复执行
3)执行:history
清除历史命令history -c
4)调用历史命令
!n:执行历史记录中的第n条命令
!str:执行历史记录中最近一次以“str”开头的命令 这个有用
设置记录历史命令的条数
修改 HISTSIZE 参数(默认为1000条)
Bash的命令别名
为使用频率较高的复杂命令行设置简短的调用名称
存放位置:~/.bashrc
查看命令别名:格式:alias [别名]
如:alias sqlplus='rlwrap sqlplus'
取消已设置的命令别名 格式:unalias 别名
11.2 Shell变量应用
变量的种类
Shell变量是用来代表某个值的符号名,变量是shell传递数据的一种方法。
为灵活管理Linux系统提供特定参数,有两层意思:
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境变化而变化
Shell变量的种类
1)用户自定义变量:由用户自己定义、修改和使用
2)环境变量:由系统维护,用于设置用户的Shell工作环境,只有极少数的变量用户可以修改
3)预定义变量:Bash预定义的特殊变量,不能直接修改
4)位置变量:通过命令行给程序传递执行参数
用户自定义变量
定义新的变量:变量名要以英文字母或下划线开头,区分大小写
格式:变量名=变量值
查看变量的值
格式:echo $变量名
赋值号的两边没有空格
在使用变量值时,要在变量名前加上前缀“$”。
示例:
[root@cuug ~]# abc='hellow world' 字符串中有空格要使用引号
[root@cuug ~]# echo $abc
hellow world
[root@cuug ~]# unset abc 删除变量
变量值可以作为某个长字符串中的一部分。
如果它在长字符串的末尾,就可以利用直接引用形式
如果变量的值须出现在长字符串的开头或中间,避免shell把它与其他字符混在一起,则应该用花括号将变量名括起来。
示例:
[root@cuug ~]# abc=china
[root@cuug ~]# echo www.$abc.com
www.china.com
[root@cuug ~]# echo www.$abccuug.com
www..com
[root@cuug ~]# echo www.${abc}cuug.com
从键盘输入内容为变量赋值
格式: read [-p “提示信息"] 变量名
结合不同的引号为变量赋值
双引号 “ ” :允许通过$符号引用其他变量值
单引号 ‘ ’ :禁止引用其他变量值,$视为普通字符
[root@cuug ~]# vi myapp1.sh
#!/bin/bash
x=abc
printf "x is now '%s'. Enter new value: " $x
read x
echo $x
验证
[root@cuug ~]# sh myapp2.sh
x is now 'abc'. Enter new value: POD
POD
倒引号 ` ` :将命令执行的结果输出给变量
示例:
[root@cuug ~]# find /dev -type p
/dev/initctl
[root@cuug ~]# ls -l `find /dev -type p`
prw------- 1 root root 0 01-30 13:02 /dev/initctl
环境变量
Shell有两类变量:临时变量和全局变量
临时变量是shell程序内部定义的,其使用范围仅限于定义它的程 序,对其它程序不可见。包括:用户自定义变量、位置变量和预定义变量。
全局变量是环境变量,其值不随shell脚本的执行结束而消失。把一 个Shell变量用EXPORT命令导出,就创建了环境变量。它们对于以后在该Shell下执行的所有程序都是可见的。
设置环境变量PATH
常用命令的目录放在PATH变量中,使用频度高命令的目录排在前面;
尽量避免查询大目录,如需设置,将其路径放在PATH路径的最后位置。
例: PATH=/bin:/usr/bin:/etc:/:.
位置变量(参数)
在执行Shell脚本时,可以定义最多9个位置参数,表示为 $n,n为1~9之间的数字
预定义变量
表示形式如下
$#:命令行中位置参数的数量
$*:所有位置参数的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$$:当前所在进程的进程号
$!:后台运行的最后一个进程号
$0:当前执行的进程/程序名
Shell中的通配符
- * 匹配任何字符串。
- ?匹配任何单个字符。
- [...,-]匹配方括号所限定的任何一个字符。
示例:
[a-d,x,y]是匹配单个字符a、b、c、d、e、x、y
[!Z] 是匹配不是Z的所有单个字符
- \ 转意符,使原字符失去其特殊的含义。
基本的算数运算
计算整数表达式的运算结果
格式:expr 变量1 运算符 变量2 ...[运算符 变量n]
expr的常用运算符
加法运算:+
减法运算: -
乘法运算: \*
除法运算: /
求模(取余)运算: %
[root@cuug ~]# bash
[root@cuug ~]# a=1
[root@cuug ~]# b=2
[root@cuug ~]# c=`expr $a + $b`
[root@cuug ~]# echo $c
3
[root@cuug ~]# c=`expr \( $a + $b \) \* $b`
[root@cuug ~]# echo $c
6
使用let命令格式更友好,但有些Shell不支持。
[root@cuug ~]# let c=a+b
[root@cuug ~]# echo $c
3
[root@cuug ~]# let c=(a+b)*b
[root@cuug ~]# echo $c
6
逻辑操作符
1)逻辑与&&:可以把两个命令联系在一起
形式:命令1 && 命令2
功能:先运行命令1,如果成功,才运行命令2,否则不运行命令2
2)逻辑或||:命令互补
形式:命令1 || 命令2
功能:先运行命令1,不成功运行命令2,否则不运行命令2.
试比较下面的例子:
[root@cuug ~]# ls -l;date;uptime;LS;ls
[root@cuug ~]# ls -l&&date&&uptime&&LS&&ls
[root@cuug ~]# ls -l||date||uptime||LS||ls
成组命令
在shell中可以使用2种方式可以将若干命令组合在一起,只返回一个逻辑结果。
使用花括号{}
使用圆括号()
以花括号括起来的命令可视为语法上的一条命令。成组命令的执行顺序 是根据命令出现的先后次序,由左向右执行。
在使用花括号时在格式上应注意,左括号“{”后面应有一个空格;右括 号“}”之前应有一个分号“;”。
在使用(){} 也可以包含若干单独占一行的命令。
[root@cuug ~]# vi test.sh
Parent="P"
echo Before: $Parent
{
Parent="C"
echo After: $Parent
}
echo After: $Parent
验证:
[root@cuug ~]# sh test.sh
Before: P
After: C
After: C
把{}换成()后
[root@cuug ~]# sh test.sh
Before: P
After: C
After: P
用圆括号括起来的成组命令是在新的子shell内执行,由于不属于同一进程,因此,在圆括号内的命令不会改变父 shell的变量值及工作目录。
11.3 编写并执行Shell脚本(一)
Shell脚本概念
用途:完成特定的、较复杂的系统管理任务
格式:集中保存多条Linux命令,普通文本文件
执行方式:按照预设的顺序依次解释执行
脚本文件的内容
运行环境设置:#!/bin/bash
注释信息:以#开始的说明性文字
可执行的Linux命令行
脚本的可执行权限
1)直接执行具有“x”权限的脚本文件
示例:./repboot.sh
2)使用指定的解释器程序执行脚本内容
示例:bash repboot.sh、sh repboot.sh
3)通过source命令(或 . )读取脚本内容执行
示例:souce repboot.sh 或 . Hello.sh
11.4 编写并执行Shell脚本(二)
11.4.1条件测试操作
test命令
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
格式:test 条件表达式
[ 条件表达式 ]
常见的测试类型
测试文件状态
字符串比较
整数值比较
逻辑测试
条件测试-测试文件
测试文件状态
格式:[ 操作符 文件或目录 ]
常用的测试操作符
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否可执行(Excute)该文件
-L:测试是否为符号连接(Link)文件
条件测试-整数值比较
整数值比较
格式:[ 整数1 操作符 整数2 ]
常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
[root@cuug ~]# vi finduser
#!/bin/bash
if [ $# -ne 1 ]
then
echo Usage: finduser username >&2
exit 1
fi
who | grep $1
验证:
[root@cuug ~]# bash ./finduser root
root pts/0 2016-02-01 08:52 (192.168.3.100)
条件测试-字符串比较
字符串比较
格式:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
条件测试—逻辑测试
逻辑测试
格式:[ 表达式1 ] 操作符 [ 表达式2 ] ...
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
前后两个表达式都成立时整个测试结果才为真,否则为假
-o或||:逻辑或,“或者”的意思
操作符两边至少一个为真时,结果为真,否则结果为假
!:逻辑否
当指定的条件不成立时,返回结果为真
11.4.2使用if条件语句
通常,if的测试部分是利用test命令或[]实现的。其实,条件测试可以利用一般命令执行成功与否来作判断:
如果命令正常结束,则表示执行成功,其返回值为0,条件测试为 真,如果命令执行不成功,其返回值不等于0,条件测试就为假。
如果,各命令表可以由一条或者多条命令组成,那么测试条件以其最后一条命令是否执行成功为准。
单分支:当“条件成立”时执行相应的操作
双分支:当“条件成立”、“条件不成立”时执行不同操作
多分支:相当于if语句嵌套,针对多个条件执行不同操作
示例:
[root@cuug ~]# vi finduser
#!/bin/bash
if [ $# -ne 1 ]
then
echo Usage: finduser username >&2
exit 1
fi
who | grep $1
[root@cuug ~]# bash finduser root 一个位置参数
root pts/0 2016-02-01 08:52 (192.168.3.100)
[root@cuug ~]# bash finduser root oracle 两个位置参数时没有结果
Usage: finduser username
[root@cuug ~]# echo $?
1 exit返回值是1
11.4.3使用循环语句
1、For循环
根据变量的不同取值,重复执行一组命令操作
For语句有三种格式,不同在于in的后面可以跟
for 变量 in 值表
For 变量 in 文件正则表达式
For 变量 in 命令行的位置参数
示例1:
# forloop.sh脚本:计算1 3 5 7 9的和;并且输出当前目录下的所有.sh文件。
[root@cuug ~]# vi forapp1.sh
#!/bin/bash
result=0
for i in 1 3 5 7 9
do
let result=result+i
done
echo "result = $result"
###
j=1
for file in *.sh
do
echo "The ${j}th file is: $file"
j=`expr $j + 1`
Done
验证
[root@cuug ~]# bash forapp.sh
示例2:
[root@cuug ~]# vi forapp2.sh
#!/bin/bash
j=1
for i in $*
do
echo "The ${j} th parameter is: $i"
let j=j+1
done
验证
[root@cuug ~]# bash forapp2.sh p1 p2
The 1 th parameter is: p1
The 2 th parameter is: p2
2、While循环语句
重复测试指定的条件,只要条件成立则反复执行对应的命令操作
示例1:whileloop脚本:求1到10的和
[root@cuug ~]# vi whileloop.sh
#!/bin/bash
x=1
result=0
while [ $x -le 10 ]
do
let result=result+x
let x=x+1
done
echo $result
验证
[root@cuug ~]# sh whileloop.sh
55
示例2:
批量添加20个系统用户帐号, 用户名依次为“stu1”、“stu2”、……、“stu20”
这些用户的初始密码均设置为“123456”
#!/bin/bash
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin stu$i &> /dev/null
i=`expr $i + 1`
done
应用示例2:批量删除上例中添加的20个系统用户帐号
#!/bin/bash
i=1
while [ $i -le 20 ]
do
userdel -r stu$i
i=`expr $i + 1`
done
3、Until循环
until语句根据条件执行重复操作
形式:
Until 测试条件
do
命令表
done
它与while语句很相似,只是测试条件不同;当测试条件为假时,才进入循环体,直至测试条件为真时终止循环。
示例:
1)添加一个tim用户,并授予密码
[root@cuug ~]# useradd tim
[root@cuug ~]# passwd tim
- 编写untilloo.sh脚本:等待某个用户(tim)登录,每20秒确定一次
[root@cuug ~]#vi untilloop.sh
#!/bin/bash
printf "Enter username: "
read user
until who | grep $user > /dev/null
do
sleep 20
done
echo "$user have logged in"
- 执行该脚本会一直处于执行状态
[root@cuug ~]#sh untilloop.sh
Enter username: tim
4)在主控台让tim登录,则该脚本才会执行完成。
Enter username: tim
tim have logged in
11.4.4其他控制语句
CASE语句
根据变量的不同取值,分别执行不同的命令操作
Case语句允许进行多重条件选择。语法形式如下:
case 字符串 in
正则表达式 1)命令
命令;;
正则表达式 2)命令
命令;;
正则表达式 n)命令
命令;;
esac
使用case语句应注意:
1)每个正则表达式后面可以有一条或多条命令,其最后一个命令必须 以;;结束。Exit命令后可以不要;;
2)正则表达式中可以使用通配符。
3)如果一个正则表达式是由多个模式组成,那么各模式之间应以竖线 (|)隔开,表示各模式是“或”的关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令表。
4)各正则表达式应是唯一的,不应重复出现。并且要合理安排正则表达式的出现顺序。例如,不应将“*”作为头一个正则表达式。因为与任何字符串匹配,它若第一个出现,就不会再检查其他表达式了。
5)Case的退出(返回)值是整个结构中最后执行的那个命令。若没有执行任何命令,则退出值为零。
示例:
[root@cuug ~]# vi caseapp.sh
#!/usr/bin/bash
name=`basename $0 .sh`
case $1 in
s|start)
echo "start..."
;;
stop)
echo "stop..."
;;
reload)
echo "reload..."
;;
*)
echo "Usage: $name [start|stop|reload]"
exit 1
;;
esac
exit 0
注:basename命令是删除以/结尾的所有前缀和.sh(这里就是取得不带路径的执行的shell脚本的名称, 扩展名.sh也会去掉。)
验证
[root@cuug ~]# sh caseapp.sh s
start...
[root@cuug ~]# sh caseapp.sh start
start...
[root@cuug ~]# sh caseapp.sh stop
Stop...
[root@cuug ~]# echo $?
0
[root@cuug ~]# sh caseapp.sh abc
Usage: caseapp [start|stop|reload]
[root@cuug ~]# sh caseapp.sh
Usage: caseapp [start|stop|reload]
[root@cuug ~]# echo $?
1
SHIFT 语句
位置参数最多不能超过9个,即$1~$9。如果实际给定的 命令行参数多于9个,就需要用shift命令移动位置参数。每执行一次 shift 命令,就把位置参数向左移一位,新的$1的值是原来$2的值,新 $2 是原来$3的值,依次类推。
Shift 命令不能把$0移走。
Shift 命令可以带有一个整体作为参数。如果没有带参数默认是1
示例:
[root@cuug ~]# vi myapp2.sh
#!/bin/bash
#loop=0
while [ $# -ne 0 ]
do echo $1
done
# 修改权限,让其可执行
[root@cuug ~]# chmod u+x myapp2.sh
# 执行
[root@cuug ~]# ./myapp2.sh p1 p2 p3
结果:死循环,而不是将所有的参数输出后结束
#!/bin/bash
#loop=0
while [ $# -ne 0 ]
do echo $1
shift
done
[root@cuug ~]# ./myapp1.sh p1 p2 p3
p1
p2
p3...
如果改成shift 2如何
循环控制语句
break语句
在for、while、until等循环语句中,用于跳出当前所在的循环体,执行循环体后的语句
continue
在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环
Shell函数应用
Shell函数概述
在编写Shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可称为函数
合理使用Shell函数,可以使脚本内容更加简洁,增强程序的易读性,提高执行效率
应用示例:
在脚本中定义一个加法函数,用于计算2个整数的和
调用该函数计算(12+34)、(56+789)的和
[root@cuug ~]# vi addderfun.sh
#!/bin/bash
adder() {
echo `expr $1 + $2`
}
adder 12 34
adder 56 789
验证
[root@cuug ~]# sh adderfun.sh
46
845




