A. 详解linux软件安装中RPM与YUM 区别和联系
一般Linux软件安装有这么几种方式:
那么其中rpm与yum有什么区别呢?
RPM管理支持事务机制。增强了程序安装卸载的管理。
RPM的功能:打包、安装、查询、升级、卸载、校验、数据库管理。
1、RPM的缺点
由于Linux中的程序大多是小程序。程序与程序之间存在非常复杂的依赖关系。RPM无法解决软件包的依赖关系。
2、RPM包
用RPM工具可以将二进制程序进行打包,包被称为RPM包。RPM包并不是跨平台的。RedHat的RPM包与SUSE的RPM包不能混用。实际上RedHat的安装,初始软件也都是使用RPM包进行安装的。
源程序的命名规范 : name-version.tar.{gz|bz2|xz}
版本号:major.minor.release
例:bash-4.3.1.tar.xz
RPM包的命名规范 : name-version-release.os.arch.rpm
name:程序名称。
version:程序版本号。
release(发行号):用于标识RPM包本身的发行号,与源程序的release号无关。
os:即说明RPM包支持的操作系统版本。如el6(即rhel6)、centos6、el5、suse11。
arch:主机平台。如i686、x86_64、amd64、ppc(power-pc)、noarch(即不依赖平台)
例:bash-4.3.2-5.el6.x86_64.rpm
3、安装RPM包
命令格式: rpm -i /PATH/TO/RPM_FILE
一般组合起来使用:-ivh
命令格式: rpm -ivh PATH/TO/RPM_FILE
4、卸载RPM包
命令格式: rpm -e 包名
查询RPM相关信息
命令格式: rpm -q 包名
查询所有已经安装包: rpm -qa
5、RPM的数据库
数据库文件位于: /var/lib/rpm
若库损坏,很多RPM的查询将无法使用。
YUM客户端基于RPM包进行管理,可以通过HTTP服务器下载、FTP服务器下载、本地软件池的等方式获得软件包,可以从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系。
YUM在安装RPM时,会从服务器下载相应包,且缓存在本地。
使用YUM进行RPM包的管理,非常简单方便。
1、YUM客户端的使用
YUM客户端的配置
YUM的配置方式是基于分段配置的。
主配置文件: /etc/yum.conf
YUM的片段配置: /etc/yum.repos.d/*.repo
主配置文件配置了一个特殊的仓库,名称为main。main是为其他仓库提供默认的全局配置的。
配置文件的说明:
查看CentOS-Base.repo配置文件:
对配置文件中的一些配置项作说明:
2、yum命令的使用
yum的命令形式一般是如下: yum [options] [subcommand] [package ...]
yum list相关命令
获取yum仓库中所有的包信息。
命令: yum list all
结果说明:
查看yum仓库中指定包名的软件包,可以使用通配符。
命令: yum list all mysql*
查看仓库
查看当前能够使用的yum仓库
命令: yun repo list
显示所有仓库
命令: yum repo list all
清空本地yum的缓存
yum仓库若更新,则本地缓存就没有意义了。所以本地缓存需要清空。
命令格式: yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
手动在本地建立缓存
yum客户端会下载远程yum的文件。在本地生成缓存。
命令: yum makecache
安装应用程序
基本格式: yum [-y] install 包1 包2 ... 包n
说明:
若安装多个包,则使用包名之间使用空格隔开。
安装过程中,yum会询问用户是否安装,使用yum -y 选项,表示自动回答为yes。
卸载软件包
命令格式: yum remove 包1 包2 ... 包n
注意:若该包被依赖,则该卸载可能会导致一些问题。如A依赖B,若卸载B,则A也会被卸载。
上面都是比较常用的命令,如果基本上用过的话那么在这一块的内容也就基本达标了。
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~
B. linux动态库和静态库的区别
接静态库其实从某种意义上来说只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。
(1)首先就是系统空间被浪费了。如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。
(2)再者,一旦发现了库中有bug,挽救起来就比较麻烦了。必须一一把链接该库的程序找出来,然后重新编译。
而动态库的出现正弥补了静态库的以上弊端。因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。
但是静态库的优点:
编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。
静态库的名字一般是libxxx.a(Linux)
动态库的名字一般是libxxx.so(Linux),有时候也是 libxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号。
C. Linux系统怎么修改磁盘参数(名称,盘符等等
1.mknod
用法:mknod设备名称【bcp】【Major】【Minor】
设备种类,
b:设置设备名称为外部的外部的存储设备文件eg:硬盘
c:设置设备名称为外部输入设备文件罩枯盯eg:键盘/鼠标
P:设置设备名称为FIFO文件
Major:主要设备名称代码
Minor:次要设备代码
eg:【~~~】#mknod/dev/hda10310
注:3和10只有特殊意义的,不可随意的设置
在linux系统中,所有的设备都是以文件的形式来表示的,也就是通过文件的主与次来表示的,硬盘的主与次如下所示:
硬盘代号主【Major】次【Minor】
/dev/sda30~63
/dev/sdb364~127
/dev/sdc220~63
/dev/sdd2264~127
2.e2label
【~~~~~~】#e2label设备名称新的Label名称
【~~~~~~】#e2label/dev/sda1sda1
【~~~~~~】#mpe2fs-h/dev/sda1
该命令的主要的主要作用是用来修改“磁盘的表头数据”,即磁盘的卷标。但是请注意,如果你刚好有两个硬盘,如果你修改了卷标,刚好和另外的有个分区有相同的卷标,系统就无法判断哪个分区是正确的。
这些命令都是不算是特别常用的,常用的命令你可以学习下这里。第2章 新手必须掌握的Linux命令。www.linuxprobe.com/chapter-02.html,最后我觉得还算是写干货,对于新手很适合。
3.tune2fs
【~~~~~~~】#tune2fs【-jlL】设备号
-j:将ext2的文件系统转换为ext3的文件系统
-l:将超级快物和内的数据度出来,该功能类似于mpe2fs-h的功能
-L:修改文件系统的卷标,类似于e2label的功能
eg:【~~败亮~~~~】#tune2fs-l/dev/sda1
更多的功能请参考mantune2fs
4.hdparm
如硬盘有DMA模式的功能,系统却没有启动它,那么,硬盘的读取性能可能会降低一半以上,就可以使用该命令来启动DMA模式的功能。该命令有很多的高级的参数设置值,所以不建议随便的修改,否则容易造成硬盘崩溃,使用这个命令,最多的就是启动DMA功能,并测试硬盘的访问性能就可以了。
【~~~~~~~】#hdparm【-icdmXTt】设备名称
-i:将系统启动过程中使用的本身的核心的驱动程序来测试硬盘的测试值取出来,但是这些值不一定是正确的
-d:设置是否启用dma模式,-d1为启动,-d0为取消。
D. Linux 0.11内核编译错误记录
现象1: 提示gas gld 比识别
措施: gnu编译器发展到后来,越来越流行,更多使用别名为 as ld gcc等.
现象2: 提示字节对齐需要是 2的倍数
措施: 具体解决方法: 利用命令 sed -i 's/align 2/align 4/g' filename 替换align 2 为 align 4(align 3 替换为 align 8)
sed -i 's/align 2/align 4/g' boot/head.s
sed -i 's/align 3/align 8/g' boot/head.s
现象3: -fcombine-regs -mstring-insns选项不识别
措施: 此两个选项已经过时,直接去掉即可
现象4: warning 特别多
措施: 将-Wall 替换为 -w
现象5: __stack_chk_fail 未定义
措施: 去网上搜了一下,在Makefile中的$(CFLAGS)后面加上-fno-stack-protector,即不需要栈保护
现象6: main.c 中_syscall0重复定义
措施: main.c static inline _syscall0(int, fork) 去掉static即可
现象7: 提示内嵌汇编不符合语法限制
措施: 类似的问题在后面编译中出现好多,C内嵌汇编的格式 asm (汇编语句:输入寄存器:输出寄存器:可能被修改的寄存器),最新的GCC规定 输入或输出寄存器不能出现在可能被修改的寄存器中,目前看到网上的方法是把所有类似问题的可能被修改的寄存器全部删掉 解决方案:find -type f -exec sed -i 's/:"w{2}"(,"w{2}") )/:) /g' {} ; 其中's/:"w{2}"(,"w{2}") /:/g'
现象8: 在 control.c 中清楚定义了 static unsigned char attr = 0x70 ,而在链接 control.o 时,却爆出 attr未定义。
措施: 用 nm -C control.o 查看其符号,发现attr确实处于未定义状态。故单独编译一个小程序定义静态变量,查看其 .o 文件中,发现静态变量定义正常。故考虑为编译选项差异导致,最终发现因为 -O 编译优化选项导致,目前处理方式是去掉该选项。
现象9: build.c:(.text+0xde): undefined reference to `MAJOR'
措施: 通过分析编译打印信息,发现编译时没有加入头文件路径 -Iinclude
现象10: fs/fs.o: In function check_disk_change':(.text+0x1b2f): undefined reference to invalidate_buffers'
措施: 查找发现此函数定义在buffer.c 中,且为内联函数, 故尝试将其更改为普通函数, 然后编译通过.
现象11: 编译 build.c 时报错:/usr/include/i386-linux -gnu/bits/stdio2.h:57:8: error: unknown type name ‘__gnuc_va_list’
措施: 分析发现时此系列错误均由 -Iinclude 选项导致, 而该选项在 想象9 中加入, 故考虑去掉该选项, 直接在build.c 中加入 MAJOR 宏定义.
E. major minor linux 重启会变吗
linuxmint这个发行版的问题,它的X运行会自动重启,但好在会自动保存东西,你可以换Ubuntu试试,就是太臃肿了
F. 在linux中,MINOR()函数是干什么的呢返回值是什么
dev_t dev;/*设备号,dev_t实质是一个32位整,高12位为主设备号,低20位为次设备号*/
提取主设备号的方法:MAJOR(dev_t dev)
提取次设备号的方法:MINOR(dev_t dev)
生成dev_t的方法:MKDEV(int major,int minor)