When Everything Is Ready, Everything May Be Too Late.

1991年由芬兰人Linus Torvalds开发出Linux操作系统。简而言之,Linux成功的地方主要在于:Minix(Unix), GNU, Internet, POSIX及虚拟团队的产生。(POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为POSIX),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称)

事实上鸟哥认为distributions主要分为两大系统,一种是使用RPM方式安装软件的系统,包括Red Hat, Fedora, SuSE等都是这类;一种则是使用Debian的dpkg方式安装软件的系统,包括Debian, Ubuntu, B2D等等。

Linux操作系统的文件使用目录树(directory tree)系统,与磁盘的对应需要有“挂载”的操作才行。硬盘的规划对于Linux初学者而言,那将是造成你”头疼”的主要凶手之一。因为硬盘的分区技巧需要对于Linux文件结构有相当程度的认知之后才能够做出比较完善的规划的。
/bin目录(binary)是二进制执行文件目录,管理员和一般的用户都可以使用。/sbin目录(system binary)通常只有管理员才可以运行。

能不能进入某一个目录,只与该目录的x权限有关。要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给。

为什么每套Linux distributions他们的配置文件、执行文件、每个目录内放置的内容其实都差不多?原来是有一套标准依据的!因为利用Linux来开发产品或distributions的团队/公司与个人实在太多了,如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰。你能想象,你进入一个企业之后,所接触到的Linux目录配置方法竟然跟你以前学的完全不同吗?很难想象吧~所以,后来就有所谓的Filesystem Hierarchy Standard (FHS)标准的出炉了!
/srv:srv可以视为”service”的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。常见的服务例如WWW、FTP等等。举例来说,WWW服务器需要的网页数据就可以放置在/srv/www/里面。
/usr:很多读者都会误会/usr为user的缩写,其实usr是Unix Software Resource的缩写,也就是“Unix操作系统软件资源”所放置的目录,而不是用户的数据!所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr底下,因此这个目录有点类似Windows系统的”C:\Windows\ + C:\Program files\”这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。

-:代表前一个工作目录。默认条件中,cp的源文件与目的文件的权限是不同的,目的文件的所有者通常会是命令操作者本身。若备份文件,可使用-a参数来完整复制文件的权限。(权限与命令间的关系!、scp命令)
linux中带.d的目录:.d是directory的缩写,表示这是一个目录(文件夹)。这个在配置文件中比较常见,一般如果有一系列格式相同的,目的一致的配置文件,就把它们放在一个以.d结尾的文件夹中。例如,init.d中存放的就是一系列系统服务的管理(启动与停止)脚本。

在Linux底下也有相当优异的搜寻命令!find不很常用的!因为速度慢之外,也很耗硬盘!通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻。
locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb);whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。

vi是“Visual”的不正规的缩写,来源于另外一个文本编辑器ex的命令visual。Vim(Vi IMproved)是一种升级版。小数点“.”为重复进行前一次动作,也是经常使用的按键功能!

Linux使用的是哪一个shell呢?什么!哪一个?难道说shell不就是”一个shell”吗?哈哈!那可不!由于早年的Unix年代,发展者众,所以由于shell依据发展者的不同就有许多的版本,例如常听到的Bourne SHell(sh)、在Sun里头预设的C SHell、商业上常用的K SHell、还有TCSH等等,每一种Shell都各有其特点。bash是Bourne Shell的增强版本,Linux默认就是使用bash。
bash的主要优点:1、命令记忆能力 2、命令与文件补全功能 3、命令别名(alias) 4、工作控制(jobs):可以让我们随时将工作丢到后台中执行!而不怕不小心使用了Ctrl+c来中断该进程!此外也可以在单一登入的环境中达到多任务的目的呢!
通过type这个命令我们可以知道每个命令是否为bash的内置命令。

shell的变量:1、显示时变量前必须加$或者${变量} 2、设置的时候等号前后不允许有空格 3、取消变量:unset 变量名称 4、若变量需要在其他子进程执行,则需要以export来使变量成为环境变量 5、双引号内的特殊字符保有原有特性、单引号内的特殊字符仅为一般字符(纯文本) 6、通过其他命令提供信息赋值可使用反单引号`命令`或$(命令)

什么是“子进程”呢?就是说在我目前这个shell的情况下,去打开另一个新的shell,新的那个shell就是子进程。在一般的情况下,父进程的自定义变量是无法在子进程内使用的。但是通过export将变量变成环境变量后,就能够在子进程下面应用了。(打开新shell使用命令bash、环境变量=全局变量、自定义变量=局部变量)

bash可不只有环境变量,还有一些与bash操作接口有关的变量(PPID父进程ID、$当前shell的PID、?上次命令的结果),以及用户自己定义的变量存在的。那么这些变量如何查看呢?这个时候就得要使用set这个命令了。
问号也是一个特殊的变量,在bash里面这个变量很重要。一般来说,如果成功的运行该命令,则会回传一个0值,如果运行过程发生错误,就会回传”错误代码”才对!
export:自定义变量转成环境变量,若环境变量转成自定义变量:declare +x 变量名
变量的键盘读取:read,变量的声明declare(数组、整型、环境变量…)。变量类型默认为字符串。

命令查找的顺序,可通过type -a查询得到。查找顺序为:1、以相对/绝对路径执行命令,例如”/bin/ls”或”./ls” 2、由alias找到该命令来执行 3、由bash内建的(builtin)命令来执行 4、通过$PATH这个变量的顺序找到的第一个命令来执行。

你是否会觉得奇怪,怎么我们什么动作都没有进行,但是一进入bash就取得一堆有用的变量了?这是因为系统有一些环境配置文件的存在,让bash在启动时直接读取这些配置文件,以规划好bash的操作环境!而这些配置文件又可以分为全体系统的配置文件以及用户个人偏好配置文件。
bash的配置文件主要分为login shell与non-login shell。login shell主要读取/etc/profile与~/.bash_profile,non-login shell则仅读取~/.bashrc。(由于/etc/profile和~/.bash_profile都是在取得login shell的时候才会读取的配置文件,所以如果你将自己的偏好设置写入上述文件后,通常都是得注销再登录后才能生效,若不想注销登录,则需要读入环境配置文件的命令source)

数据重定向:1、标准输入(stdin),代码为0,使用<或<< 2、标准输出(stdout),代码为1,使用>或>> 3、标准错误输出(stderr),代码为2,使用2>或2>> ( 默认为1、数字与符号之间无空格、覆盖是一个的,追加是两个的、/dev/null黑洞文件、stdout和stderr写入同一个文件语法&> )
将stdout和stderr分别存到不同的文件中去:find /home -name .bashrc > list_right 2> list_error。standard input:将原本需要由键盘输入的数据,改由文件内容来取代。<<这个连续两个小于的符号他代表的是‘结束的输入字符’的意思!而不需要按下[ctrl]+d离开。(利用cat命令来创建一个文件流程)
连续命令的执行可通过 ;、&&、||符号来处理。

我们Linux系统的服务(services)启动的接口,在/etc/init.d/这个目录下,目录下所有的文件都是shell script;另外包括开机(booting)过程也都是利用shell script来帮忙查找系统的相关设置数据,然后再代入各个服务的设置参数!
shell script如何运行?1、直接命令执行(shell.sh文件必须要具备可读与可执行(rx)的权限) 2、以bash进程来执行(通过“bash shell.sh”或“sh shell.sh”来运行,此时你的shell.sh只要有r的权限即可被执行) 3、source或小数点
上述执行方式的区别:1.利用直接执行的方式来执行script,使用这种执行方式时,其实script是在子进程的bash内执行的! 2、利用source来执行脚本:在父进程中执行。 这也是为啥你不注销系统而要让某些写入~/.bashrc的配置生效时,需要使用”source ~/.bashrc”而不能使用”bash ~/.bashrc”。
shell script利用exit n(n是数字)的功能,回传一个数值给系统,告知执行结果。
判断符号中括号[]的使用方法与test几乎一模一样。只是中括号比较常用在条件判断式if…then…fi的情况中就是了。使用中括号需要注意:1、在中括号[]内的每个组件都需要有空格键来分隔 2、在中括号内的变量,最好都以双引号括号起来 3、在中括号内的常数,最好都以单或双引号括号起来。
shell script的默认变量:$0, $1,$#..
shell script的追踪和调试可通过bash命令的参数:-n:不执行script,仅检查是否有语法问题 2、-x : 将使用到的script打印出来。

文件如何判别它的所有者与用户组呢?其实就是利用UID与GID。每一个文件都会有所谓的所有者ID与用户组ID,当我们有要显示文件属性的需求时,系统会根据/etc/passwd与/etc/group的内容,找到UID/GID对应的账号与组名再显示出来。(转译过程)
你输入账号密码后,系统帮你处理了什么呢?1、先找寻/etc/passwd里面是否有你输入的账号,如果没有则跳出,如果有的话则将该账号对应的UID与GID(在/etc/group中)读出来,另外,该账号的主文件夹与shell设置也一并读出。 2、再来则是核对密码表。Linux会进入/etc/shadow里面找出对应的账号与UID,然后核对一下你刚才输入的密码与里面的密码是否相符。 3、如果一切ok的话,就进入shell控管的阶段了。
当UID是0时,代表这个账号是系统管理员!所以当你要让其他的账号名称也具有root的权限时,将该账号的UID改为0即可。这也就是说,一部系统上面的系统管理员不见得只有root!不过,不建议有多个账号的UID是0。

刚刚我们讲到了,使用useradd建立了账号之后,在默认的情况下,该账号是暂时被封锁的,也就是说,该账号是无法登录的,你可以去瞧一瞧/etc/shadow内的第二个字段就知道了。那该如何是好?怕什么?直接给他设置新密码就好了!对吧~设置密码就使用passwd!(root可以帮忙设置各式各样的密码,系统几乎一定会接受!)

用户身份切换—如何让一般用户转变身份成为root呢?主要有两种方式:
1、以”su -“直接将身份变成root即可,但是这个命令却需要root的密码,也就是说,如果你要以su变成root的话,你的一般用户就必须要有root的密码才行;(-代表使用login-shell的变量文件读取方式来登陆系统、使用exit退出身份、使用root切换成为任何用户时,并不需要输入新用户的密码)
2、以”sudo 命令”执行root的命令串,由于sudo需要事先设置妥当,且sudo需要输入用户自己的密码,因此多人共管同一部主机时,sudo要比su来的好!至少root密码不会流出去!(并非所有人都能够运行sudo,而是仅有/etc/sudoers内的用户才能够执行sudo这个命令、除了root之外的其他账号,若想要使用sudo执行属于root的权限命令,则root需要先使用visudo去修改/etc/sudoers,让该账号能够使用全部或部分的root命令功能)
注:sudo搭配su的使用方式:只要输入”sudo su -“并且输入自己的密码后,立刻变成root的身份!不但root密码不会外泄,用户的管理也变的非常方便!

用户的特殊shell:/sbin/nologin是一个特殊的shell,如果一个账号的shell是/sbin/nologin,那么它是无法通过shell登录的,但是它可以使用系统的资源,这样就限制了这个账号使用shell的权利。因为有些账号是不需要使用shell的,分给它们会让系统陷入危险。

Linux工作调度的种类:at、cron。
at:是个可以处理仅执行一次就结束调度的命令,不过要执行at时,必须要有atd这个服务的支持才行。CentOS默认是启动的。(事实上,当我们使用at时(at now + 5 minutes)会进入一个at shell的环境来让用户执行任务命令,ctrl+D结束、at这个工作以文本文件的方式写入/var/spool/at/目录内,等待atd这个服务的取用与执行、我们可以利用/etc/at.allow与/etc/at.deny这两个文件来进行at的使用限制)
cron:这个这个命令所完成的工作将会循环一直进行下去!crontab除了可以使用命令执行外,亦可编辑/etc/crontab来支持。而让crontab可以生效的服务是crond这个服务!(与at类似的使用限制,/etc/cron.allow优先级比/etc/cron.deny要高、crontab -e是针对用户的cron来设计的(此时会进入vi的编辑界面让您编辑工作,编辑完后输入:wq离开vi、会被记录到/var/spool/cron/),如果是系统的例行性任务时,只需要编辑/etc/crontab这个文件就可以、/n(斜线)即是“每隔n单位间隔”的意思、cron执行的每一项工作都会被记录到/var/log/cron这个日志文件中)
基本上,cron这个服务的最低检测限制是”分钟”,所以cron会每分钟去读取一次/etc/crontab与/var/spool/cron里面的数据内容,因此,只要你编辑完/etc/crontab这个文件,并且将它保存之后,那么cron的设定就自动会来执行了!
anacron(可唤醒停机期间的工作任务)并不是用来取代crontab的,anacron存在的目的就在于我们上头提到的,处理非24小时一直启动的Linux系统的crontab的执行!anacron其实是一个程序并非一个服务!

现在你知道系统是如何进行它默认的一堆例行性工作调度了吗?如果你执行”ll /etc/cron.daily”就可以看到一堆文件,那些文件就是系统提供的script,而这堆scripts将会在每天的凌晨4:02开始运行!这也是为啥如果你是夜猫族,就会发现奇怪的是,Linux系统为何早上4:02开始会很忙碌的发出一些硬盘跑动的声音!因为它必须要进行makewhatis、updatedb、rpm rebuild等等的任务!

在Linux系统当中:触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。从此以后,这个PID能够在系统上面进行的操作,就与这个PID的权限有关了!
每个进程都有一个PID,那某个进程的父进程该如何判断?就通过Parent PID(PPID)来判断即可。
常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻进程就会被我们称为服务(daemon)。

工作管理(job control):这个工作管理(job control)是用在bash环境下的。在进行工作管理的行为中,其实每个工作都是目前bash的子进程。放入后台的工作是不可以使用ctrl+c来终止的,可使用bg/fg调用该工作。
在后台里面的工作状态又可分为暂停(stop)与运行中(running)。实际进行job控制的命令有哪些?1、直接将命令丢到后台中执行的& 2、将目前的工作丢到后台中暂停ctrl+z,查看目前的后台工作状态:jobs 3、将后台的工作拿到前台来处理:fg %jobnumber 4、让工作在后台下的状态变成运行中:bg %jobnumber 5、管理后台当中的工作:kill -single %jobnumber(kill后面接的数字默认会是PID,若想管理bash下的工作,就得要加上%数字)
特别留意一下,-9这个signal通常是用在强制删除一个不正常的工作时所使用的,-15则是以正常步骤结束一项工作(15也是默认值),两者之间并不相同!举例来说,我用vi的时候,不是会产生一个.filename.swp的文件吗?那么,当使用-15这个signal时,vi会尝试以正常的步骤来结束掉该vi的工作,所以.filename.swp会主动的被移除,但若是使用-9这个signal时,由于该vi工作会被强制移除掉,因此.filename.swp就会继续存在文件系统当中。

如果你是以远程连线方式连接到你的Linux主机,并且将工作以&的方式放到后台去,请问,在工作尚未结束的情况下你脱机了,该工作还会继续进行吗?答案是“否”!不会继续进行,而是会被中断掉!那怎么办?
nohup可以让你在脱机或注销系统后,还能够让工作继续进行。nohup并不支持bash内置的命令,因此你的命令必须要是外部命令才行。nohup与终端机其实无关了,故信息的输出就会被定向到nohup.out。(nohup [命令与参数] <==在终端机前台中工作、nohup [命令与参数] & <==在终端机后台中工作)

进程的查看:1、ps:将某个时间点的进程运行情况选取下来(进程树) 2、top:动态查看进程的变化(排序、k给某个PID一个信号、r给某个PID一个nice值)

我们知道CPU一秒钟可以运作多达数G的微命令次数,通过内核的CPU调度可以让各进程被CPU所切换运行,因此每个进程在一秒钟内或多或少都会被CPU执行部分的脚本。(如果优先级较高则运行次数可以较多次)

系统为了某些功能必须要提供一些服务(不论是系统本身还是网络方面),这个服务就称为service。但是service的提供总是需要进程的运行!否则如何执行呢?所以实现这个service的进程我们就称它为daemon!

服务(daemon)主要可以分为stand alone(服务可单独启动)及super daemon(通过xinetd统一管理的服务,其常驻内存)两种。
stand alone的daemon响应速度较快。常见的stand alone daemon有www的daemon(httpd)、FTP的daemon(vsftpd)等。
super daemon当没有客户端的要求时,各项服务都是未启动的情况,等到有来自客户端的要求时,super daemon才唤醒相对应的服务。当客户端的要求结束后,被唤醒的这个服务也会关闭并释放系统资源。常见的super daemon所管理的服务例如telnet这个就是。

几乎系统上面所有服务的启动脚本都在/etc/init.d/下面,这里面的脚本会去检测环境、查找配置文件、加载distribution提供的函数功能、判断环境是否可以运行此daemon等等,等到一切都检测完毕且确定可以运行后,再以shell script的case….esac语法来启动、关闭、查看此daemon。

stand alone daemon的启动方法也可以使用service这个命令,service仅是一个script,它可以分析你执行的service后面的参数,然后根据你的参数再到/etc/init.d/去取得正确的服务来start或stop!

super daemon的主要配置文件(其实是默认值)为/etc/xinetd.conf,不过我们上面就谈到了,super daemon只是一个统一管理的机制,他所管理的其他daemon的配置则写在/etc/xinetd.d/*里面!
super daemon本身也是一个stand alone的服务,所以Super daemon自己启动的方式与stand alone是相同的!但是他所管理的其他daemon就不是这样做了!必须要在配置文件中配置为启动该daemon才行。配置文件就是/etc/xinetd.d/*的所有文件。默认所有的super daemon管理的服务都不启动的。

Linux主机是怎么启动的呢?1、打开计算机电源,开始读取BIOS并进行主机的自我测试;2、通过BIOS取得第一个可开机设备,读取主要启动区(MBR)取得启动装载程序;3、通过启动装载程序的配置,取得kernel并加载内存且检测系统硬件;4、内核主动调用init进程;5、init进程开始执行系统初始化(/etc/rc.d/rc.sysinit);6、依据init的设置进行daemon start(/etc/rc.d/rc[0-6].d/*);7、加载本机配置(/etc/rc.d/rc.local);事实上第六个步骤就是以不同的执行等级调用不同的服务!(不同的执行等级有不同的功能与服务)

管理系统服务默认开机启动与否:chkconfig。chkconfig仅是设置开机时默认会启动的服务而已,所以该服务目前的状态如何是不知道的。同类的图形界面:ntsysv

chkconfig –list [服务名称]、chkconfig [–level [0123456]] [服务名称] [on|off]。chkconfig [–add|–del] [服务名称] 选项与参数:–add:添加一个服务名称给chkconfig来管理,该服务名称必须在/etc/init.d/内;–del:删除一个给chkconfig管理的服务。

如果我自己写了一个程序并且想要让该程序成为系统服务好让chkconfig来管理时,可以怎么进行呢?只要将该服务加入init可以管理的script当中,亦即是/etc/init.d/当中即可。编写脚本的第二行比较重要,语法:chkconfig: [runlevels] [启动顺位] [停止顺位] 其中,runlevels为不同的run level状态,启动顺位(start number)与结束顺位(stop number)则是在/etc/rc.d/rc[35].d内创建以S80myvbird及K70myvbird为文件名的设置方式!
格式:#!/bin/sh #chkconfig: 2345 80 90 #description:auto_run 前两行必不可少哦!

Linux常见的日志文件名(日志文件的权限通常是设置为仅有root能够读取而已):
1、/var/log/cron—用来记录crontab这个服务的内容
2、/var/log/dmesg—记录系统在开机的时候内核检测过程所产生的各项信息
3、/var/log/lastlog—记录系统上面的所有账号最近一次登录系统时的相关信息
4、/var/log/messages—记录几乎所有系统错误或者重要的信息
5、/var/log/secure—基本上,只要牵涉到需要输入账号密码的软件,那么当登录时(不管登录正确或错误)都会被记录在此文件中
6、/var/log/httpd/*—不同的网络服务会使用它们自己的日志文件来记载它们自己产生的各项信息

那么这些日志文件是怎么产生的呢?基本上有两种方式:一种是由软件开发商自行定义写入的日志文件与相关格式,例如WWW软件apache就是这样处理的。另一种则是由Linux distribution提供的日志文件管理服务来统一管理。你只要将信息丢给这个服务后,他就会自己分门别类的将各种信息放置到相关的日志文件去!CentOS提供syslogd这个服务来统一管理日志文件!
如果你任凭日志文件持续记录的话,由于系统产生的信息天天都有,那么你的日志文件的容量将会无限增大,我们可以通过logrotate(日志轮替)命令来自动化处理日志文件容量与更新。

logrotate程序利用crontab来进行日志文件的轮替功能;logrotate的配置文件为/etc/logrotate.conf,而额外的设置则可写入/etc/logrotate.d/*内。

在Linux系统上面,一个文件能不能被执行看的是有没有可执行的那个权限(具有x),不过Linux系统上真正认识的可执行文件其实是二进制文件。例如:/usr/bin/passwd、/bin/touch。(可以通过file filename命令来查看某一个文件是否是可执行文件、函式库:就类似子程序的角色,可以被调用来执行的一段功能函数)
所谓的Tarball文件,其实就是将软件的所有原始码文件先以tar打包,然后再以压缩技术来压缩,tarball文件一般的扩展名就会写成.tar.gz或者是简写为.tgz。Tarball是一个软件包,你将他解压缩之后,里面的文件通常就会有:1、源代码文件 2、检测程序文件(configure或config) 3、本软件的简易说明与安装说明(README/INSTALL)

直接源码的方式虽然具有很高的弹性,但毕竟麻烦一点。如果Linux distribution厂商能够针对自己的系统平台进行编译等过程,再将编译好的二进制程序放出的话,由于环境是相同的,那就可以直接在我的电脑上面安装,省去复杂编译的过程。预先编译好的程序的机制存在于很多distribution,包括Red Hat系统发展的RPM软件管理机制与yum在线更新模式。Debian使用的dpkg软件管理机制与apt在线更新模式。

make是一个程序,make的功能是可以简化编译过程里面所执行的命令。检测程序configure/config检查完毕后就会主动新建makefile的规则文件,当makefile在创建出来之后,里面会有相当多的目标(target),最常见的就是install与clean。通常“make clean”表示将目标文件清除掉,“make”是将源码进行编译。特别注意,编译完成的可执行文件与相关的配置文件还在源码所在的目录当中,因些,最后要进行“make install”将编译完成的所有内容都安装到正确的路径中,这样就可以使用该软件了!(安装软件涉及的目录大致有:可执行目录bin、用到的函数库目录lib、配置文件目录etc、帮助文档目录man)
一般来说configure设置参数较重要的就是那个–prefix=/path了,–prefix后面接的路径就是“这个软件未来要安装到那个目录去”。如果你没有指定–prefix=/path这个参数,通常默认参数就是/usr/local。(安装到/usr/local/ntp这个目录:./configure –prefix=/usr/local/ntp)

为什么Tarball要在/usr/local/src里面解压缩呢?基本上,在默认的情况下,原本的Linux distribution发布安装的软件大多是在/usr里面的,而用户自行安装的软件则建议放置在/usr/local里面。这是考虑到管理用户所安装软件的便利性。
tarball这种方式的软件升级或更新,利用patch,patch的主要功能是更新源码,所以更新源码之后,还需要进行重新编译的操作才行。

为了避免用户自行编译的困扰,开发商自行在特定的硬件与操作系统平台上编译好软件,并将软件以特殊格式打包成文件,提供给终端用户直接安装到固定的操作系统上,并提供简单的查询、安装、删除等流程。此为软件管理器。
RPM的全名是Red Hat Package Manager,RPM除了将软件安装至用户的系统上之外,还会将该软件的版本、名称、文件与目录配置、系统需求等均记录于数据库(/var/lib/rpm)当中,方便未来的查询与升级、删除。
相同distribution的不同版本之间也无法互通,例如CentOS 4.x的RPM文件就无法直接套用在CentOS 5.x!(SRPM为Source RPM,内含的文件为源代码而非二进制文件,所以安装SRPM时还需经过编译,不过SRPM最大的优点就是可以让用户自行修改设置参数,以符合用户自己的Linux环境)
RPM软件管理程序:RPM默认安装的路径、RPM安装(-ivh详细安装过程、一次安装多个软件、以网址来安装、–prefix 路径)、RPM升级与更新(upgrade/freshen)、RPM查询(query)、RPM验证与数码证书(Verify/signature)、RPM反安装与重建数据库(erase/rebuilddb)。

RPM安装原理图:

RPM在查询的时候,其实查询的地方是/var/lib/rpm这个目录下的数据库文件。另外也可以查询未安装的RPM文件内的信息。(要特别说明的是,在查询本机上面的RPM软件相关信息时,不需要加上版本的名称,只要加上软件名称即可!)
rpm -q 仅查询,后面接的软件名称是否有安装
rpm -qa 列出所有的已经安装在本机linux系统上面的所有软件名称
rpm -ql 列出该软件所有的文件与目录所在完整文件名
rpm -qc 列出该软件的所有配置文件
rpm -qf 由后面接的文件名称找出该文件属于哪一个已安装的软件
rpm -qR 列出安装此软件需要哪些软件帮忙(依赖软件)
rpm -qi 列出该软件的详细信息,包括开发商、版本与说明等

YUM使用的流程:CentOS先将释出的软件放置到YUM服务器内,然后分析这些软件的依赖属性问题,将软件内的记录信息写下来(header)。然后再将这些信息分析后记录成软件相关性的清单列表。这些列表数据与软件所在的位置可以称为容器(repository)。当用户端有软件安装的需求时,用户端主机会主动的向网络上面的yum服务器的容器网址下载清单列表,然后通过清单列表的数据(/var/cache/yum)与本机RPM数据库已存在的软件数据(/var/lib/rpm)相比较,就能够一口气安装所有需要的具有依赖属性的软件了。
当用户端有升级、安装的需求时,yum会向容器要求清单的更新,等到清单更新到本机的/var/cache/yum里面后,等一下更新时就会用这个本机清单与本机的RPM数据库进行比较,这样就知道该下载什么软件。接下来yum会跑到容器服务器(yum server)下载所需要的软件,然后再通过RPM的机制开始安装软件!这就是整个流程!谈到最后,还是需要用到RPM的!不同的容器网址可以放置不同的软件功能!
当你要找容器所在网址时,最重要的就是该网址底下一定要有个名为repodata的目录存在(该目录就是分析RPM软件后所产生的软件属性依赖数据放置处)!那就是容器的网址了!
YUM可以看作是CS架构的软件,YUM的存在很好的解决了RPM的属性依赖问题。YUM是一个在线软件管理工具,所以使用YUM进行的操作大都是需要在联网的条件下才能正常使用。

YUM原理说明:
Server端:所有要发行的rpm包都放在yum服务器上以提供别人来下载,rpm包根据kernel的版本号,cpu的版本号分别编译发布。yum服务器只要提供简单的下载就可以了,ftp或者httpd的形式都可以。yum服务器有一个最重要的环节就是整理出每个rpm包的基本信息,包括rpm包对应的版本号,conf文件,binary信息,以及很关键的依赖信息。在yum服务器上提供了createrepo工具,用于把rpm包的基本概要信息做成一张”清单”,这张”清单”就是描述每个rpm包的spec文件中信息。
Cilent端:client每次调用yum install或者search的时候,都会去解析/etc/yum.repos.d下面所有以.repo结尾的配置文件,这些配置文件指定了yum服务器的地址。yum会定期去”更新”yum服务器上的rpm包”清单”,然后把”清单”下载保存到yum自己的cache里面,根据/etc/yum.conf里配置(默认是在/var/cache/yum下面),每次调用yum装包的时候都会去这个cache目录下去找”清单”,根据”清单”里的rpm包描述从而来确定安装包的名字,版本号,所需要的依赖包等,然后再去yum服务器下载rpm包安装。(前提是不存在rpm包的cache)
timedhosts.txt这个文件记录着所有源地址访问所需要的时间,可以查到哪些源的地址比较慢;如果/etc/yum.conf中keep cache选项是1,那么下载的rpm包都会保存到/var/cache/yum/xxx/package下;yum clean会把这份”清单”全都清除,下次调用yum install等操作又会重新生成;CentOS-Media.repo是yum本地源(光盘)的配置文件。

利用yum进行查询、安装、升级与删除功能:
1、列出目前服务器上可供本机进行升级的软件有哪些? yum list updates
2、yum info里Repo字段(installed)表示是否已安装
3、–installroot=/some/path:将该软件安装在/some/path而不使用默认路径
4、update:后面接要升级的软件。若要整个系统都升级,就直接update即可
5、yum clean all:删除已下载过的所有容器相关数据(含软件本身与列表)
利用yum进行软件组管理:1、grouplist 2、groupinfo 3、groupinstall 4、groupremove

企业版Linux附加软件包(以下简称EPEL:Extra Packages for Enterprise Linux)是一个Fedora特别兴趣小组,用以创建、维护以及管理针对企业版Linux的一个高质量附加软件包集,面向的对象包括但不限于红帽企业版Linux(RHEL)、CentOS、Scientific Linux(SL)、Oracle Linux(OL)。
apt:Advanced Package Tool、Red Hat Enterprise Linux (RHEL)、linux版本号中EL代表enterprise linux、yum是Yellow dog Updater, Modified的简称,是杜克大学为了提高RPM软件包安装性而开发的一种软件包管理器、ELF:Executable and Linkable Format(可执行和可链接格式)

软件管理的选择:RPM还是Tarball:
1、优先选择原厂的RPM功能
2、选择软件官方网站发布的RPM或者是提供的容器网址
3、利用Tarball安装特殊软件
4、用Tarball测试新版软件

Linux中的update和upgrade分别是更新什么呀?
UPDATE: update is used to download package information from all configured sources. –update是下载源里面的metadata的。包括这个源有什么包,每个包什么版本之类的。
UPGRADE: upgrade is used to install available upgrades of all packages currently installed on the system from the sources configured via sources.list. –upgrade是根据update命令下载的metadata决定要更新什么包(同时获取每个包的位置)。
安装软件之前,可以不upgrade,但是要update。因为旧的信息指向了旧版本的包,但是源的服务器更新了之后旧的包可能被新的替代了,于是你会遇到404…

补充:
Systemd并不是一个命令,而是一组命令,涉及到系统管理的方方面面。systemctl是Systemd的主命令,用于管理系统。hostnamectl命令用于查看当前主机的信息。Systemd可以管理所有系统资源。不同的资源统称为Unit(单位)。Unit一共分成12种。(Service unit:系统服务、Target unit:多个Unit构成的一个组……)
使用了Systemd,就不需要再用init了。Systemd取代了initd,成为系统的第一个进程(PID等于1),其他进程都是它的子进程。

命令举例:
列出所有正在运行的、类型为service的Unit:systemctl list-units –type=service
显示系统状态(单个unit):systemctl status / sysystemctl status bluetooth.service
对于用户来说,最常用的是下面这些命令,用于启动和停止Unit(主要是service):
立即启动一个服务:systemctl start apache.service、立即停止一个服务:systemctl stop apache.service、重启一个服务:systemctl restart apache.service
Unit的配置文件:
每一个Unit都有一个配置文件,告诉Systemd怎么启动这个Unit。Systemd默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。systemctl enable命令用于在上面两个目录之间,建立符号链接关系。如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。配置文件的后缀名,就是该Unit的种类。如果省略,Systemd默认后缀名为.service,所以sshd会被理解成sshd.service。
配置文件的格式:配置文件就是普通的文本文件,可以用文本编辑器打开。Target就是一个Unit组,包含许多相关的Unit。
Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。

对于那些支持Systemd的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。

Comments

去留言
2018-03-06

⬆︎TOP