鸟哥的第一本书籍的主要内容,内容稍微与书籍不太一样了!
鸟哥的第一本书大约是在 2002 年的年底左右出版的,内容几乎都是 Linux 基础学习,一点也没有谈到服务器的部份!这也是后来的雏型! 不过内容错误的地方很多,导致在 2003 年的年底推出了『基础学习篇增订版』的内容,大致上就是处理掉一些比较有严重错误的部份。 不过,因为 Linux 的版本变化非常快速,因此,写完了这些文档之后,鸟哥还是持续在网站上更新文档内容,导致原本书籍内容的数据与网站数据差异太大! 这个问题直到鸟哥在 2008 年左右才发现!糟糕了!旧版的文档数据已经遗失~觉得相当扼腕~
因此,在底下的文档内容与当初的书籍内容虽然大同小异,不过章节的编排却是有所不同!再花时间去一个一个处理,似乎也不太符合成本效益! 鸟哥仅是想要将自己以前的文档记录下来而已,同时将过时的 big5 编码改回 utf8 编码,再加上可以支持 RWD 的样式而已啦! 内容已经不多做编排~因此,如果内容文档你看不懂,那也是应该的! ^_^
建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。最新文章请前往鸟站首页查阅啰!
您是否有过文档文件太大,导致无法以一片软碟将他拷贝完成的困扰?又,您是否有过,发现一个软件里面有好多文件,这些文件要将他拷贝与携带都很不方便的问题?还有,您是否有过要备份某些重要数据,偏偏这些数据量太大了,耗掉了你很多的硬盘与磁盘空间呢?这个时候,那个好用的『文件压缩』技术可就派的上用场了!因为这些比较大型的文件通过所谓的文件压缩技术之后,可以将他的磁盘使用量降低,可以达到减低文件容量的效果,此外,有的压缩程序还可以进行容量限制,使一个大型文件可以分割成为数个小型文件,以方便软盘片携带呢!
那么什么是『文件压缩』呢?我们来稍微谈一谈他的原理好了。目前我们使用的电脑系统中都是使用所谓的 bytes 单位来计量的!不过,事实上,电脑最小的计量单位应该是 bits 才对啊,此外,我们也知道 1 byte = 8 bits 。但是如果今天我们只是记忆一个数字,亦即是 1 这个数字呢?他会如何记录?假设一个 byte 可以看成底下的模样:(注:由于 1 byte = 8 bits ,所以每个 byte 当中会有 8 个空格,而每个空格可以是 0, 1 ,这里仅是做为一个约略的介绍,读者不必刻意记忆 )□□□□□□□□而由于我们记录数字是 1 ,考虑电脑所谓的二进位喔,如此一来, 1 会在最右边占据 1 个 bit ,而其他的 7 个 bits 将会自动的被填上 0 啰!你看看,其实在这样的例子中,那 7 个 bits 应该是『空的』才对!不过,为了要满足目前我们的操作系统数据的访问,所以就会将该数据转为 byte 的型态来记录了!而一些聪明的电脑工程师就利用一些复杂的计算方式,将这些没有使用到的空间『丢』出来,以让文件占用的空间变小!这就是压缩的技术啦!简单的说,你可以将他想成,其实文件里面有相当多的『空间』存在,并不是完全填满的,而『压缩』的技术就是将这些『空间』填满,以让整个文件占用的容量下降!不过,这些『压缩过的文件』并无法直接被我们的操作系统所使用的,因此,若要使用这些被压缩过的文件数据,则必须将他『还原』回来未压缩前的模样,那就是所谓的『解压缩』啰!而至于压缩前与压缩后的文件所占用的磁盘空间大小,就可以被称为是『压缩比』啰!更多的技术文档或许你可以参考一下 GNU 计划当中关于压缩指令 gzip 的说明文档。当然,我 这里 也保留一份数据,做为未来参考之用呢!
这个『压缩』与『解压缩』的动作有什么好处呢?最大的好处就是压缩过的文件容量变小了,所以你的硬盘容量无形之中就可以容纳更多的数据,此外,在一些网络数据的传输中,也会由于数据量的降低,好让网络带宽可以用来作更多的工作!而不是老是卡在一些大型的文件上面呢!目前很多的 WWW 网站也是利用文件压缩的技术来进行数据的发送,好让网站的可利用率上升喔!( 注:这种技术蛮有趣的!他让您网站上面『看的到的数据』在经过网络传输时,使用的是『压缩过的数据』,等到这些压缩过的数据到达你的电脑主机时,再进行解压缩,由于目前的电脑运算速度相当的快速,因此其实在网页浏览的时候,时间都是花在『数据的传输』上面,而不是 CPU 的运算啦!,如此一来,由于压缩过的数据量降低了,自然发送的速度就会增快不少! )若您是一位软件工程师,那么相信您也会喜欢将你自己的软件压缩之后提供大家下载来使用,毕竟没有人喜欢自己的网站天天都是带宽满载的吧?!举个例子来说, Linux 2.4.19 完整的内核大小约有 200 MB 左右,而由于内核主要多是 ASCII code 的存文本型态文件,这种文件的『多余空间』最多了。而一个提供下载的压缩过的 2.4.19 内核大约仅有 30MB 左右,差了几倍呢?您可以自己算一算喔!
如果您常常在网络上面捉 Linux 的数据下来玩的话,大概会晓得的是,这些供人下载的文件通常都是『压缩』过的!为了什么?上面已经稍微提过啦!呵呵!压缩过的文件具有节省带宽、节省磁盘空间等等的优点,并且还方便携带呢! ^_^ !而,您应该也会知道,这些被压缩过的文件,通常其附文件名都是『 *.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2 』等等的,为什么要订定这些压缩文件附文件名为这样的模样呢?这是因为在 Linux 上面压缩的指令相当的多,并且,这些压缩指令可能无法针对每种压缩文件都可以解的开,毕竟目前的压缩技术五花八门,每种压缩计算的方法都不是完全相同的,所以啰,当你捉到某个压缩档时,自然就需要知道压缩他的是那个指令啦,好用来对照着解压缩啊! ^_^!也就是说,虽然 Linux 文件的属性基本上是与文件名没有绝对关系的,能不能运行与他的文件属性有关而已,与文件名的关系很小!但是,为了帮助我们小小的人类脑袋瓜子,所以适当的文件名称附文件名还是必要的!因此,目前就有一些常常见到的压缩文件的附文件名啦!我们仅列出常见的几样在底下,给大家权做参考之用:目前常见的压缩程序主要就是如同上面提到的附文件名对应的那些指令啦!最早期的要算是 compress 这个家伙了,而后,后来的 GNU 计划开发出新一代的压缩指令 gzip ( GNU zip ) 用来取代 compress 这个老牌的压缩指令,再来还有 bzip2 这个压缩比更好的压缩指令呢!不过,这些指令通常仅能针对一个文件来压缩与解压缩,如此一来,每次压缩与解压缩都要一大堆文件,岂不烦人?,此时,那个所谓的『打包软件』就显的很重要啦!在 Unix-Like 当中,有个软件很好玩,他就是 tar 这支程序!这个 tar 可以将很多文件『打包』成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是『打包』而已,亦即是将很多文件集结成为一个文件,事实上,他并没有提供压缩的功能,后来, GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供用户更方便并且更强大的压缩与打包功能!
- *.Z compress 程序压缩的文件;
- *.bz2 bzip2 程序压缩的文件;
- *.gz gzip 程序压缩的文件;
- *.tar tar 程序打包的数据,并没有压缩过;
- *.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩!
底下我们就来谈一谈这些在 Linux 底下基本的压缩指令吧!
- compress:
语法:这是用来压缩与解压缩附文件名为 *.Z 的指令!所以看到 *.Z 的文件时,就应该要知道他是经由 compress 这个程序压缩的呦!这是最简单的压缩指令啰!不过,使用的时候需要特别留意的是,当你以 compress 压缩之后,如果没有下达其他的参数,那么原本的文件就会被后来的 *.Z 所取代!以上面的案例来说明:原本压缩的文件为 man.config ,那么当压缩完成之后,将只会剩下 man.config.Z 这个经过压缩的文件啰!那么解压缩呢?呵呵,则是将 man.config.Z 解压缩成 man.config !使用上很简单啦!解压缩除了可以使用 compress –d 这个参数之外,也可以直接使用 uncompress !意思相同啦!
[root @test /root ]# compress [-d] filename
参数说明:
-d :解压缩的参数!
范例:
先 copy /etc/man.config 到 root 底下,再将他压缩看看
[root @test /root]# cp /etc/man.config /root
[root @test /root]# compress man.config
[root @test /root]# compress -d man.config.Z
[root @test /root]# uncompress man.config.Z
- gzip, zcat:
语法:gzip 是用来压缩与解压缩附文件名为 *.gz 的指令!所以看到 *.gz 的文件时,就应该要知道他是经由 gzip 这个程序压缩的呦!另外, gzip 也提供 压缩比的服务! -1 是最差的压缩比,但是压缩速度最快,而 -9 虽然可以达到较佳的压缩比(经过压缩之后,文件比较小一些!),但是却会损失一些速度!缺省是 -6 这个数值! gzip 也是相当常使用的一个压缩指令呢!至于 zcat 则是用来读取压缩档数据内容的指令!假如我们刚刚压缩的文件是一个文本档,那么你还记得如何读取文本档吗?!没错!就是使用 cat ,那么读取压缩档呢?呵呵!就是使用 zcat 啰!由于 gzip 这个压缩指令主要想要用来取代 compress 的,所以 compress 的压缩文件也可以使用 gzip 来解开喔!同时, zcat 这个指令可以同时读取 compress 与 gzip 的压缩档呦!
[root @test /root ]# gzip [-d#] filename <==压缩与解压缩
[root @test /root ]# zcat filename.gz <==读取压缩档内容
参数说明:
-d :解压缩的参数!
-# :压缩等级, 1 最不好, 9 最好, 6 是默认值!
范例:
[root @test /root]# gzip man.config
会产生 man.config.gz 这个文件[root @test /root]# zcat man.config.gz
会读取出 man.config 的内容[root @test /root]# gzip -d man.config.gz
[root @test /root]# gunzip man.config.gz
解压缩,产生 man.config 这个文件[root @test /root]# gzip -9 man.config
以最大压缩比压缩 testing 这个文件!
- bzip2, bzcat:
语法:刚刚的 compress 附文件名自动创建为 .Z ,这里的 bzip2 则是自动的将附文件名建置为 .bz2 啰!所以当我们使用具有压缩功能的 bzip2 –z 时,那么刚刚的 man.config 就会自动的变成了 man.config.bz2 这个文件名啰!好了,那么如果我想要读取这个文件的内容呢?是否一定要解开?当然不需要啰!可以使用简便的 bzcat 这个指令来读取内容即可!例如上面的例子中,我们可以使用 bzcat man.config.bz2 来读取数据而不需要解开!此外,当您要解开一个压缩档时,这个文件的名称为 .bz, .bz2, .tbz, .tbz2 等等,那么就可以尝试使用 bzip2 来解看看啦!当然啰,也可以使用 bunzip2 这个指令来取代 bzip2 –d 啰
[root @test root]# bzip2 [-dz] filename <==压缩解压缩指令
[root @test root]# bzcat filename.bz2 <==读取压缩档内容指令
参数说明:
-d :解压缩的意思!
-z :压缩的意思!
范例:
同样的,我们以刚刚拷贝过来的 /root/man.config 这个文件为例
[root @test root]# bzip2 –z man.config
[root @test root]# bzcat man.config.bz2
[root @test root]# bzip2 –d man.config.bz2
[root @test root]# bunzip2 man.config.bz2
- tar:
语法:
[root @test /root ]# tar [-zxcvfpP] filename
[root @test /root ]# tar -N 'yyyy/mm/dd' /path -zcvf target.tar.gz source
参数说明:
-z :是否同时具有 gzip 的属性?
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
-c :创建一个压缩文件的参数指令
-v :压缩的过程中显示文件!
-f :使用文件名,请留意,在 f 之后要立即接文件名喔!不要再加参数!
例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成
『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据用户而变)
-P :可以使用绝对路径
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
--exclude FILE:在压缩的过程中,不要将 FILE 打包!
范例:
[root @test /root]# tar -cvf directory.tar directory
只将目录集成打包成一个文件[root @test /root]# tar -zcvf directory.tar.gz directory
除了将目录打包外,同时以 gzip 压缩[root @test /root]# tar -zcvf filename.tar.gz /home/test/*
将 /home/test/ 这个目录下的文件全部打包并压缩成为一个 filename.tar.gz 的文件[root @test /root]# tar -xvf directory.tar
解 tar 的封包,请注意,由于没有 gzip (.tar 而非 .tar.gz) 的作用,所以只要使用 –xvf 即可!不需要加上 z ,否则会显示有问题![root @test /root]# tar -zxvf directory.tar.gz
这个就是有加上 gzip 的压缩的结果!所以需要加上 –z 呦![root @test /root]# tar –ztvf directory.tar.gz
这个 t 可以用来查看 tar 里面的文件信息呢!而不需要将他解开![root @test /root]# tar -zcvPf home.tar.gz /home
则创建起来的压缩档内文件为绝对路径
请注意,使用这个 P 的参数时,不要将 P 加在 f 后面,因为
f 之后要立即接文件名才行喔![root @test /root]# tar -N '2002/06/25' -zcvf home.tar.gz /home
上面是说 在 /home 这个目录中,比 2002/06/25 日还要新的文件才会被打包进入 home.tar.gz 这个文件中![root @test /root]# tar -zcvf host.tar.gz / --exclude /mnt --exclude /proc
上面是说,将根目录的所有数据都打包进 host.tar.gz 这个文件中,但是 /mnt 及 /proc 则不打包![root @test /root]# tar -cvf - /home | tar -xvf -
上面的意思是『将 /home 打包之后,直接解压缩在 /root 底下!』嘿嘿!不需要再创建一次中间文件!不过,使用上面的语法最好使用『绝对路径』,比较不会有问题!这个方式适合不想要创建中间文件时!
- 这是一个多用途的压缩指令!刚刚我们提到的 compress 与 gzip 是可以适用在一个文件的压缩上面,但是如果是要压缩一个目录呢?!这时该如何是好?!呵呵! tar 就派上用场了! tar 可以将整个目录或者是规定的文件都集成成一个文件!例如上面的第三个范例,他可以将 /home/test 底下的文件全部集成成一个文件!而第一个范例中,则是将目录集成成一个文件!同时, tar 可以配合 gzip (这个 gzip 的功能已经已经附加上 tar 里面去了),同时集成并压缩!呵呵!很方便吧!『 tar 用来作备份是很重要的指令! 』而由于 tar 集成过后的文件我们通常会取名为 *.tar ,而如果还含有 gzip 的压缩属性,那么就取名为 *.tar.gz 啰!取这个文件名只是为了方便我们记忆这个文件是什么属性罢了!并没有实际的意义在!
- 另外,需要注意的是,在使用的参数方面,有还有几个有用的参数需要来了解一番,亦即是 -p 与 -P 这两个!如果你曾经在 crontab 里面下达过一些备份的指令时,那么常常会收到 root 的信件,就是说,系统会告诉你『我将 / 的 tar 里头的内容拿掉了!』也就是说,原本你备份的文件是 /home/test ,但是由于担心未来你在解开压缩的时候,会产生一些困扰,因为在 tar 里面的文件如果是具有『绝对路径』的话,那么你解开的文件将会『一定』在该路径下也就是 /home/test,而不是绝对路径(这里请用心的想一想!),这样子的最大困扰是,万一有人拿走了你的这个文件,并且将该文件在他的系统上面解开!万一他的系统上面正巧也有 /home/test 这个目录,哈哈!他的文件就会『正巧』被覆盖了!所以啰,在缺省的情况中,如果是以『绝对路径』来创建打包文件,那么将会自动的将 / 拿掉!这是为了刚刚说明的『安全』为前提所做的默认值。好了!但是你就是要以绝对路径来创建打包的文件!那么就加入 -P 这个参数吧(请注意!是大写字符)!这样就可以啦!那么 -p 是什么(小写字符)?呵呵!那个 -p 是 permission 的意思,也就是『权限』啦!使用 -p 之后,被打包的文件将不会依据用户的身份来改变权限喔!
- 这里还有一个值得注意的参数呦!那就是在备份的情况中很常使用的 -N 的这个参数!你可以参考一下上面的例子就可以知道啦!在这个例子当中,相当重要的就是那个日期啦!在备份的情况当中,我们都希望只要备份较新的文件就好了,为什么呢?因为旧的文件我们已经有备份啰!干嘛还要再备份一次,浪费时间也浪费系统资源!这个时候此一参数就显的相当的重要了啊!
- 在上面的例子中,最后一个例子很有趣『tar cvf - /home | tar -xvf - 』!他是直接以管线命令『 pipe 』来进行压缩、解压缩的过程!在上面的例子中,我们想要『将 /home 底下的数据直接 copy 到目前所在的路径,也就是 /root 底下来』,但是又觉得使用 cp -r 有点麻烦,那么就直接以这个打包的方式来打包,其中,指令里面的 - 就是表示那个被打包的文件啦!由于我们不想要让中间文件存在,所以就以这一个方式来进行拷贝的行为啦!
- tar 的功能相当的多,而由于他是经由『打包』之后再处理的一个过程,所以常常我们会听到 tarball 的文件,那就是经由 tar 打包再压缩的文件啦!此外, tar 也可以用在备份的保存媒体上面,最常见的就是磁带机了!假设我的磁带机代号为 /dev/st0 ,那么我要将我的 /home 底下的数据都给他备份上去时,就是使用 tar /dev/st0 /home 就可以啦!很不错吧!
在 Linux 当中, gzip 已经被集成在 tar 里面了!但是 Sun 或者其他较旧的 Unix 版本中, 当中的 tar 并没有集成 gzip ,所以如果你需要解压缩的话,就需要这么做:
第一个步骤会将文件解压缩,第二个步骤才是将数据解出来!与其他压缩程序不太一样的是, bzip2, gzip 与 compress 在没有加入特殊参数的时候,原先的文件会被取代掉,但是使用 tar 则原来的与后来的文件都会存在呦!
gzip -d testing.tar.gz
tar -xvf testing.tar
- cpio:
语法:这个 cpio 还蛮神奇的呢!他最适用于备份的时候使用的一个指令了!为什么呢?因为他并不像 cp 一样,可以直接的将文件给他 copy 过去,例如 cp * /tmp 就可以将所在目录的所有文件 copy 到 /tmp 底下,在 cpio 这个指令的用法中,由于 cpio 无法直接读取文件,而是需要『每一个文件或目录的路径连同文件名一起』才可以被记录下来!因此, cpio 最常跟 find 这个指令一起使用了!这个 cpio 好像不怎么好用呦!但是,嘿嘿!他可是备份的时候的一项利器呢!因为他可以备份任何的文件,包括 /dev 底下的任何设备文件!呵呵!所以他可是相当重要的呢!!您说是吧! 而由于 cpio 必需要配合其他的程序,例如 find 来创建文件名,所以, cpio 与管线命令及命令重导向的相关性就相当的重要了!上面的例子刚好可以用来复习一下上一章节里面提到的内容!加油啦!
[root @test /root ]# cpio -covB > [file|device]<==备份
[root @test /root ]# cpio -icduv < [file|device]<==还原
参数说明:
-o :将数据 copy 输出到文件或设备上
-i :将数据自文件或设备 copy 出来系统当中
-t :查看 cpio 创建的文件或设备的内容
-c :一种较新的 portable format 方式保存
-v :让保存的过程中文件名称可以在屏幕上显示
-B :让缺省的 Blocks 可以增加至 5120 bytes ,缺省是 512 bytes !
这样的好处是可以让大文件的保存速度加快(请参考 i-nodes 的观念)
-d :自动创建目录!由于 cpio 的内容可能不是在同一个目录内,
如此的话在反备份的过程会有问题! 这个时候加上 -d 的话,
就可以自动的将需要的目录创建起来了!
-u :自动的将较新的文件覆盖较旧的文件!
范例:
[root @test /root]# find / -print | cpio -covB > /dev/st0
将搜索到的文件存到磁带机[root @test /root]# cpio -icduv < /dev/st0
将磁带机的数据还原回来![root @test /root]# cpio -icdvt < /dev/st0 > /tmp/content
将磁带机的内容(文件名而已)转存到 /tmp/content[root @test /root]# find / -type -f | cpio -o > /tmp/root.cpio
[root @test /root]# cpio -i < /tmp/root.cpio
上面这个例子可以马上实作看看!先输出到 /tmp/root.cpio 这个文件,然后再给他还原回来!
- 备份:在备份的用法当中,他可以直接跟输出到文件或者是设备当中,但是如前面说过的,你必须要配合 find 这个指令较好呦!那个 -o 表示将文件或目录输出到右边去的意思!还记得命令重导向吗?对啦!就是那个东西啰!在上面的例子中,我们将备份的数据给他 copy 到磁带机里头去!那个磁带机的设备代号就是 /dev/st0 啰!
- 还原:那么如何给他反过来解开呢?呵呵!可以直接给他下达 cpio -i 就是 input 就对啦!例如上头的例子啰!这个指令可以多看看呢