Chinaunix首页 | 论坛 | 博客
  • 博客访问: 862370
  • 博文数量: 179
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1546
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-27 11:05
个人简介

MySQL工程师 QQ:1815357042

文章分类

全部博文(179)

文章存档

2015年(179)

分类: LINUX

2015-02-08 22:40:46



简单文件系统操作
1.查看磁盘和目录的容量


使用df命令查看磁盘的容量
CentOS
  1. [root@localhost ~]# df
  2. Filesystem 1K-blocks Used Available Use% Mounted on
  3. /dev/mapper/VolGroup-lv_root
  4.                       18102140 2007868 15174720 12% /
  5. tmpfs 508256 0 508256 0% /dev/shm
  6. /dev/sda1 495844 33447 436797 8% /boot
Ubuntu

"rootfs" : (Root File System)它是Ramfs(Ramfs是一个非常简单的Linux文件系统用于实现磁盘缓存机制作为动态可调整大小的
基于ram的文件系统)或者tmpfs的一个特殊实例,它作为系统启动时内核载入内存之后,在挂载真正的的磁盘之前的一个临时文件系统。
通常的主机会在系统启动后用磁盘上的文件系统替换,只是在一些嵌入式系统中会只存在一个rootfs,
或者像我们目前遇到的情况运行在虚拟环境中共享主机资源的系统也可能会采用这种方式


我主机上的/dev/sda2是对应着我主机硬盘的分区,后面的数字表示分区号,数字前面的字母a表示第几块硬盘(也可能是你的可移动磁盘),
如果主机上有多块硬盘则可能还会出现/dev/sdb,/dev/sdc,这些磁盘设备都会在/dev目录下以文件的形式存在。


接着你还会看到"1k-blocks"这个陌生的东西,它表示以磁盘块大小的方式显示容量,后面为相应的以块大小表示的已用和可用容量
  1. [root@localhost ~]# df -h
  2. Filesystem Size Used Avail Use% Mounted on
  3. /dev/mapper/VolGroup-lv_root
  4.                        18G 2.0G 15G 12% /
  5. tmpfs 497M 0 497M 0% /dev/shm
  6. /dev/sda1 485M 33M 427M 8% /boot
现在你就可以使用命令查看你主机磁盘的使用情况了。


使用du命令查看目录或文件的容量

# 默认同样以blocks的大小展示
  1. [root@localhost ~]# du
  2. 4 ./root/father/son
  3. 8 ./root/father
  4. 4 ./root/tardir/root/father/son
  5. 8 ./root/tardir/root/father
  6. 20 ./root/tardir/root/.gnupg
  7. 156 ./root/tardir/root
  8. 160 ./root/tardir
  9. 20 ./root/.gnupg
  10. 428 ./root
  11. 4 ./father/son
  12. 8 ./father
  13. 4 ./tardir/root/father/son
  14. 8 ./tardir/root/father
  15. 20 ./tardir/root/.gnupg
  16. 156 ./tardir/root
  17. 160 ./tardir
  18. 20 ./.gnupg
  19. 972 .

# 加上`-h`参数,以更易读的方式展示
  1. [root@localhost ~]# du -h
  2. 4.0K ./root/father/son
  3. 8.0K ./root/father
  4. 4.0K ./root/tardir/root/father/son
  5. 8.0K ./root/tardir/root/father
  6. 20K ./root/tardir/root/.gnupg
  7. 156K ./root/tardir/root
  8. 160K ./root/tardir
  9. 20K ./root/.gnupg
  10. 428K ./root
  11. 4.0K ./father/son
  12. 8.0K ./father
  13. 4.0K ./tardir/root/father/son
  14. 8.0K ./tardir/root/father
  15. 20K ./tardir/root/.gnupg
  16. 156K ./tardir/root
  17. 160K ./tardir
  18. 20K ./.gnupg
  19. 972K .


du(estimate file space usage)命令
df(report file system disk space usage)
只用一字只差,首先就希望注意不要弄混淆了,也可以像我这样从man手册中获取命令的完整描述,记全称就不会搞混了。



简单的磁盘管理
下面涉及的命令具有一定的危险性,操作不当可能会丢失你的个人数据,初学者建议在虚拟环境中进行操作,
千万不要直接拿自己的主机开刀!


通常情况下,这里应该直接将如何挂载卸载磁盘如何格式化磁盘如何分区,但如你所见,我们的环境中没东西给你挂,
也没东西给你格和分,所以首先我们会先创建一个虚拟磁盘来进行后续的操作


1.创建虚拟磁盘
dd命令简介(部分说明来自dd (Unix) wiki))
dd命令用于转换和复制文件,不过它的复制不同于cp。之前提到过关于Linux的很重要的一点,一切即文件,在linux上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero和/dev/random)都像普通文件一样,只要在各自的驱动程序中实现了对应的功能,
dd也可以读取自和/或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。
dd程序也可以在复制时处理数据,例如转换字节序、或在ASCII与EBCDIC编码间互换。


dd的命令行语句与其他的Linux程序不同,因为它的命令行选项格式为选项=值,而不是更标准的--选项=值或-选项=值。
dd默认从标准输入中读取,并写入到标准输出中,但可以用选项if(input file,输入文件)和of(output file,输出文件)改变。


我们先来试试用dd命令从标准输入读入用户输入到标准输出或者一个文件
  1. dd if=/dev/stdin of=/dev/stdout bs=10 count=1
上述命令从标准输入设备读入用户输入(缺省值,所以可省略)然后输出到test文件,bs(block size)
用于指定块大小(缺省单位为Byte,也可为其指定如'K','M','G'等单位),count用于指定块数量。
如上图所示,我指定只读取总共10个字节的数据,当我输入了“hello shiyanlou”之后加上空格回车总共16个字节(一个英文字符占一个字节)内容,显然超过了设定大小。使用和du和cat命令看到的写入完成文件实际内容确实只有10个字节(那个黑底百分号表示这里没有换行符),
而其他的多余输入将被截取并保留在标准输入。


前面说到dd在拷贝的同时还可以实现数据转换,那下面就举一个简单的例子:将输出的英文字符转换为大写再写入文件
dd if=/dev/stdin of=test bs=10 count=1 conv=ucase
你可以在man文档中查看其他所有转换参数


使用dd命令创建虚拟镜像文件
下面就来使用dd命令来完成创建虚拟磁盘的第一步


在/dev/zero设备上创建一个容量为128M的空文件
  1. [root@localhost ~]# dd if=/dev/zero of=virtual.img bs=1M count=128
  2. 128+0 records in
  3. 128+0 records out
  4. 134217728 bytes (134 MB) copied, 2.77478 s, 48.4 MB/s

  1. [root@localhost ~]# du -h
  2. 4.0K ./root/father/son
  3. 8.0K ./root/father
  4. 4.0K ./root/tardir/root/father/son
  5. 8.0K ./root/tardir/root/father
  6. 20K ./root/tardir/root/.gnupg
  7. 156K ./root/tardir/root
  8. 160K ./root/tardir
  9. 20K ./root/.gnupg
  10. 428K ./root
  11. 4.0K ./father/son
  12. 8.0K ./father
  13. 4.0K ./tardir/root/father/son
  14. 8.0K ./tardir/root/father
  15. 20K ./tardir/root/.gnupg
  16. 156K ./tardir/root
  17. 160K ./tardir
  18. 20K ./.gnupg
  19. 129M .
  1. [root@localhost ~]# du -h virtual.img
  2. 128M virtual.img


然后我们要将这个文件格式化(写入文件系统),这里我们要学到一个(准确的说是一组)新的命令来完成这个需求

使用mkfs命令格式化磁盘(我们这里是自己创建的虚拟磁盘镜像)
你可以在命令行输入mkfs然后按下Tab键,你可以看到很多个以mkfs为前缀的命令,这些不同的后缀其实就是表示着不同的文件系统,
可以用mkfs格式化的文件系统

  1. [root@localhost ~]# mkfs
  2. mkfs mkfs.ext2 mkfs.ext4 mkfs.msdos
  3. mkfs.cramfs mkfs.ext3 mkfs.ext4dev mkfs.vfat

我们可以简单的使用下面的命令来将我们的虚拟磁盘镜像格式化为ext4文件系统
  1. [root@localhost ~]# mkfs.ext4 virtual.img
  2. mke2fs 1.41.12 (17-May-2010)
  3. virtual.img is not a block special device.
  4. Proceed anyway? (y,n) y
  5. Filesystem label=
  6. OS type: Linux
  7. Block size=1024 (log=0)
  8. Fragment size=1024 (log=0)
  9. Stride=0 blocks, Stripe width=0 blocks
  10. 32768 inodes, 131072 blocks
  11. 6553 blocks (5.00%) reserved for the super user
  12. First data block=1
  13. Maximum filesystem blocks=67371008
  14. 16 block groups
  15. 8192 blocks per group, 8192 fragments per group
  16. 2048 inodes per group
  17. Superblock backups stored on blocks:
  18.         8193, 24577, 40961, 57345, 73729

  19. Writing inode tables: done
  20. Creating journal (4096 blocks): done
  21. Writing superblocks and filesystem accounting information: done

  22. This filesystem will be automatically checked every 37 mounts or
  23. 180 days, whichever comes first. Use tune2fs -c or -i to override.
可以看到实际mkfs.ext4是使用mke2fs来完成格式化工作的。mke2fs的参数很多,不过我们也不会经常格式化磁盘来玩



更多关于文件系统的知识,请查看wiki文件系统,ext3,ext4。如果你想想知道linux支持哪些文件系统你可以输入
ls -l /lib/modules/$(uname -r)/kernel/fs查看。
  1. [root@localhost ~]# ls -l /lib/modules/$(uname -r)/kernel/fs
  2. total 132
  3. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 autofs4
  4. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 btrfs
  5. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 cachefiles
  6. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 cifs
  7. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 configfs
  8. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 cramfs
  9. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 dlm
  10. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 ecryptfs
  11. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 exportfs
  12. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 ext2
  13. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 ext3
  14. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 ext4
  15. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 fat
  16. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 fscache
  17. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 fuse
  18. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 gfs2
  19. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 jbd
  20. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 jbd2
  21. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 jffs2
  22. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 lockd
  23. -rwxr--r--. 1 root root 19920 Feb 22 2013 mbcache.ko
  24. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 nfs
  25. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 nfs_common
  26. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 nfsd
  27. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 nls
  28. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 squashfs
  29. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 ubifs
  30. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 udf
  31. drwxr-xr-x. 2 root root 4096 Jan 26 19:13 xfs



使用mount命令挂载磁盘到目录树
用户在Linux/Unix的机器上打开一个文件以前,包含该文件的文件系统必须先进行挂载的动作,
此时用户要对该文件系统执行mount的指令以进行挂载。通常是使用在USB或其他可移除存储设备上,而根目录则需要始终保持挂载的状态。又因为Linux/Unix文件系统可以对应一个文件而不一定要是硬件设备,所以可以挂载一个包含文件系统的文件到目录树。


Linux/Unix命令行的mount指令是告诉操作系统,对应的文件系统已经准备好,可以使用了,而该文件系统会对应到一个特定的点
(称为挂载点)。挂载好的文件、目录、设备以及特殊文件即可提供用户使用。


我们先来使用mount来查看下主机已经挂载的文件系统
  1. [root@localhost ~]# sudo mount
  2. /dev/mapper/VolGroup-lv_root on / type ext4 (rw)
  3. proc on /proc type proc (rw)
  4. sysfs on /sys type sysfs (rw)
  5. devpts on /dev/pts type devpts (rw,gid=5,mode=620)
  6. tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
  7. /dev/sda1 on /boot type ext4 (rw)
  8. none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
  9. sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
输出的结果中每一行表示一个设备或虚拟设备,每一行最前面是设备名,然后是on 后面是挂载点type后面表示文件系统类型
再后面是挂载选项(比如可以在挂载时设定以只读方式挂载等等)


那么我们如何挂载真正的磁盘到目录树呢,mount命令的一般格式如下:
mount [options] [source] [directory]
一些常用操作
mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
我们现在直接来挂载我们创建的虚拟磁盘镜像到/mnt目录


  1. [root@localhost ~]# mount -o loop -t ext4 virtual.img /mnt
# 也可以省略挂载类型,很多时候mount会自动识别


# 以只读方式挂载
  1. [root@localhost ~]# mount -o loop --ro virtual.img /mnt
  2. mount: according to mtab /root/virtual.img is already mounted on /mnt as loop


使用umount命令卸载已挂载磁盘
# 命令格式 sudo umount 已挂载设备名或者挂载点,如:
  1. [root@localhost ~]# sudo umount /mnt
不过灰常遗憾的是,由于我们环境的问题(环境中使用的Linux内核在编译时没有添加对Loop device的支持),所以你将无法挂载成功


另外关于loop设备,你可能会有诸多疑问,那么请看下面来自wiki百科/dev/loop的说明:
在类Unix系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,
接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统
那么这个文件就能如同磁盘设备一般被挂载这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件
便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。
如果挂载目录中本身有文件,这些文件在挂载后将被禁止使用!!!!!!!


使用fdisk为磁盘分区(关于分区的一些概念不清楚的用户请参看主引导记录)
# 查看硬盘分区表信息
  1. [root@localhost ~]# sudo fdisk -l

  2. Disk /dev/sda: 21.5 GB, 21474836480 bytes
  3. 255 heads, 63 sectors/track, 2610 cylinders
  4. Units = cylinders of 16065 * 512 = 8225280 bytes
  5. Sector size (logical/physical): 512 bytes / 512 bytes
  6. I/O size (minimum/optimal): 512 bytes / 512 bytes
  7. Disk identifier: 0x0009a3b5

  8.    Device Boot Start End Blocks Id System
  9. /dev/sda1 * 1 64 512000 83 Linux
  10. Partition 1 does not end on cylinder boundary.
  11. /dev/sda2 64 2611 20458496 8e Linux LVM

  12. Disk /dev/mapper/VolGroup-lv_root: 18.8 GB, 18832424960 bytes
  13. 255 heads, 63 sectors/track, 2289 cylinders
  14. Units = cylinders of 16065 * 512 = 8225280 bytes
  15. Sector size (logical/physical): 512 bytes / 512 bytes
  16. I/O size (minimum/optimal): 512 bytes / 512 bytes
  17. Disk identifier: 0x00000000


  18. Disk /dev/mapper/VolGroup-lv_swap: 2113 MB, 2113929216 bytes
  19. 255 heads, 63 sectors/track, 257 cylinders
  20. Units = cylinders of 16065 * 512 = 8225280 bytes
  21. Sector size (logical/physical): 512 bytes / 512 bytes
  22. I/O size (minimum/optimal): 512 bytes / 512 bytes
  23. Disk identifier: 0x00000000

输出结果中开头显示了我主机上的磁盘的一些信息,包括容量,扇区数,扇区大小,I/O大小等信息


看一下中间的分区信息
/dev/sda1,/dev/sda2为主分区分别安装了windows和linux操作系统
/dev/sda3为交换分区(可以理解为虚拟内存)
/dev/sda4为扩展分区其中包含/dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8四个逻辑分区
因为我的主机上有几个分区之间有空隙,没有对齐边界扇区,所以分区之间的不是完全连续的


# 进入磁盘分区模式
  1. [root@localhost ~]# sudo fdisk virtual.img
  2. Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
  3. Building a new DOS disklabel with disk identifier 0x55b59790.
  4. Changes will remain in memory only, until you decide to write them.
  5. After that, of course, the previous content won't be recoverable.

  6. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
  7. You must set cylinders.
  8. You can do this from the extra functions menu.

  9. WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
  10.          switch off the mode (command 'c') and change display units to
  11.          sectors (command 'u').

在进行操作前我们首先应先规划好我们的分区方案,这里我将在使用128M(可用127M左右)的虚拟磁盘镜像创建一个30M的主分区剩余部分为扩展分区包含2个大约45M的逻辑分区


操作完成后输入p查看结果如下:
最后不要忘记输入w写入分区表


使用losetup命令建立镜像与回环设备的关联
  1. [root@localhost ~]# sudo losetup /dev/loop0 virtual.img
# 如果提示设备忙你也可以使用其它的回环设备,"ls /dev/loop*"参看所有回环设备
  1. [root@localhost ~]# ls /dev/loop
  2. ls: cannot access /dev/loop: No such file or directory



# 解除设备关联
$ sudo losetup -d /dev/loop0
然后再使用mkfs格式化各分区(前面我们是格式化整个虚拟磁盘镜像文件或磁盘),不过格式化之前,我们还要为各分区建立虚拟设备的映射
用到kpartx工具,需要先安装

$ sudo apt-get install kpartx
$ sudo kpart kpartx -av /dev/loop0

# 取消映射
$ sudo kpart kpartx -dv /dev/loop0

接着再是格式化,我们将其全部格式化为ext4


$ sudo mkfs.ext4 -q /dev/mapper/loop0p1
$ sudo mkfs.ext4 -q /dev/mapper/loop0p5
$ sudo mkfs.ext4 -q /dev/mapper/loop0p6
格式化完成后在/media目录下新建四个空目录用于挂载虚拟磁盘


$ mkdir -p /media/virtualdisk_{1..3}
# 挂载磁盘分区
$ sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1
$ sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2
$ sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3


# 卸载磁盘分区
$ sudo umount /dev/mapper/loop0p1
$ sudo umount /dev/mapper/loop0p5
$ sudo umount /dev/mapper/loop0p6

然后
$ df -h
阅读(1875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~