小言_互联网的博客

鸟哥的Linux私房菜基础学习篇(第四版)

393人阅读  评论(0)

前言:我只总结了我不太清晰的点,需要完整观看书籍的可以下载:https://u15372029.pipipan.com/fs/15372029-393101184

第一部分 Linux的规则与安装

第5章 Linux的文件与目录

权限结构分析:文件类型,所有者,所属组,其他人

文件类型分为:
-	普通文件
d	目录文件
l	符号链接文件
b	块设备文件
c	字符设备文件
p	管道文件
s	套接字权限

文件/目录的权限含义:

r:4	w:2	x:1
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others = --- = 0+0+0 = 0

当用户user1,对/testdir 目录有写和执行权限时,该目录下的只读文件file1是否可修改和删除?
答:不可修改,可删除

默认权限:

  • 修改方法:
    临时修改:umask 0022
    永久修改:配置文件:/etc/profile
    权限掩码的目的是为了保证新建文件拥有默认权限,一般不需要手工设置

特殊权限:

  • 权限类型:Set UID、Set GID、Sticky Bit
    Set UID:
    当文件设置了setuid位后,任何能够执行此文档的用户都有与文件属主相同的权限,即使得任意使用者在执行该文件时,都绑定了文件属主的权限。例如,某个程序为root拥有,又设置了setuid位,那即使是一个普通用户运行该程序,该程序的身份一样是root的身份,可以访问所有只有root可以访问的资源

sudo权限

  • 给普通用户提权

文件系统属性权限

  • 系统文件锁

chgrp:修改文件所属用户组
chown:修改文件拥有者

chown [-R] 账户名称 文件或目录
chown [-R] 账户名称:用户组名称 文件或目录

chmod:修改文件的权限,SUID、SGID、SBIT等的特性。

数字类型修改文件权限
chmod [-R] xyz 文件或目录
chmod 777 文件或目录

符号类型修改文件权限
u	g	o	a
+(加入)	-(移除)	=(设置)

示例:
chmod u=rwx,go=rx .bashrc

目录的相关操作

. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表目前使用者身份所在的家目录
~account 代表account这个使用者的家目录(account是个账户名称)

第二部分 Linux文件、目录与磁盘格式(详细看书)

第三部分 学习Shell

第9章 Vim程序编辑器

Vim:https://blog.csdn.net/qq_39578545/article/details/104848900

(1)Vim基本操作

vim三种模式:

  • 指令模式:vi打开一个文件就直接进入到指令模式
  • 编辑模式:输入【i,I,A,R】
  • 命令模式:输入【: / ?】

快捷键

nG	n为数字,移动到这个文件的第n行。例如20G则会移动到这个文件的第20行(可配合:set nu)
gg	移动到这个文件的第一行,相当于1G(常用)
G	按G到最后一行

/word	向光标之下寻找一个名称为word的字符串。例如要在文件内搜寻vbird这个字符串,就输入 /vbird即可
?word	向光标之上寻找一个字符串名称为word的字符串
n	向下搜索
N	向上搜索

dd	删除行
ndd	删除指定行
d1G 删除光标到第一行的所有数据
dG	删除光标到最后一行的所有数据
yy	复制游标所在的那一行
nyy n为数字。复制光标所在向下20行,例如20yy则是复制20行(常用)
yG	复制光标所在列到第一列的所有数据
p	粘贴,光标在20行,则在21行开始贴
P	粘贴,光标在20行,那么原本的第20行会被推到变成30行
u	撤销
ctrl + r 重做上一个动作


vim的暂存档、救援回复与开启时的警告讯息

(2)区块选择

区块选择(Visual Block),当我们按下 v 或者 V 或者 【ctrl + v】

(3)多文件编辑

:r filename 来读入某个文件的内容
:n	编辑下一个文件
:N	编辑上一个文件
:files	列出目前这个vim的开启的所有文件

示例:将hosts内的前四列IP资料复制到/etc/hosts文件内

  1. 透过【vim hosts /etc/hosts 】指令来使用一个vim开启两个文件:
  2. 在vim中先使用 【:files】来列出编辑的文件,然后按下【任意键】就会回到vim的一般指令模式中!
  3. 在第一行输入 【4yy】复制4行
  4. 在vim的环境下输入 【:n】会来到第二个编辑的文件,亦即 /etc/hosts 内;
  5. 在/etc/hosts下按【G】到最后一行,再输入【p】贴上;

(4)多窗口功能

在指令列模式输入【:sp {filename}】,如果想要在新窗口启动另一个文件,就加入档名,否则仅输入【:sp】时,出现的则是同一个文件在两个窗口间。

可以利用【ctrl+w+↑】及【ctrl+w+↓】,在两个窗口之间移动。

(5)vim环境设定与记录:~/.vimrc,~/.viminfo

可以通过一般指令模式时输入【:set all】来查阅所有设置参数。

整体vim的设定值一般是放置在 /etc/vimrc 这个文件,不过,不建议修改。可以修改~/.vimrc这个文件。

第四部分 Linux使用者管理(详细看书)

第五部分 Linux系统管理员

第17章 认识系统服务(daemon)

systemd是一个启动服务机制,早期是通过init进行管理。现在是systemd占主流,init占一小部分。

systemd的好处:

  • 平行处理所有服务,加速开机流程:
    旧的init启动脚本是【一项一项任务依序启动】的模式,因此不相依的服务也是得要一个一个的等待。但目前我们的硬件主机系统与操作系统几乎都支持多核心架构了,没道理未相依的服务不能同时启动啊!
    systemd就是可以让所有的服务同时启动,因此你会发现到,系统启动的速度变快了!
  • 一经要求就响应的on-demand启动方式:
    systemd全部就是仅有一只systemd 服务搭配systemctl指令来处理,无须其他额外的指令来支持。不像systemV还要init,chkconfig,service…等等指令。此外,systemd由于常驻内存,因此任何要求(on-demand)都可以立即处理后续的daemon启动的任务。
  • 服务相依性的自我检查:
    由于systemd可以自定义服务相依性的检查,因此如果B服务是架构在A服务上面启动的,那当你在没有启动A服务的情况下仅手动启动B服务时,systemd会自动帮你启动A服务喔!这样就可以免去管理员得要一项一项服务去分析的麻烦~(如果读者不是新手,应该会有印象,当你没有启动网络,但却启动NIS/NFS时,那个开机时的timeout 甚至可达到10~30分钟…)依daemon功能分类:
    systemd旗下管理的服务非常多,包山包海啦~为了厘清所有服务的功能,因此,首先systemd先定义所有的服务为一个服务单位(unit),并将该unit 归类到不同的服务类型(type)去。旧的init仅分为stand alone与super daemon 实在不够看,systemd将服务单位(unit)区分为service,socket,target,path,snapshot,timer等多种不同的类型(type),方便管理员的分类与记忆。
  • 将多个daemons集合成为一个群组:
    如同systemV的init 里头有个runlevel的特色,systemd亦将许多的功能集合成为一个所谓的target项目,这个项目主要在设计操作环境的建置,所以是集合了许多的daemons,亦即是执行某个target就是执行好多个daemon的意思!
  • 向下兼容旧有的init 服务脚本:
    基本上,systemd是可以兼容于init的启动脚本的,因此,旧的init启动脚本也能够透过systemd来管理,只是更进阶的systemd功能就没有办法支持就是了。

虽然如此,不过systemd也是有些地方无法完全取代init的!包括:

  • 在runlevel的对应上,大概仅有runlevel1,3,5有对应到systemd的某些target类型而已,没有全部对应;
  • 全部的systemd都用systemctl这个管理程序管理,而systemctl支持的语法有限制,不像/etc/init.d/daemon 就是纯脚本可以自定义参数,systemctl不可自定义参数;
  • 如果某个服务启动是管理员自己手动执行启动,而不是使用systemcl去启动的(例如你自己手动输入crond 以启动crond服务),那么systemd将无法侦测到该服务,而无法进一步管理。
    systemd启动过程中,无法与管理员透过standard input传入讯息!因此,自行撰写systemd的启动设定时,务必要取消互动机制~(连透过启动时传进的标准输入讯息也要避免!)

systemd的配置文件放置目录:
基本上,systemd将过去所谓的daemon执行脚本通通称为一个服务单位(unit),而每种服务单位依据功能来区分时,就分类为不同的类型(type)。基本的类型有包括系统服务、数据监听与交换的插槽档服务(socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境(target)等。

  • /usr/lib/systemd/system/:每个服务最主要的启动脚本设定,有点类似以前的/etc/init.d底下的文件;
  • /run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usr/lib/systemd/system/高!
  • /etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx 之类的功能!执行优先序又比/run/systemd/system/高

也就是说,到底系统开机会不会执行某些服务其实是看/etc/systemd/system/底下的设定,所以该目录底下就是一大堆连结档(如target)。而实际执行的systemd启动脚本配置文件,其实都是放置在/usr/lib/systemd/system/底下的喔!因此如果你想要修改某个服务启动的设定,应该要去/usr/lib/systemd/system/底下修改才对!/etc/systemd/system/仅是连结到正确的执行脚本配置文件而已。所以想要看执行脚本设定,应该就得要到/usr/lib/systemd/system/底下去查阅才对!


systemd的unit类型分类说明

vsftpd 与crond 其实算是系统服务(service),而multi-user要算是执行环境相关的类型(target type)。根据这些扩展名的类型,我们大概可以找到几种比较常见的systemd的服务类型如下:


systemd管理服务
系统上面有多少的服务存在?这个时候就得透过list-units(默认)list-unit-files来观察了。


具体systemctl请看PDF。


第18章 日志文件

ryslog日志管理https://blog.csdn.net/qq_39578545/article/details/105030690

1、登录档日志文件

  • /var/log/boot.log:开机的时候系统核心会去侦测与启动硬件,接下来开始各种核心支持的功能启动等。这些流程都会记录在/var/log/boot.log里面!不过这个文件只会存在这次开机启动的信息,前次开机的信息并不会被保留下来!
  • /var/log/cron:你的crontab有没有实际被进行?进行过程有没有发生错误?你的/etc/crontab是否撰写正确?在这个登录档内查询看看。
  • /var/log/dmesg:记录系统在开机的时候核心侦测过程所产生的各项信息。由于CentOS默认将开机时核心的硬件侦测过程取消显示,因此额外将数据记录一份在这个文件中;
  • /var/log/lastlog:可以记录系统上面所有的账号最近一次登入系统时的相关信息
  • /var/log/maillog 或/var/log/mail/*:记录邮件的往来信息,其实主要是记录postfix(SMTP协议提供者)与dovecot(POP3协议提供者)所产生的讯息啦。SMTP是发信所使用的通讯协议,POP3则是收信使用的通讯协议。postfix与dovecot 则分别是两套达成通讯协议的软件。
  • /var/log/messages:这个文件相当的重要,几乎系统发生的错误讯息(或者是重要的信息)都会记录在这个文件中;如果系统发生莫名的错误时,这个文件是一定要查阅的登录档之一。
  • /var/log/secure:基本上,只要牵涉到了需要输入账号密码]的软件,那么当登入时(不管登入正确或错误)都会被记录在此文件中。包括系统的login程序、图形接口登入所使用的gdm程序、su,sudo等程序、还有网络联机的ssh,telnet等程序,登入信息都会被记载在这里;
  • /var/log/wtmp,/var/log/faillog:这两个文件可以记录正确登入系统者的帐户信息(wtmp)与错误登入时所使用的帐户信息(faillog)!我们在第十章谈到的last就是读取wtmp来显示的,这对于追踪一般账号者的使用行为很有帮助!
  • /var/log/httpd/*,/var/log/samba/:
    不同的网络服务会使用它们自己的登录文件来记载它们自己产生的各项讯息!上述的目录内则是个别服务所制订的登录档。

2、logrotate日志轮转

所谓的logrotate基本上,就是将旧的登录档更改名称,然后建立一个空的登录档,如此一来,新的登录文件将重新开始记录,然后只要将旧的登录档留下一阵子,嗯!那就可以达到将登录档【轮转】

  • systemd-journald.service:最主要的讯息收受者,由systemd提供的;
  • rsyslog.service:主要登录系统与网络等服务的讯息;
  • logrotate:主要在进行登录文件的轮替功能。

使用systemd提供的journalctl日志管理
系统上所有经由systemd启动的服务,如果再启动或结束的过程中发生一些问题或者是正常的讯息,就会将该讯息由systemd-journald.service以二进制的方式记录下来(它的记录主要都放置于内存中),之后再将这个讯息发送给rsyslog.service做进一步的记载。

rsyslog.service的配置文件/etc/rsyslog.conf,这个文件规定了【(1)什么服务、(2)什么等级讯息、(3)需要记录在哪里】。

讯息等级

在0(emerg)到6(info)的等级之间,等级数值越高代表越没事。

rsyslog.conf语法练习

(1)登录档的安全性设置

chattr +a,加入了这个属性之后,你的/var/log/admin.log登录档从此就仅能被增加,而不能被删除,直到root以【chattr-a /var/log/admin.log】取消这个a的参数之后,才能被删除或移动喔!

这个旗标最大的用处除了在保护你登录文件的数据外,他还可以帮助你避免掉不小心写入登录档的状况喔。要注意的是,当[你不小心“手动“更动过登录档后,例如那个
/var/log/messages,你不小心用vi开启他,离开却下达:wq的参数!【】么该文件未来将不会再继续进行登录动作!】这个问题真的很常发生!由于你以vi储存了登录档,则rsyslogd 会误判为该文件已被更动过,将导致rsyslogd不再写入该文件新的内容。

要让该登录档可以继续写入,你只要重新启动rsyslogd.service即可。

不过,也因为这个+a的属性让该文件无法被删除与修改,所以当我们进行登录文件轮替时
(logrotate),将会无法移动该登录档的档名。这个困扰虽然可以使用logrotate的配置文件来解决,但是,还是先将登录档的+a旗标拿掉吧!

下面的chattr的解决方案有解决方案。


(2)登录档服务器的设定

让某一部主机当成【登录文件服务器】,用他来记录所有的十部Linux主机的信息。

CentOS 7.x预设的rsyslogd本身就已经具有这个登录文件服务器的功能了,只是默认并没有启动该功能而已。

服务端配置:

客户端配置:

再重新启动rsyslog.service后,在主机上面的登录文件/var/log/admin.log当中,每一行的【主机名】就会显示来自不同主机的信息。


(3)登录档的轮替(logrotate)

特别留意:rsyslogd利用的是daemon的方式来启动的,当有需求的时候立刻就会被执行的,但是logrotate却是在规定的时间到了之后才来进行登录档的轮替,所以这个logrotate程序是挂载cron底下进行,可以通过/etc/cron.daily/logrotate记录了每天要进行的登录档轮替的行为,工作原理如下:

查看一下/etc/logrotate.conf文件

以/etc/logrotate.d/syslog这个轮替rsyslog.service服务的文件。

(4)chattr的解决方案

假设我们有针对/var/log/messages 这个文件增加chattr+a的属性时,依据 logrotate的工作原理,我们知道,这个/var/log/messages将会被更名成为/var/log/messages.1才是。但是由于加上这个+a的参数啊,所以更名是不可能成功的!那怎么办呢?呵呵!就利用prerotate与postrotate来进行登录档轮替前、后所需要作的动作啊!!!


先给他去掉a这个属性,让登录文件/var/log/mesages可以进行轮替的动作,然后执行了轮替之后,再给他加入这个属性!请特别留意的是,那个/bin/kill -HUP…的意义,这一行的目的在于将系统的rsyslogd重新以其参数档(rsyslog.conf)的资料读入一次!也可以想成是reload的意思啦!由于我们建立了一个新的空的记录文件,如果不执行此一行来重新启动服务的话,那么记录的时候将会发生错误!!!


(5)测试logrotate



上面那个-f具有【强制执行】的意思,如果一切的设定都没有问题的话,那么理论上,你的/var/log这个目录就会起变化啰!而且应该不会出现错误讯息才对!

由于logrotate的工作已经加入crontab里头了!所以现在每天系统都会自动的给他查看logrotate。只是要注意一下那个/var/log/messages里头是否常常有类似底下的字眼:
Aug 2001:45:34 study rsyslogd:[origin software="rsyslogd"swVersion="7.4.7"x-pid=“2145”
x-info=“http://ww.rsyslog.com”]rsyslogd was HUPed这说明的是rsyslogd重新启动的时间啦(就是因为/etc/logrotate.d/syslog的设定之缘故!)

(5)自定义登录文件的轮替功能

假设前提是这样的,前一小节当中,假设你已经建立了/var/log/admin.log这个文件,现在,你想要将该文件加上+a这个隐藏标签,而且设定底下的相关信息:

  • 登录档轮替一个月进行一次;
  • 该登录档若大于10MB时,则主动进行轮替,不需要考虑一个月的期限;
  • 保存五个备份文件;
  • 备份文件需要压缩


(5)使用journalctl观察登录信息


(6)保存journal的方式

再强调一次,这个systemd-journald.servicd的讯息是不会放到下一次开机后的,所以,重新启动后,那之前的记录通通会遗失。虽然我们大概都有启动rsyslogd这个服务来进行后续的登录档放置,不过如果你比较喜欢journalctl的存取方式,那么可以将这些数据储存下来喔!

基本上,systemd-journald.service的配置文件主要参考/etc/systemd/journald.conf的内容,详细的参数你可以参考man 5 journald.conf的资料。
只是如果想要保存你的journalctl所读取的登录档,那么就得要建立一个/var/log/journal的目录,并且处理一下该目录的权限,那么未来重新启动systemd-journald.service之后,日志登录文件就会主动的复制一份到/var/log/journal目录下啰!

(7)logger指令的应用

第19章 启动流程

详细版:

  1. 加载BIOS的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置:
  2. 读取并执行第一个开机装置内MBR的boot Loader(亦即是grub2.spfdisk等程序):
  3. 依据boot loader的设定加载Kernel,Kernel会开始侦测硬件与加载驱动程序:
  4. 在硬件驱动成功后,Kernel会主动呼叫 systemd程序,并以default target 流程开机:
    • systemd 执行sysinit target 初始化系统及basic.target 准备操作系统;
    • systemd 启动multi-user target 下的本机与服务器服务:
    • systemd 执行multi-user target 下的/etc/rc.d/rc.local文件:
    • systemd 执行multi-user target 下的getty.target 及登入服务:
    • systemd 执行graphical需要的服务

简述版:
1、主机加电自检,加载 BIOS 硬件信息,BIOS进行系统检测。
2、读取 MBR 的引导文件(GRUB、LILO)。
3、引导 Linux 内核。
4、由内核启动运行第一个进程 init (进程号永远为 1 )。(会去读取inittab文件,执行rc.sysinit,,rc文件 /etc/rc.d/rc.local等脚本)
5、进入相应的运行级别
6、运行终端,输入用户名和密码。

1、启动过程的问题解决

(1)忘记root密码的解决之道

(1)第一种方法
进入救援 rescue 模式,并且挂载 / 目录,重新设定一下 root 密码。

(2)第二种方法
但是在新版的systemd的管理机制中,默认的rescue模式是无法直接取得root权限,还是要使用root的密码才能够登入 rescue环境。这下有什么解决方案?通过 【rd.break】的核心参数来处理。只是需要注意的是,rd.break是在Ram Disk里面的操作系统状态,因此你不能直接取得原本的linux系统操作环境。所以,还需要chroot的支持!更由于SELinux的问题,你可能还得要加上某些特殊的流程才能顺利的搞定root 密码的救援喔!

现在就让我们来实作一下吧!(1)按下systemctl reboot 来重新启动,(2)进入到开机画面,在可以开机的选单上按下e来进入编辑模式,然后就在linux16的那个核心项目上面使用这个参数来处理:

改完之后按下[ctrl]+x开始开机,开机完成后屏幕会出现如下的类似画面,此时请注意,你应该是在RAMDisk的环境,并不是原本的环境,因此根目录底下的东西跟你原本的系统无关喔!而且,你的系统应该会被挂载到/sysroot目录下,因此,你得要这样作:

Ctrl+x同上但再按一次会从新回到原位置

  • chroot目录:代表将你的根目录暂时】切换到chroot 之后所接的目录。因此,以上表为例,那个/sysroot将会被暂时作为根目录,而我们知道那个目录其实就是最原先的系统根目录,所以你当然就能够用来处理你的文件系统与相关的账号管理啰!
  • 为何需要/.autorelabel:在rd.break的RAM Disk环境下,系统是没有SELinux的,而你刚刚更改了
    /etc/shadow(因为改密码啊!),所以这个文件的SELinux安全本文的特性将会被取消喔!如果你没有让系统于开机时自动的回复SELinux的安全本文,你的系统将产生[无法登入】的问题(在SELinux为Enforcing的模式下!)加上/.autorelabel就是要让系统在开机的时候自动的使用预设的SELinux type重新写入SELinux安全本文到每个文件去!

不过加上/.autorelabel之后,系统在开机就会重新写入SELinux的type到每个文件,因此会花不少的时间喔!如果你不想要花太多时间,还有个方法可以处理:

  • 在rd.break模式下,修改完root 密码后,将/etc/selinux/config 内的SELinux类型改为permissive
  • 重新启动后,使用root的身份下达 restorecon -Rv /etc 仅修改/etc底下的文件;
  • 重新修改/etc/selinux/config 改回enforcing,然后 setenforce 1 即可!

(2) 因文件系统错误而无法启动

如果因为设定错误导致无法开机时,要怎么办啊?这就更简单了!最容易出错的设定而导致无法顺利开机的步骤,通常就是/etc/fstab这个文件了,尤其是使用者在实作 Quota/LVM/RAID 时,最容易写错参数,又没有经过mount -a来测试挂载,就立刻直接重新启动,真要命!无法开机成功怎么办?

这种情况的问题大多如下面的画面所示:

看到最后两行,他说可以输入root的密码继续加以救援喔!那请输入root的密码来取得bash并以mount -o remount,rw / 将根目录挂载成可擦写后,继续处理吧!其实会造成上述画面可能的原因除了
/etc/fstab编辑错误之外,如果你曾经不正常关机后,也可能导致文件系统不一致(Inconsistent)的情况,也有可能会出现相同的问题啊!如果是扇区错乱的情况,请看到上图中的第二行处,fsck告知其实是/dev/md0出错,此时你就应该要利用fsck.ext3去检测/dev/md0才是!等到系统发现错误,并且出现 【clear[Y/N] 】时,输入 y 吧!

第22章 软件安装RPM、SRPM(rpmbuild)与YUM

RPM

RPM安装

rpm -i /rp.pppoe-3.11.rpm
-i: install安装的意思
-v: 查看更详细的安装信息
-h: 显示安装进度

--prefix 新路径
--nodeps // 强制安装
--test  //测试安装

RPM查询

rpm -qa
rpm -qf 文件名 // 找出该文件属于哪一个已安装的软件

YUM

YUM规则

YUM配置


YUM测试

修改软件库产生的问题与解决之道
由于我们是修改系统默认的配置文件,事实上,我们应该要在/etc/yum.repos.d/底下新建一个文件,该扩展名必须是.repo才行!但因为我们使用的是指定特定的映像站台,而不是其他软件开发商提供的软件库,因此才修改系统默认配置文件。但是可能由于使用的软件库版本有新旧之分,你得要知道,yum会先下载软件库的清单到本机的/var/cache/yum里面去!那我们修改了网址却没有修改软件库名称(中括号内的文字),可能就会造成本机的列表与yum服务器的列表不同步,此时就会出现无法更新的问题了!

那怎么办啊?很简单,就清除掉本机上面的旧数据即可!需要手动处理吗?不需要的,透过yum的clean项目来处理即可!

yum clean [packages|headers|all]

选项与参数:
packages:将已下载的软件文件删除
headers:将下载的软件文件头删除
all:将所有软件库数据都删除!

YUM的软件群组功能

SRPM(rpmbuild)❤

路径 解释
/root/rpmbuild/SPECS 软件的配置文件,例如这个软件的信息参数、设定项目等
/root/rpmbuild/SOURCES 放置的是该软件的原始文件(*.tar.gz的文件)以及config这个配置文件
/root/rpmbuild/BUILD 在编译的过程中,有些暂存的数据都会放置在这个目录当中
/root/rpmbuild/RPMS 经过顺利的编译成功后,将打包完成的文件放置在这个目录当中。里头有包含了x86_64,noarch等等的次目录
/root/rpmbuild/SRPMS 与RPMS内相似的,这里放置的就是SRPM封装的文件,有时候想将你的软件用SRPM的方式释出时,你的SRPM文件就会放置在这个目录中。

配置文件的主要内容(*.spec)
编译需要的步骤大抵就是/configure,make,make check,make install 等,那这些动作写入就在SPECS目录中。



要注意到的是ntp.sepc这个文件,这是主要的将SRPM编译成RPM的配置文件,他的基本规则可以这样看:

  1. 整个文件的开头以Summary为开始,这部份的设定都是最基础的说明内容;
  2. 然后每个不同的段落之间,都以%来做为开头,例如%prep与%install等;

系统整体信息方面

Name:                  myapp <===软件包的名字(后面会用到)
Version:               0.1.0 <===软件包的版本(后面会用到)
Release:               1%{
   ?dist} <===发布序号
Summary:               my first rpm <===软件包的摘要信息
Group:                 <===软件包的安装分类,参见/usr/share/doc/rpm-4.x.x/GROUPS这个文件
License:               GPL <===软件的授权方式
URL:                   <===这里本来写源码包的下载路径或者自己的博客地址或者公司网址之类
Source0:               %{
   name}-%{
   version}.tar.gz <===源代码包的名称(默认时rpmbuid回到SOURCES目录中去找),这里的name和version就是前两行定义的值。如果有其他配置或脚本则依次用Source1、Source2等等往后增加即可。
BuildRoot:             %{
   _topdir}/BUILDROOT <=== 这是make install时使用的“虚拟”根目录,最终制作rpm安装包的文件就来自这里。
BuildRequires:         <=== 在本机编译rpm包时需要的辅助工具,以逗号分隔。假如,要求编译myapp时,gcc的版本至少为4.4.2,则可以写成gcc >=4.2.2。还有其他依赖的话则以逗号分别继续写道后面。
Requires:              <=== 编译好的rpm软件在其他机器上安装时,需要依赖的其他软件包,也以逗号分隔,有版本需求的可以
%description           <=== 软件包的详细说明信息,但最多只能有80个英文字符



根据上面的设定,最终的档名就会是{Name}-{Version}-{Release}.{Arch}.rpm的样式,以我们上面的设定来说,档名应该会是ntp-4.2.6p5-20.vbird.x86_64.rpm



SRPM的编译指令(-ba/-bb)

rpmbuild -ba ntp.spec <== 编译并同时产生RPM与SRPM文件
rpmbuild -bb ntp.spec <== 仅编译成RPM文件

系统执行的过程:

  1. 先进入到BUILD这个目录中,即是:/root/rpmbuild/BUILD这个目录。
  2. 依照*.spec文件内的Name与Version定义出工作的目录名称,那么系统就会在BUILD目录中先删除ntp-4.2.6p5的目录,再重新建立一个ntp-4.2.6p5的目录,并进入该目录。
  3. 在新建的目录里面,针对SOURCES目录下的来源文件,也就是*.spec里面的Source设定的那个文件,以tar进行解压缩,以我们这个例子来说,则会在/root/rpmbuild/BUILD/ntp-4.2.6p5当中,将/root/rpmbuild/SOURCES/ntp-* 等等多个原始码文件进行解压缩。
  4. 再来开始%build%install的设定与编译
  5. 最后将完成打包的文件给他放置,/root/rpmbuild/RPMS/x86_64或noarch,根据系统版本而定。

打包自己软件的示例

mkdir -pv ~/rpmbuild/{
   BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} 

(1)制作原始码文件tarball产生

  • main-0.1.tar.gz放在/root/rpmbuild/SOURCES/
  • main_0.1_to_0.2_patch 放在/root/rpmbuild/SOURCES/
  • main.spec 自行撰写放在/root/rpmbuild/SPECS/

(2)建立*.spec的配置文件

Name:		main
Version:	0.1
Release:	1%{
   ?dist}
Summary:	Show sin and cos value

Group:		Scientific Support
License:	GPLv2
URL:		http://linux.vbird.org/
Source0:	main-0.1.tgz
Patch0:     main_0.1_to_0.2.patch
# 这两个档名要正确

%description
this package will let you input your name and calculate sin cos value

%prep
%setup -q
%patch0 -p1

%build
make clean main

%install
mkdir -p %{
   buildroot}/usr/local/bin
install -m 755 main %{
   buildroot}/usr/local/bin

%files
/usr/local/bin/main

%changelog

(3)编译成为RPM与SRPM

# rpmbuild -ba main.spec

(4)安装测试查询

示例2:https://blog.51cto.com/laoguang/1103628


转载:https://blog.csdn.net/qq_39578545/article/details/116561677
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场