btrfs文件系统压缩工具及for语句程序包管理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了btrfs文件系统压缩工具及for语句程序包管理相关的知识,希望对你有一定的参考价值。
btrfs(b-tree、butter fs、better fs)oracle 公司研发的替代ext系列的cow(写时复制)机制的文件系统,并遵循GPL协定
核心特性:
1、多物理卷支持;支持将多个底层物理设备组织成同一个文件系统,类似物理卷,btrfs可由多个地城物理卷组成,支持raid,以联机实现物理卷的"添加"、"移除"、"修改"
2、写时复制更新机制(CoW);复制、更新及替换指针,而非"就地"更新
不修改文件时,复制的文件无文件内容,指针仍指向原文件的数据
修改文件时,不立即修改原文件,会对目标文件进行备份,对备份文件进行修改,把文件名指向,有原文件改为备份文件,原数据保留,方便数据恢复
3、数据及元数据校验码机制;存储每个文件时,把文件的元数据的校验码和数据的校验码,通过文件的属性拓展保存下来,访问文件时,通过扫描校验码,可快速判断文件是否受损,一旦受损,中的尝试修复,极大保证数据的可靠性
4、支持子卷 subvolume;在某卷上创建诸多子卷,每个子卷可以实现单独使用和挂载
5、快照 支持快照的快照;基于写时复制机制,增加了差异(增量)快照,可以对快照进行快照,完成对快照后的文件改变进行再次快照
6、透明压缩机制;在这个分区上存储文件,想节约空间,可以把任何数据流发往btrfs文件系统上,自动通过某些占据cpu的时钟周期完成数据压缩存放,用户不知道,读取时自动解压缩,但消耗cpu的时钟周期
创建btrfs文件系统
mkfs.btrfs命令
mkfs.btrfs [options]
-L ‘LABEL‘ 指明卷标
-d type 指明数据存储类型(raid0,raid1,raid5,raid6,raid10,single默认)
-m profile 指明元数据存储机制(底层物理存储设备空间够用)(raid0,raid1,raid5,raid6,raid10,single默认(单个文件),dup(冗余))
-O feature 在格式化是,指明其他特性
-O list-all 列出支持的所有feature
注意:在一块磁盘上组合不同分区除了将多个分区组合成一个大分区并无什么其余的意义,所以建议使用不同的磁盘做btrfs。
例如:mkfs.btrfs -L mybtr /dev/sd{b,c,d} 把3块磁盘创建为一个btrfs系统
属性查看 (filesystem);
btrfs filesystem show 查看btrfs分区信息
btrfs filesystem df /挂载点 显示分区使用情况
btrfs filesystem resize <+|->#[MG] /挂载点 增加或减少挂载点的使用空间
btrfs filesystem resize max /挂载点 增加全部使用空间到挂载点
挂载文件系统
mount -t btrfs /dev/device mount_point /dev/device 可为btrfs中的任意一块磁盘
扩展空间(向已存在的btrfs系统增加空间)(device);
btrfs device add /dev/device /挂载点
向挂载点增加一个磁盘空间
btrfs device delete /dev/device /挂载点
把挂载点某个磁盘卸载
扩展空间后必须使用命令来平衡btrfs系统中数据存放
btrfs balance start /挂载点
改变btrfs系统属性(balance)
btrfs balance start mount_point
平衡btrfs系统中的数据
btrfs balance status mount_point
显示btrfs平衡数据过程(磁盘数据过少,不容易看到)
btrfs balance start -dconvert=single mount_point
修改btrfs文件系统的数据存放格式
btrfs balance start -mconvert=raid1 mount_point
修改btrfs文件系统的元数据存放格式
创建子卷和快照(subvolume)
查看子卷id等信息
btrfs subvolume list mount_point
btrfs subvolume show mount_point
btrfs subvolume create mount_point/dir 创建名为dir的子卷
挂载子卷的方式(先卸载父卷)
mount -o subvol=dir /dev/sd# mount_point<新挂载点>
/dev/sd# 为btrfs文件系统中的任意一个磁盘都可以
btrfs subvolume delete mount_point/dir
删除子卷
mount /dev/sdb /mydata 挂载父卷,子卷自动挂载
btrfs subvolume snapshot mount_point mount_point/snapshot_dir
创建父卷或子卷的快照
btrfs subvolume delete mount_point/snapshot_dir
删除快照
其中:对某个单独文件做快照:cp –reflink file file_snapshot
透明压缩机制:
mount -o compress={lzo|zlib} device mount_point
如何升级为btrfs文件系统
btrfs-convert /dev/device
升级为btrfs文件系统
btrfs-convert -r /dev/device
降级为原来的文件系统
压缩、解压缩及归档工具
compress/uncompress .Z
gzip/gunzip .gz
bzip2/bunzip2 bz2
xz/unxz .xz
zip/unzip
tar,cpio
1、gzip/gunzip
gzip [option]... file... 默认压缩后,删除源文件
[[email protected] tmp]# ll -h messages
-rw-------. 1 root root 503K Jun 14 09:26 messages
[[email protected] tmp]# gzip messages
[[email protected] tmp]# ll -h messages.gz
-rw-------. 1 root root 68K Jun 14 09:26 messages.gz
-d 解压缩 相当于gunzip
[[email protected] tmp]# gzip -d messages.gz
[[email protected] tmp]# ll -h messages
-rw-------. 1 root root 503K Jun 14 09:26 messages
[[email protected] tmp]# gunzip messages.gz
[[email protected] tmp]# ll -h messages
-rw-------. 1 root root 503K Jun 14 09:26 messages
-c 将结果输出至标准输出
[[email protected] tmp]# gzip -c messages > messages.gz
[[email protected] tmp]# ll -h messages*
-rw-------. 1 root root 503K Jun 14 09:26 messages
-rw-r--r--. 1 root root 68K Jun 14 09:43 messages.gz
-# 1-9 指定压缩比,压缩比越大,压缩后的文件越小,默认为6
[[email protected] tmp]# gzip -9 messages
[[email protected] tmp]# ll -h messages.gz
-rw-------. 1 root root 67K Jun 14 09:26 messages.gz
zcat 不显式展开的前提下查看文件内容
[[email protected] tmp]# zcat messages.gz
2、bzip2/bunzip2/bzcat
bzip2 [option]... file...默认压缩后,删除源文件
[[email protected] tmp]# ll -h messages
-rw-------. 1 root root 503K Jun 14 09:26 messages
[[email protected] tmp]# bzip2 messages
[[email protected] tmp]# ll -h messages.bz2
-rw-------. 1 root root 28K Jun 14 09:26 messages.bz2
-k keep 保留源文件
[[email protected] tmp]# bzip2 -k messages
[[email protected] tmp]# ll -h messages*
-rw-------. 1 root root 503K Jun 14 09:26 messages
-rw-------. 1 root root 28K Jun 14 09:26 messages.bz2
-d 解压缩 相当于bunzip2
[[email protected] tmp]# bzip2 -d messages.bz2
[[email protected] tmp]# ll -h messages
-rw-------. 1 root root 503K Jun 14 09:26 messages
[[email protected] tmp]# bunzip2 messages.bz2
[[email protected] tmp]# ll -h messages
-rw-------. 1 root root 503K Jun 14 09:26 messages
-# 1-9 压缩比,压缩比越大,压缩后的文件越小,默认为6
[[email protected] tmp]# bzip2 -9 messages
[[email protected] tmp]# ll -h messages.bz2
-rw-------. 1 root root 28K Jun 14 09:26 messages.bz2
bzcat 不显式展开的前提下查看文本文件内容
[[email protected] tmp]# bzcat messages.bz2
3、xz/unxz/xzcat
xz [option]... file... 默认压缩后,删除源文件
[[email protected] tmp]# ll -h messages
-rw-------. 1 root root 503K Jun 14 09:26 messages
[[email protected] tmp]# xz messages
[[email protected] tmp]# ll -h messages.xz
-rw-------. 1 root root 21K Jun 14 09:26 messages.xz
-k keep 保留原文件
[email protected] tmp]# xz -k messages
[[email protected] tmp]# ll -h messages*
-rw-------. 1 root root 503K Jun 14 09:26 messages
-rw-------. 1 root root 21K Jun 14 09:26 messages.xz
-d 解压缩,相当于unxz
[[email protected] tmp]# xz -d messages.xz
[[email protected] tmp]# ll -h messages
-rw-------. 1 root root 503K Jun 14 09:26 messages
[[email protected] tmp]# unxz messages.xz
[[email protected] tmp]# ll -h messages
-rw-------. 1 root root 503K Jun 14 09:26 messages
-# 1-9 压缩比,压缩比越大,压缩后的文件越小,默认为6
[[email protected] tmp]# xz -9 messages
[[email protected] tmp]# ll -h messages.xz
-rw-------. 1 root root 21K Jun 14 09:26 messages.xz
xzcat 不显式展开的前提下查看文本文件内容
[[email protected] tmp]# xzcat messages.xz
4、tar
tar [option]...
创建归档
tar -c -f /path/to/somefile.tar file...
[[email protected] tmp]# tar -c -f messages.tar messages
tar cf /path/to/somefile.tar file...
[[email protected] tmp]# tar -cf messages.tar messages
[[email protected] tmp]# tar cf messages.tar messages
查看归档文件中的文件列表
tar -t -f /path/to/somefile.tar
[[email protected] tmp]# tar -t -f messages.tar
messages
[[email protected] tmp]# tar -tf messages.tar
messages
[[email protected] tmp]# tar tf messages.tar
messages
展开归档
tar -x -f /path/to/somefile.tar
[[email protected] tmp]# tar -x -f messages.tar
[[email protected] tmp]# tar -xf messages.tar
[[email protected] tmp]# tar xf messages.tar
tar xf /path/to/somefile.tar -C /path/to/dir
[[email protected] tmp]# tar xf messages.tar -C /root
[[email protected] tmp]# ll /root/messages
-rw-------. 1 root root 514730 Jun 14 09:26 /root/messages
结合压缩工具实现,归档并压缩
-z gzip
-j bzip2
-J xz
[[email protected] tmp]# tar -czf messages.gz.tar messages
[[email protected] tmp]# tar -cjf messages.bz2.tar messages
[[email protected] tmp]# tar -cJf messages.xz.tar messages
[[email protected] tmp]# ll -h messages*
-rw-------. 1 root root 503K Jun 14 09:26 messages
-rw-r--r--. 1 root root 28K Jun 14 11:04 messages.bz2.tar
-rw-r--r--. 1 root root 68K Jun 14 11:04 messages.gz.tar
-rw-r--r--. 1 root root 510K Jun 14 10:51 messages.tar
-rw-r--r--. 1 root root 21K Jun 14 11:04 messages.xz.tar
bash脚本编程
if语句 bash -n 检查语法 bash -x 分布执行
condition
bash命令
用命令的执行状态结果
成功 true
失败 false
成功或失败的意义,取决于用到的命令
单分支
if condition;then
if-true
fi
双分支
if condition;then
if-true
else
if-false
fi
多分支
if condition1;then
if-true
elif condition2;then
if-true
elif condition3;then
if-true
...
else
if-false
fi
逐条件进行判断,第一次遇到"真"条件时,执行其分支,而后结束
示例:用户键入文件路径,脚本来判断文件类型
#!/bin/bash
read -p "enter a file path:" filename
if [ -z "$filename" ];then
echo "useage:enter a file path."
exit 2
fi
if [ ! -e $filename ];then
echo "no such file."
exit 3
fi
if [ -f $filename ];then
echo "a common file."
elif [ -d $filename ];then
echo "a directory."
elif [ -L $filename ];then
echo "a symbolic file."
else
echo "other type."
fi
注意:if语句可嵌套
循环: for while until
循环体 要执行的代码 可能要执行n遍
进入条件
退出条件
for循环
for 变量名 in 列表;do
循环体
done
执行机制
依次将列表中的元素赋值给"变量名";每次赋值后即执行一次循环体;知道列表中的元素耗尽,循环结束;
示例:添加10个用户,user1-user10密码同用户名
#!/bin/bash
if [ ! $UID -eq 0 ];then
echo "only root."
exit 1
fi
for i in {1..10};do
if id user$i &> /dev/null;then
echo "user$i exists."
else
useradd user$i
if [ $? -eq 0 ];then
echo "$user$i" | passwd --stdin user$i &> /dev/null
echo "add user$i finished."
fi
fi
done
列表生成方式:
1、直接给出列表
2、整数列表
a、{start..end}
b、$(seq [start [step]] end)
3、返回列表的命令 $(command)
4、glob 文件名通配
5、变量引用 [email protected] $*
示例:判断某路径下所有文件的类型
#!/bin/bash
for file in $(ls /var);do
if [ -f /var/$file ];then
echo "common file."
elif [ -L /var/$file ];then
echo "symbolic file."
elif [ -d /var/$file ];then
echo "directory."
else
echo "other type."
fi
done
示例:
#!/bin/bash
declare -i estab=0
declare -i listen=0
declare -i other=0
for state in $(netstat -tan | grep "^tcp>" | awk ‘{print $NF}‘);do
if [ "$state" == ‘ESTABLISHED‘ ];then
let estab++
elif [ "$state" == ‘LISTEN’ ];then
let listen++
else
let other++
fi
done
echo "ESTABLISHEE:$estab"
echo "LISTEN:$listen"
echo "unkown:$other"
练习1:/etc/rc.d/rc3.d目录下分别有多个以k开头和以s开头的文件;分别读取每个1文件,以k开头的文件输出为文件名加stop,以s开头的文件输出为文件名加start
例如:"k34filename stop" "s66filename start"
#!/bin/bash
for file in ls /etc/rc.d/rc3.d
;do
if [[ "$file" =~ "^K" ]];then
echo "$file stop."
elif [[ "$file" =~ "^S" ]];then
echo "$file start."
else
echo "unkown option."
fi
done
练习2:写一个脚本,使用ping命令探测172.16.250.1-254之间的主机的在线状态
#!/bin/bash
for i in {1..254};do
ping -c 1 172.16.250.$i &> /dev/null
state=echo $?
if [ $state -eq 0 ];then
echo "172.16.250.$i is online."
else
echo "172.16.250.$i is out."
fi
done
linux程序包管理
api application programing interface 应用编程接口
posix protable os 可移植操作系统
程序源代码--预处理--编译--汇编--链接
静态编译
共享编译
abi application binary interface 应用二进制接口
windows与linux不兼容
库级别的虚拟化
linux wine
windows cywin
系统级开发 C C++
应用级开发 java python php perl ruby
二进制应用程序的组成部分
二进制文件、库文件、配置文件、帮助文件
程序包管理器
debian deb,dpt
redhat rpm,rpm
rpm redhat package manager
rpm is package manager
源代码 name-version-tar.gz
version:major-minor.release
rmp包命令方式
name-version-arch.rpm
version:major-minor.release
release.arch
release:release.os
例如:zlib-1.2.7-13.el7.i386.rpm
常见的arch
x86 i386 i486 i586 i686
x86_64 x64 x86_64 amd64
powerpc ppc
跟平台无关 noarch
testapp
testapp-version-arch.rpm 主包
testapp-devel-version-arch.rpm 支包
testapp-testing-version-arch.rpm
程序包之间,存在依赖关系
X Y Z
X依赖于Y 安装X之前,先安装Y
Y依赖于Z 安装Y之前,先安装Z
yum rpm包管理器的前端工具
apt-get deb包管理器的前端工具
zypper suse上的rpm前端管理工具
dnf fedora 22+ rmp包管理器的前端管理工具
查看二进制程序所依赖的库文件
ldd /path/to/binary_file
[[email protected] ~]# ldd /bin/ls
linux-vdso.so.1 => (0x00007ffc7cc82000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f63049a4000)
librt.so.1 => /lib64/librt.so.1 (0x00007f630479c000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f6304597000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007f630438f000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6303ffb000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6303df6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6304bc8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6303bd9000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f63039d4000)
管理及查看本机装载的库文件
ldconfig
/sbin/ldconfig -p 显示本机已经缓存的所有可用库文件名及文件路径映射关系
[[email protected] ~]# ldconfig -p
183 libs found in cache `/etc/ld.so.cache‘
libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
配置文件为 /etc/ld.so.conf /etc/ld.so.conf.d/*.config
缓存文件为 /etc/ld.so.cache
程序包管理
功能:将编译好的应用程序的各组成文件打包一个或多个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
1、程序的组成清单(每个包独有)
文件清单
安装或卸载时运行的脚本
2、数据库(公共)
程序包名称及版本
依赖关系
功能说明
安装生成的各文件的文件路径及校验信息
管理程序包的方式
使用包管理器 rpm
使用前端工具 yum dnf
获取程序报的途径
1、系统发行版的光盘或官方的服务器
centos镜像
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
2、项目官方站点
3、第三方组织
fedora-epel
搜索引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
4、自己制作
建议:检查其合法性(来源合法性、程序包的完整性)
centos系统上rpm命令管理程序包
安装 卸载 升级 查询 校验 数据库维护
安装
rpm [-i|--install] [install-options] package_file ...
-v verbose 显示详细信息
-vv
-h 以#显示程序包安装执行进度,每个#表示2%的进度
rpm -ivh package_file ...
[install-options]
--test 测试安装 但不真正执行安装过程,dry run模式
--nodeps 忽略依赖关系
--replacepkgs 重新安装
--nosignature 不检查来源合法性
--nodigest 不检查包完整性
--noscripts 不执行程序包脚本片段
%pre 安装前脚本 --nopre
%post 安装后脚本 --nopost
%preun 卸载前脚本 --nopreun
%postun 卸载后脚本 --nopostun
升级
rpm {-U|--upgrade} [install-options] packages_file ...
rpm {-F|--freshen} [install-options] packages_file ...
upgrade 安装有旧版本程序包,则升级,如果不存在旧版程序包,则安装
freshen 安装有旧版本程序包,则升级,如果不存在旧版程序包,则不执行升级操作
rpm -Uvh package_file ...
rpm -Fvh package_file ...
--oldpackage 降级安装
--force 强制升级
注意
1、不要对内核做升级操作,linux支持多内核版本内存,因此,对直接安装新版本内核
2、如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版的文件重命名为(filename.rpmnew)后保留
查询
rpm {-q|--query} []select-options] [query-options]
[select-options]
-a 所有包
-f 查看指定的文件有哪个程序包安装生成
-p /path/to/package_file 针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY 查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY 查询指定的CAPABILITY被哪个包所依赖
[query-options]
--changelog 查询rpm包的changelog
-c 查询程序的配置文件
-d 查询程序的文档
-i information
-l 查看指定的程序包安装后生成的所有文件
--scripts 程序包自带的脚本片段
-R 查询指定的程序包所以来的CAPABILITY
--provides 列出指定程序包所提供的CAPABILITY
用法
-qi package
-qf file
-qc package
-ql package
-qd package
-qpi package_file
-qpl package_file
卸载
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] package_name ...
校验
rpm {-V|--verify} [select-options] [verify-options]
S file size differs
M mode differs (includes permissions and file type)
5 digest (formerly md5 sum)differs
D device major/minor number mismatch
L readlink(2) pathmimatch
U user ownership differs
G group ownership differs
T mtime differs
P capability differs
包来源合法性验证及完整性验证
完整性验证 SHA256
来源合法性验证 RSA
公钥加密
对称加密 加密解密使用同一密钥
非对称加密 密钥是成对的
public key 公钥 公开所有人
secret key 私钥 不能公开
导入所需要公钥
rpm --import /path/from/gpg-pubkey-file
centos 7 发行版光盘提供的密钥文件 rpm-gpg-ke-centos-7
数据重建
rpm {--initdb|rebuliddb}
initdb 初始化
如果事先不存在数据库,则新建之,否者,不执行任何操作
rebuliddb 重建
无论当前存在与否,直接重新创建数据库
以上是关于btrfs文件系统压缩工具及for语句程序包管理的主要内容,如果未能解决你的问题,请参考以下文章