linux 学习之九、Linux 磁盘与文件系统管理(3)

时间:2021-09-05 19:27:52

原文地址:http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem.php#filesys


创建大文件以制作 loop 装置文件!(练习非常有用)



想一想,既然能够挂载 DVD 的映象档,那么我能不能制作出一个大文件,然后将这个文件格式化后挂载呢? 好问题!这是个有趣的动作!
而且还能够帮助我们解决很多系统的分割不良的情况呢!举例来说,如果当初在分割时, 你只有分割出一个根目录,假设你已经没有多余的容量可以进行额外的分割的!
偏偏根目录的容量还很大! 此时你就能够制作出一个大文件,然后将这个文件挂载!如此一来感觉上你就多了一个分割槽啰! 用途非常的广泛啦!


底下我们在 /home 下创建一个 512MB 左右的大文件,然后将这个大文件格式化并且实际挂载来玩一玩! 


创建大型文件


[root@www ~]# dd if=/dev/zero of=/home/loopdev bs=1M count=512
512+0 records in   <==读入 512 笔数据
512+0 records out  <==输出 512 笔数据
536870912 bytes (537 MB) copied, 12.3484 seconds, 43.5 MB/s
# 这个命令的简单意义如下:
# if 是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的装置!
# of 是 output file ,将一堆零写入到后面接的文件中。
# bs 是每个 block 大小,就像文件系统那样的 block 意义;
# count 则是总共几个 bs 的意思。


[root@www ~]# ll -h /home/loopdev
-rw-r--r-- 1 root root 512M Oct 28 02:29 /home/loopdev


dd 就好像在迭砖块一样,将 512 块,每块 1MB 的砖块堆栈成为一个大文件 (/home/loopdev) ! 最终就会出现一个 512MB 的文件!粉简单吧!


格式化


很简单就创建起一个 512MB 的文件了吶!接下来当然是格式化啰!
[root@www ~]# mkfs -t ext3 /home/loopdev


挂载
[root@www ~]# mount -o loop /home/loopdev /media/cdrom/


挂载成功以后,我们就可以在 /media/cdrom/ 目录下创建文件、目录了。
他类似于一个容器,将一些文件包括在其中




内存置换空间(swap)之建置
swap 的功能就是在应付物理内存不足的情况下所造成的内存延伸记录的功能。
一般来说,如果硬件的配备足够的话,那么 swap 应该不会被我们的系统所使用到, swap 会被利用到的时刻通常就是物理内存不足的情况了
那当内存不足的时候,为了让后续的程序可以顺利的运行,因此在内存中暂不使用的程序与数据就会被挪到 swap 中了。 
此时内存就会空出来给需要运行的程序加载。由于 swap 是用硬盘来暂时放置内存中的信息, 所以用到 swap 时,你的主机硬盘灯就会开始闪个不停啊!




使用实体分割槽建置swap
创建 swap 分割槽的方式也是非常的简单的!透过底下几个步骤就搞定啰:


分割:先使用 fdisk 在你的磁盘中分割出一个分割槽给系统作为 swap 。由于 Linux 的 fdisk 默认会将分割槽的 ID 配置为 Linux 的文件系统,
所以你可能还得要配置一下 system ID 就是了。
格式化:利用创建 swap 格式的『mkswap 装置文件名』就能够格式化该分割槽成为 swap 格式啰
使用:最后将该 swap 装置启动,方法为:『swapon 装置文件名』。
观察:最终透过 free 这个命令来观察一下内存的用量吧!


1. 先进行分割的行为啰!
[root@www ~]# fdisk /dev/hdc
Command (m for help): n
First cylinder (2303-5005, default 2303):  <==这里按[enter]
Using default value 2303
Last cylinder or +size or +sizeM or +sizeK (2303-5005, default 5005): +256M


Command (m for help): p


   Device Boot      Start         End      Blocks   Id  System
.....中间省略.....
/dev/hdc6            2053        2302     2008093+  83  Linux
/dev/hdc7            2303        2334      257008+  83  Linux <==新增的项目


Command (m for help): t             <==修改系统 ID
Partition number (1-7): 7           <==从上结果看到的,七号partition
Hex code (type L to list codes): 82 <==改成 swap 的 ID
Changed system type of partition 7 to 82 (Linux swap / Solaris)


Command (m for help): p


   Device Boot      Start         End      Blocks   Id  System
.....中间省略.....
/dev/hdc6            2053        2302     2008093+  83  Linux
/dev/hdc7            2303        2334      257008+  82  Linux swap / Solaris


Command (m for help): w
# 此时就将 partition table 升级了!


[root@www ~]# partprobe
# 这个玩意儿很重要的啦!不要忘记让核心升级 partition table 喔!






2. 开始建置 swap 格式
[root@www ~]# mkswap /dev/hdc7
Setting up swapspace version 1, size = 263172 kB  <==非常快速!




3. 开始观察与加载看看吧!
[root@www ~]# free
             total       used       free     shared    buffers     cached
Mem:        742664     684592      58072          0      43820     497144
-/+ buffers/cache:     143628     599036
Swap:      1020088         96    1019992
# 我有 742664K 的物理内存,使用 684592K 剩余 58072K ,使用掉的内存有
# 43820K / 497144K 用在缓冲/缓存的用途中。
# 至于 swap 已经存在了 1020088K 啰!这样会看了吧?!


[root@www ~]# swapon /dev/hdc7
[root@www ~]# free
             total       used       free     shared    buffers     cached
Mem:        742664     684712      57952          0      43872     497180
-/+ buffers/cache:     143660     599004
Swap:      1277088         96    1276992  <==有添加啰!看到否?


[root@www ~]# swapon -s
Filename                 Type            Size    Used    Priority
/dev/hdc5                partition       1020088 96      -1
/dev/hdc7                partition       257000  0       -2
# 上面列出目前使用的 swap 装置有哪些的意思!




使用文件建置swap
如果是在实体分割槽无法支持的环境下,此时前一小节提到的 loop 装置建置方法就派的上用场啦! 与实体分割槽不一样的只是利用 dd 去建置一个大文件而已。
多说无益,我们就再透过文件建置的方法创建一个 128 MB 的内存置换空间吧!




1. 使用 dd 这个命令来新增一个 128MB 的文件在 /tmp 底下:
[root@www ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128
128+0 records in
128+0 records out
134217728 bytes (134 MB) copied, 1.7066 seconds, 78.6 MB/s


[root@www ~]# ll -h /tmp/swap
-rw-r--r-- 1 root root 128M Oct 28 15:33 /tmp/swap






2. 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 的文件格式:
[root@www ~]# mkswap /tmp/swap
Setting up swapspace version 1, size = 134213 kB
# 这个命令下达时请『特别小心』,因为下错字节控制,将可能使您的文件系统挂掉!




3. 使用 swapon 来将 /tmp/swap 启动啰!
[root@www ~]# free
             total       used       free     shared    buffers     cached
Mem:        742664     450860     291804          0      45584     261284
-/+ buffers/cache:     143992     598672
Swap:      1277088         96    1276992


[root@www ~]# swapon /tmp/swap
[root@www ~]# free
             total       used       free     shared    buffers     cached
Mem:        742664     450860     291804          0      45604     261284
-/+ buffers/cache:     143972     598692
Swap:      1408152         96    1408056


[root@www ~]# swapon -s
Filename                 Type            Size    Used    Priority
/dev/hdc5                partition       1020088 96      -1
/dev/hdc7                partition       257000  0       -2
/tmp/swap                file            131064  0       -3




4. 使用 swapoff 关掉 swap file
[root@www ~]# swapoff /tmp/swap
[root@www ~]# swapoff /dev/hdc7
[root@www ~]# free
             total       used       free     shared    buffers     cached
Mem:        742664     450860     291804          0      45660     261284
-/+ buffers/cache:     143916     598748
Swap:      1020088         96    1019992  <==回复成最原始的样子了!




磁盘空间之浪费问题


[root@www ~]# ll -s
total 104
第一行都会出现一个『total』的字样,是该目录下的所有数据所耗用的实际 block 数量 * block 大小的值。 我们可以透过 ll -s 来观察


如果想要查询某个目录所耗用的所有容量时,那就使用 du 
例:
[root@www ~]# du -sb /etc
108360494       /etc   <==单位是 bytes 喔!


[root@www ~]# du -sm /etc
118     /etc           <==单位是 Mbytes 喔!




--------------------
利用 GNU 的 parted 进行分割行为


 fdisk 却无法支持到高于 2TB 以上的分割槽,此时就得需要 parted 来处理了
 
[root@www ~]# parted [装置] [命令 [参数]]
选项与参数:
命令功能:
新增分割:mkpart [primary|logical|extended] [ext3|vfat] 开始 结束
分割表  :print
删除分割:rm [partition]


范例一:以 parted 列出目前本机的分割表数据
[root@www ~]# parted /dev/hdc print
Model: IC35L040AVER07-0 (ide)              <==硬盘接口与型号
Disk /dev/hdc: 41.2GB                      <==磁盘文件名与容量
Sector size (logical/physical): 512B/512B  <==每个扇区的大小
Partition Table: msdos                     <==分割表形式


Number  Start   End     Size    Type      File system  Flags
 1      32.3kB  107MB   107MB   primary   ext3         boot
 
 上面是最简单的 parted 命令功能简介,你可以使用『 man parted 』,或者是『 parted /dev/hdc help mkpart 』去查询更详细的数据。
 比较有趣的地方在于分割表的输出。我们将上述的分割表示意拆成六部分来说明:


Number:这个就是分割槽的号码啦!举例来说,1号代表的是 /dev/hdc1 的意思;
Start:起始的磁柱位置在这颗磁盘的多少 MB 处?有趣吧!他以容量作为单位喔!
End:结束的磁柱位置在这颗磁盘的多少 MB 处?
Size:由上述两者的分析,得到这个分割槽有多少容量;
Type:就是分割槽的类型,有primary, extended, logical等类型;
File system:就如同 fdisk 的 System ID 之意。




范例二:创建一个约为 512MB 容量的逻辑分割槽
[root@www ~]# parted /dev/hdc mkpart logical ext3 19.2GB 19.7GB
# 请参考前一表格的命令介绍,因为我们的 /dev/hdc7 在 19.2GB  位置结束,
# 所以我们当然要由 19.2GB 位置处继续下一个分割,这样懂了吧?
[root@www ~]# parted /dev/hdc print
.....前面省略.....
 7      18.9GB  19.2GB  263MB   logical   linux-swap
 8      19.2GB  19.7GB  502MB   logical  <==就是刚刚创建的啦!
 
 
范例三:将刚刚创建的第八号磁盘分区槽删除掉吧!
[root@www ~]# parted /dev/hdc rm 8
# 这样就删除了!实在很厉害!所以这个命令的下达要特别注意!
# 因为...命令一下去就立即生效了~如果写错的话,会哭死~