linux目录如下:
/boot,/etc,/usr,/var,/dev,/lib,/tmp,/bin,/sbin,
/proc,/sys,/mnt,/media,/home,/root,/misc,/opt,/srv
/etc、/bin、/sbin、/lib:系统启动就需要用到的程序,这些目录不能挂载额外的分区,必须在根文件系统的分区上
/usr/bin(sbin、lib):操作系统核心功能,可以单独分区
/usr/local/bin(sbin、lib、etc、man):第三方软件安装位置
软件包管理器的核心功能:
1、制作软件包;
2、安装、卸载、升级、查询、校验;
Redhat、SUSE:RPM
Debian:dpt
yum命令:
rpm:
数据库:/var/lib/rpm
rpmbuild:
安装、查询、卸载、升级、校验、数据库的重建、验证数据包等工作;
rpm包种类:
二进制格式
rpm包作者下载源程序,编译配置完成后,制作成rpm包
源码格式
rpm命名:
包:组成部分
主包:
bind-9.7.1-1.e15.i586.rpm
子包:
bind-libs-9.7.1-1.e15.i586.rpm
bind-utils-9.7.1-1.e15.i586.rpm
包名格式:
包名-版本号-发行号.发行平台.后缀名
name-version-release.arch.rpm
包名-版本号.次版本号.源程序制作者发行号-rpm包制作者发行号.发行平台.后缀名
bind-maior.minor.release-release.arch.rpm
主版本号:重大改进
次版本号:某个子功能发生重大变化
发型号:修正了部分bug,调整了一点功能
rpm功能:
1、安装:
rpm -i /PATH/TO/PACKAGE_FILE
-h:以#显示进度,每个#表示2%;
-v:显示详细过程;
-vv:显示更详细过程
rpm -ivh /PATH/TO/PACKAGE_FILE
--nodeps:忽略依赖关系;
--replacepkgs:重新安装,替换原有安装;
--force:强行安装,可以实现重装或降级
--test:测试rpm包无法安装的原因
2、查询:
rpm -q PACKAGE_NAME:查询指定的包是否已安装
rpm -qa:查询已安装的所有包
rpm -qi PACKAGE_NAME:查询指定包的说明信息;
rpm -ql PACKAGE_NAME:查询指定包安装后生成的文件列表;
rpm -qc PACKAGE_NAME:查询指定包安装的配置文件;
rpm -qd PACKAGE_NAME:查询指定包安装的帮助文件;
rpm -q --scripts PACKAGE_NAME:查询指定包中包含的脚本
rpm -qf /path/to/somefile:查询指定的文件是由哪个rpm包安装生成;
如果某rpm包尚未安装,我们需要查询其说明信息、安装以后会生成的文件:
rpm -qpi /PATH/TO/PACKAGE_FILE
rpm -qpl /PATH/TO/PACKAGE_FILE
3、升级
rpm -Uvh /PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级;否则,则安装;
rpm -Fvh /PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级;否则,则退出;
--oldpackage:版本降级
4、卸载
rpm -e PACKAGE_NAME
--nodeps:忽略依赖关系;
5、校验
rpm -V PACKAGE_NAME
6、重建数据库
#ls /var/lib/rpm
rpm --rebuilddb:重建数据库,一定会重新建立;
rpm --initdb:初始化数据库,没有才建立,有就不用建立;
7、检验来源合法性,及软件完整性;
#ls /etc/pki/rpm-gpg/
PPM-GPG-KEY-redhat-release
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release:导入密钥文件
rpm -K /PATH/TO/PACKAGE_NAME
dsa、gpg:验证来源合法性,也即验证签名;可以使用--nosignature,忽略此项验证;
sha1、md5:验证软件包完整性;可以使用--nodigest,忽略此项验证;
yum命令:
C/S架构:
Client,Server
yum repository(仓库)
文件服务
ftp
web
file(本地文件)
RedHat
DVD
rpm包
元数据文件
createrpo:用于生成元数据文件
HTML:HyperText Mark Language(超文本标记语言)
XML:eXtended Mark Language(扩展标记语言),用于不同系统或主机之间传输数据的
手段,目前常用工具有XML,JSON,通称半结构化的数据
yum仓库中的元数据文件:
primary.xml.gz:1、当前仓库所有RPM包的列表;2、各包的依赖关系;3、每个RPM安装生成的文件列表;
filelists.xml.gz:1、当前仓库中所有RPM包的所有文件列表;
other.xml.gz:1、额外信息,RPM包的修改日志;
repomd.xml:1、包含了primary.xml.gz、filelists.xml.gz及other.xml.gz三个文件的时间戳和校验和;
comps*.xml:RPM包的分组信息(必须安装的、建议安装的、可选安装的信息);
如何为yum定义repo文件:
[Repo_ID]
name=Description
baseurl="仓库路径"
仓库路径方式:
ftp://
http://
file:///
enabled={1|0}:是否启用该repo文件,1表示启用;0表示禁用;
gpgcheck={1|0};是否使用gpg机制验证软件包来源的合法性及完整性;1表示启用;0表示禁用;
gpgkey=file:///"具体存放路径":指定gpg文件的具体存放路径;使用gpgcheck验证需具备gpgkey指令
例:[root@www yum.repos.d]# cat rhel-debuginfo.repo
[rhel-debuginfo]
name=Red Hat Enterprise Linux $releasever - $basearch - Debug
baseurl=ftp://ftp.redhat.com/pub/redhat/linux/enterprise/$releasever/en/os/$basearch/Debuginfo/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
yum [options] [command] [package ...]
list:列表,列出当前yum仓库中所有RPM包,支持glob
all:显示所有
available:可用的,仓库中有但尚未安装的
installed:已经安装的
updates:可用的升级
例:[root@www yum.repos.d]# yum list zsh*
Available Packages
zsh.i386 4.2.6-6.el5 Base
zsh-html.i386 4.2.6-6.el5 Base
clean [ packages | headers | metadata | dbcache | all ]:清理缓存
repolist:显示repo列表及其简要信息;
all:显示所有
enabled:默认使用
disabled:禁用
install:安装
yum install PACKAGE_NAME
-y:自动回答为yes
--nogpgcheck:忽略检查RPM包
update:升级
update_to:升级为指定版本
remove|erase:卸载
info:显示RPM包信息
provides|whatprovides:查看指定文件或特性是由哪个包安装生成的
groupinfo:显示RPM包组信息
grouplist:显示RPM包组列表
例:[root@www yum.repos.d]# yum grouplist
Loaded plugins: katello, product-id, security, subscription-manager
Updating certificate-based repositories.
Unable to read consumer identity
Setting up Group Process
Installed Groups:
GNOME 桌面环境
MySQL 数据库
Available Groups:
DNS 名称服务器
FTP 服务器
groupinstall:安装RPM包组
groupremove:移除RPM包组
groupupdate:升级RPM包组
例:[root@www ~]# cd /etc/yum.repos.d
[root@www yum.repos.d]# vim server.repo
[Base]
name=RHEL5 Server
baseurl=file:///media/cdrom/Server
enabled=1
gpgcheck=0
[VT]
name=RHEL5 VT
baseurl=file:///media/cdrom/VT
enabled=1
gpgcheck=0
[root@www yum.repos.d]# yum repolist
repo id repo name status
Base RHEL5 Server 2,472
VT RHEL5 VT 39
[root@www yum.repos.d]# yum list | less
[root@www yum.repos.d]# yum clean
如何创建yum仓库:
createrpo
例:[root@www ~]# yum install createrepo
[root@www ~]# mkdir -pv /yum/VT
[root@www ~]# cp /media/cdrom/VT/*.rpm /yum/VT
[root@www ~]# cd /yum/VT
[root@www ~]# cd /etc/yum.repos.d
[root@www ~]# vim server.repo
[Base]
name=RHEL5 Server
baseurl=file:///media/cdrom/Server
enabled=1
gpgcheck=0
[VT]
name=RHEL5 VT
baseurl=file:///yum/VT
enabled=1
gpgcheck=0
[root@www yum.repos.d]# createrepo /yum/VT #创建repodata#
[root@www yum.repos.d]# yum clean all
[root@www yum.repos.d]# yum repolist
[root@www yum.repos.d]# cd /media/cdrom/VT/repodata
[root@www yum.repos.d]# cp comps-rhel5-vt.xml /root
[root@www yum.repos.d]# cd
[root@www ~]# createrepo -g /root/comps-rhel5-vt.xml /yum/VT
定制RPM包:手动编译安装
编译环境,开发环境
开发库,开发工具
make:项目管理工具
makefile:定义了make(gcc,g++)按何种次序去编译这些源程序文件中的源程序
automake,-->makefile.in-->makefile
autoconf,-->configure
make install
编译安装的三步骤:
前提:准备开发环境(编译环境),在redhat5中(版本不同会有所差别),
即安装“Development Tools”和“Development Libraries”
#tar #解压缩文件包#
#cd #进入要安装文件的目录下#
#./configure #执行“./configure”脚本#
--help
--prefix=/path/to/somewhere #软件安装位置#
--conf-path=/PATH/TO/CONFFILE_PATH #配置安装路径#
功能:1、让用户选定编译特性;2、检查编译环境;
#make
#make install
例:利用tengine-1.4.2源码包,安装Nginx.
[root@www ~]# tar xf tengine-1.4.2 #解压缩归档#
[root@www ~]# cd tengine-1.4.2/
[root@www tengine-1.4.2]# ls
AUTHORS.te CHANGES.cn conf docs Makefile README tests
auto CHANGES.ru configure html man README.markdown THANKS.te
CHANGES CHANGES.te contrib LICENSE objs src
[root@www tengine-1.4.2]# ./configure --help | less #查看./configure 选项#
[root@www tengine-1.4.2]# yum install pcre-devel #安装PCRE包,因HTTP重写模块依赖于PCRE库#
[root@www tengine-1.4.2]# ./configure --prefix=/usr/local/tengine --conf-path=/etc/tengine.conf #执行configure脚本#
[root@www tengine-1.4.2]# make #编译#
[root@www tengine-1.4.2]# make install #安装#
[root@www ~]#/usr/local/tengine/sbin/nginx #在绝对路径下手动启动nginx功能#
或者“通过修改环境变量实现相对路径启动nginx功能”
[root@www ~]# cd /usr/local/tengine/sbin
[root@www sbin]# nginx
[root@www sbin]# pwd #nginx 二进制文件路径#
/usr/local/tengine/sbin
[root@www sbin]# vim /etc/profile #在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC语句之前,加入PATH=$PATH:/usr/local/tengine/sbin语句#
....
PATH=$PATH:/usr/local/tengine/sbin
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
....
[root@www sbin]# source /etc/profile #系统重读/etc/profile脚本,系统重启后,使修改后的脚本永久生效#
[root@www ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/tengine/sbin:/root/bin:/users/usr/local/bin
[root@www ~]# nginx
检测是否成功,可以在浏览器中输入本机IP地址,
注意事项:1、修改PATH环境变量,以能够识别此程序的二进制文件路径;
(1)修改/etc/profile文件
(2)在/etc/profile.d/目录建立一个以.sh为名称后缀的文件,在里面定义export PATH=$PATH:/path/to/somewhere
2、默认情况下,系统搜索库文件的路径/lib,/usr/lib; 如果系统通过其他路径搜寻库文件,要增添额外搜寻路径:
在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径直接写至此文件中;
执行"ldconfig -v“命令,重新搜寻库文件并显示详细过程;
3、头文件:输出给系统
默认:/usr/include
增添头文件搜寻路径,使用链接进行:
如: ln -s /usr/local/tengine/include/* /usr/include/ 或
ln -s /usr/local/tengine/include /usr/include/tengine
4、man文件路径:安装在--prefix指定的目录下的man目录下,默认在/usr/share/man
若man不在默认路径下,查看man方式:
(1) man -M /PATH/TO/MAN_DIR COMMAND
(2) 在/etc/man.config中添加一条MANPATH
例:利用httpd-2.2.16.tar.gz源码包,安装http:
[root@www ~]# tar xf httpd-2.2.16
[root@www ~]# cd httpd-2.2.16
[root@www httpd-2.2.16]# ./configure --help | less #查看http源码包安装选项#
[root@www httpd-2.2.16]# rpm -q httpd #确保没有使用RPM安装http#
[root@www httpd-2.2.16]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd
[root@www httpd-2.2.16]# make
[root@www httpd-2.2.16]# make install
[root@www apache]# vim /etc/profile.d/httpd.sh #修改PATH环境变量,以能够识别此程序的二进制文件路径#
export PATH=$PATH:/usr/local/apache/bin #二进制文件路径#
[root@www apache]# ldconfig -v #搜寻并显示系统已有的库文件#
[root@www apache]# vim /etc/ld.so.conf.d/httpd.conf #添加httpd.conf 库文件#
/usr/local/apache/lib #库文件路径#
[root@www lib]# ln -sv /usr/local/apache/include /usr/include/httpd #添加头文件搜寻路径#
[root@www lib]# vim /etc/man.config #在/etc/man.config中添加一条MANPATH#
MANPATH /usr/local/apache/man #apache man文件路径#
[root@www lib]# netstat -tnlp #查看已有的80端口运行状态#
[root@www lib]# kill 861 #结束已有的80端口,进程号为861#
[root@www lib]# apachectl start #开启htttpd#
[root@www lib]# netstat -tnlp #查看httpd 80端口是否开启#
检测是否成功,可以在浏览器中输入本机IP地址
[root@www ~]# vim /usr/local/apache/htdocs/index.html #修改http 页面显示内容#
I am an Xman!
#将http 页面显示内容修改为I am an Xman!#
netstat命令:
-r:显示路由表
-n:以数字方式显示
-t:显示建立的tcp连接
-u:显示udp连接
-l:显示监听状态连接
-p:显示监听指定的套接字的进程的进程号与进程名
例:[root@www ~]# netstat -tulnp
while循环:
写一个脚本,完成以下功能:
说明:此脚本能于同一个repo文件中创建多个yum源的指向:
1、接受一个文件名作为参数,此文件存放至/etc/yum.repos.d目录中,且文件名以.repo为后缀;要求,此文件
不能事先存在,否则,报错;
2、在脚本中,提醒用户输入repo id;如果为quit,则退出脚本;否则,继续完成下面的步骤;
3、repo name以及baseurl的路径,而后以repo文件的格式将其保存至指定的文件中;
4、enabled默认为1,而gpgcheck默认设定为0;
5、此脚本会循环执行多次,除非用户为repo id指定为quit;
[root@www ~]# vim mkrepo.sh
#!/bin/bash
#
REPOFILE=/etc/yum.repos.d/$1
if [ -e $REPOFILE ]; then
echo "$1 exists"
exit 3
fi
read -p "Repository ID: " REPOID
until [ $REPOID == 'quit' ]; do
echo "[$REPOID]" >> $REPOFILE
read -p "Repository name: " REPONAME
echo "name=$REPONAME" >> $REPOFILE
read -p "Repository Baseurl: " REPOURL
echo "baseurl=$REPOURL" >> $REPOFILE
echo -e 'enabled=1\ngpgcheck=0' >> $REPOFILE
read -p "Repository ID: " REPOID
done
echo "hello,world."
[root@www ~]# chmod +x mkrepo.sh
[root@www ~]# ./mkrepo.sh hello.repo
Repository ID: hello
Repository name: hello
Baseurl: file:///dev/media/cdrom
Repository ID: quit
hello,world.
[root@www ~]# cd /etc/yum.repos.d
[root@www yum.repos.d]# ls
hello.repo redhat.repo rhel-debuginfo.repo server.repo
while ,until,for 循环体:
break:提前退出循环
例:写一个脚本:从1到1000中一次累加至大于5000结束脚本;
[root@www ~]# vim sum.sh
#!/bin/bash
#
declare -i SUM=0
for I in {1..1000}; do
let SUM+=$I
if [ $SUM -gt 5000 ]; then
break
fi
done
echo $I
echo $SUM
[root@www ~]# chmod +x sum.sh
[root@www ~]# ./sum.sh
100
5050
continue:提前结束本轮循环,而进入下一轮循环;
while 循环特殊用法一:
while : ; do
.....
done
利用死循环查找文件路径是否存在:
[root@www ~]# vim showfile.sh
#!/bin/bash
#
while : ; do
read -p "File path: " FILEPATH
[ $FILEPATH == 'quit' ] && break
if [ -e $FILEPATH ]; then
echo "$FILEPATH exists."
else
echo "No $FILEPATH."
fi
done
echo "Quit."
while 循环特殊用法二:
while read LINE; do
.....
done < /PATH/TO/SOMEFILE
例1:判定/etc/passwd目录下哪个用户默认shell是/bin/bash,如果是,则显示该用户名,否则不显示;
[root@www ~]# vim showuser.sh
#!/bin/bash
#
FILE=/etc/passwd
while read LINE; do
[ `echo $LINE | awk -F : '{print $7}'` == '/bin/bash' ] && echo $LINE | awk -F : '{print $1}'
done < $FILE
例2:判定/etc/passwd目录下哪个用户默认shell是/bin/bash,如果是,则显示前6位该用户名,否则不显示;
#!/bin/bash
#
FILE=/etc/passwd
let I=0
while read LINE; do
[ `echo $LINE | awk -F : '{print $7}'` == '/bin/bash' ] && echo $LINE | awk -F : '{print $1}' && let I++
[ $I -eq 6 ] && break
done < $FILE
例3:判定/etc/passwd目录下哪个用户默认shell是/bin/bash,如果是,则显示UID大于505的前6个用户的用户名,否则不显示;
[root@www ~]# vim showuser.sh
#!/bin/bash
#
FILE=/etc/passwd
let I=0
while read LINE; do
[ `echo $LINE | awk -F : '{print $3}'` -le 505 ] && continue
[ `echo $LINE | awk -F : '{print $7}'` == '/bin/bash' ] && echo $LINE | awk -F : '{print $1}' && let I++
[ $I -eq 6 ] && break
done < $FILE
写一个脚本:
1、判断一个指定的bash脚本是否有语法错误;如果有错误,则提醒用户键入Q或q无视错误并退出,其他任何键可以通过vim打开这个指定的脚本;
2、如果用户通过vim打开编辑后保存退出时仍然有错误,则重复第1步中的内容,否则,正常关闭退出;
[root@www ~]# vim syntax.sh
#!/bin/bash
#
until bash -n $1 &> /dev/null; do
read -p "Syntax error,[Qq] to quit, others for editing: " CHOICE
case $CHOICE in
q|Q)
echo "Something wrong,quiting."
exit 5
;;
*)
vim + $1
;;
esac
done
[root@www ~]# chmod +x syntax.sh
[root@www ~]# vim worng.sh
#!/bin/bash
#
for [ $I=0]; do
echo "smoething"
done
[root@www ~]# ./syntax.sh worng.sh
阅读(1112) | 评论(0) | 转发(0) |