总结了好久,作为新手这是最基础也是最重要的东西,牢记于心的同时也跟大家分享一下。人总是在不断的失败不断的错误之后,才学会成功学会真相的。
第一章:认识储存设备
在文件系统中添加新的文件系统哪第一步就是你的存储设备必须被系统认识呀,不然就木有用。通常是 /dev/sda 或者 /dev/hda,ssd不知到是怎么表示没有用过!不过都是一样的。找到它很容易。(*^__^*) 。
1.2.1分类:固态硬盘SSD采用闪存颗粒来存储,HDD采用磁性碟片存储。
1.3.1接口:IDE,SATA, SCSI(开始不是为了做接口的,光纤通道FC) SAS(基于SATA 和SCSI)。
1.4.1厂商:西部数据,希捷,东芝(三星和日立分别被希捷跟西部收购)。
第二章:使用硬盘
2.1.1 磁盘的3D参数(DISK geometry)
使用硬盘的时候,我们应该来了解一下硬盘是如何定义数据块的。使用了3D参数:
   heads磁头数(特指盘片数,最大255);
   cylinders柱面数(每个盘片有几条磁道,最大1023);
   sectors扇区(每个磁道上有几个扇区,最大63) ,每个扇区是512字节。
   块大小:255x1023x63x512/1024x1024=7.837M.//一般的都是这样算。
2.2.1分区,分区表
      
分区就是把磁盘按需分割成几个不同的区域,可以完全把一个磁盘分成一个大区。然后这些区域的边界信息就存在分区表里头,表里头记录的就是类似从0-100块的是分区一,101-200块的是分区二这样的信息。所以分区表肯定要放在磁盘里,而且要最新被BIOS读到,否则硬盘那么大BIOS去那里找系统分区啊。那么肯定就是磁盘的第一磁道第一个扇区咯。
       这就是传说中的
MBR:512=446+64+2(字节)
分配情况:
  (
446)loader程序:grub(可load多种类型的系统,每次有且只有一个系统被引导),wins的loader程序只识别自己。所以建议:先装wins再装linux这样grub就覆盖在446上,可以简单实现双系统。
  (
64)分区表(记录分区开始跟结束)
  (
2) 结束标记
2.2.2如何分区
  分区的话,可以有很多的方式,先入门讲一下基础的分区方式。或者通俗点就是说:直接分区,就是在物理磁盘上进行直接分割。那肯定有间接分区:就是raid ,lvm 着两个都有基于物理磁盘的逻辑层,靠这个逻辑层与物理磁盘通信。
    分区按下面四个规则:
     1:每个分区都有对应一个设备号;
     2:一个磁盘只能有四个主分区 16x4=64;
    (linux分区限定)
     3:scsi磁盘可以分最多15个分区;/dev/sdaX
  | P1 | P2 | P3 | E4 | L5 | L6 | L7 | L8 | L9 | L10 | L11 | L12 | L13 | L14 | L15 |
     4:IDE可以最多分63个分区;/dev/hdaX
   分区实验:
linux下用fdisk进行分区操作。常用的选项有:
   d   删除一个分区
   l   列出分区类型
   m   打印帮助菜单
   n   添加新分区(p是主分区,e是扩展分区)
   p   打印初分区表
   q   退出,不保存操作。
   t   更改分区id
   w   保存操作,并退出。
#####################################
# fdisk /dev/sdc //为了增强可读性,只列列出了重要的步骤,跟输入。
Command (m for help): p
Disk /dev/sdc: 8021 MB, 8021606400 bytes
247 heads, 62 sectors/track, 1023 cylinders
Units = cylinders of 15314 * 512 = 7840768 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x636b1734
   Device Boot      Start         End      Blocks   Id  System
##没有分区表,我们手动建立。
Command (m for help): n
//新建分区
Command action
   e   extended 
//按e,表示建扩展分区
   p   primary partition (1-4)
//p表示主分区
p
Partition number (1-4): 1 
//分区号,从一开始
First cylinder (1-1023, default 1): //总共有1023个块,每块7.84M,总大小=1023x7.84=8020M跟上面一样。
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1023, default 1023): +2G
//可以用指定分区大小的方式。+size{K,M,G}
Command (m for help): p 
//查看一下分好的区
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         275     2105644   83  Linux
Command (m for help): n
//继续重复上面的步骤哦。
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (276-1023, default 276):
Using default value 276
Last cylinder, +cylinders or +size{K,M,G} (276-1023, default 1023): +2G
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (551-1023, default 551):
Using default value 551
Last cylinder, +cylinders or +size{K,M,G} (551-1023, default 1023): +2G
Command (m for help): p
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         275     2105644   83  Linux
/dev/sdc2             276         550     2105675   83  Linux
/dev/sdc3             551         825     2105675   83  Linux
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Selected partition 4
First cylinder (826-1023, default 826):
Using default value 826
Last cylinder, +cylinders or +size{K,M,G} (826-1023, default 1023): +2G
Value out of range.
Last cylinder, +cylinders or +size{K,M,G} (826-1023, default 1023):
Using default value 1023 
//因为空间不够了,所以提示了!我只有1023不能提供到2G。嘿嘿
Command (m for help): p       
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         275     2105644   83  Linux
/dev/sdc2             276         550     2105675   83  Linux
/dev/sdc3             551         825     2105675   83  Linux
/dev/sdc4             826        1023     1516086   83  Linux
Command (m for help): w  (
保存退出时一定再看一下分区表,确定没有差错之后在保存否则后果很严重滴!
######################################
经过漫长的步骤之后,我是把U盘,分成了四个区域,1-275,276-550,551-825,826-1023.
注意:
分区完之后最好用partprobe 重新设置内存中的内核分区表版本。因为fdisk编辑的是分区表的副本,要更新到新的内核中要partprobe.
现在有问题了,这时候u盘插到电脑去能用么?或者说你能把他们都mount上去么?
第三章:文件系统
   通过第二章,分区完之后,就确定区域了。那是不是说我就能往你丢东西了,那要怎么丢,放进去的东西要怎么分类摆放呢,乱放的放肯定不能完全利用好磁盘,而且要找出来用怎么找,一大堆乱,那么我们就要规定一下文件的组织方式了,数据该如何摆放,如何取出来。所以就要文件系统来做这个事情。
3.1.1 常见的文件系统
Linux :ext(2,3,4),xfs,vfat(兼容fat32);
windows : ntfs,fat,fat32,msdos;
光盘  :iso9660 ;
SNA   :gfs,gfs2等。
3.2.1 如何创建文件系统。
linux命令:(make filesystem)
mkfs          mkfs.ext2     mkfs.ext4dev  mkfs.ntfs     
mkfs.btrfs    mkfs.ext3     mkfs.gfs2     mkfs.vfat     
mkfs.cramfs   mkfs.ext4     mkfs.msdos    mkfs.xfs
 使用说明:找对应的文件系统哦,亲!
  实验: 我想/dev/sdc1格式化成ext3文件系统。
################################
[root@studnet20 ~]#mkfs.ext3 /dev/sdc1
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131648 inodes, 526411 blocks
26320 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912
正在写入inode表: 完成                            
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
####################################
/
/这个不是报错,它是想然你禁用掉强制的文件系统检验。如果没做下面几步的话,你可能妹挂载29次或者180天后,就自检了。
#####################################
[root@studnet20 ~]# tune2fs -c0 -i0 /dev/sdc1
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds
#####################################
这样/dev/sdc1就可以用咯,那问题又出现了,我们怎么使用文件系统呀?你怎么就知道用mount呀?
安慰自己的一个理由:
linux文件系统是一个很大的文件系统树来支撑的,一旦需要用的时候,那些文件系统都是放置或者挂在树枝上的,那些树小小枝就是挂载点咯。不用的时候就把它再卸下来,这有点想多功能衣架的感觉:要凉衣服了,找个空的夹子挂上去,等干了在卸下来,换上没有的。好了,还是来个实验吧。
####################################
[root@studnet20 ~]#mount /dev/sdc1 /mnt2 
//把/sdc1挂载到,mnt2下面就可以用咯。
[root@studnet20 ~]# cd /mnt2
[root@studnet20 mnt2]# df -T /dev/sdc1    
//不信的话你看。
文件系统       类型         1K-块      已用      可用   已用%  挂载点
/dev/sdc1     ext3       2072548     68700   1898568   4%   /mnt2
####################################
好了现在大家有没有注意到上面那个文件系统标签,是为空值,有什么用呢?
文件标签其实就是这个文件系统的名字,小名。
方法定义:提供不依赖于特殊设备文件而能将设备挂载到文件系统的方法;挺抽象的不过看下的实验:
#####################################
[root@studnet20 ~]# e2label kiku /dev/sdc1
//创建标签,给他取了个名字叫kiku。
[root@studnet20 mnt2]# mount LABEL=kiku /mnt2 //来kiku,给哥先用一下。
[root@studnet20 mnt2]# cd /mnt2/
[root@studnet20 mnt2]# df -T /dev/sdc1       //不行你看,没错吧。
文件系统    类型         1K-块      已用      可用 已用% 挂载点
/dev/sdd1     ext3     2072548     68700   1898568   4% /mnt2
[root@studnet20 mnt2]# blkid /dev/sdc1
/dev/sdc1: LABEL="kiku" UUID="349d7cb2-d598-4af6-a1b0-3d320c99fb37" TYPE="ext3"
######################################
3.2.2 挂载点跟fstab
 
fstab保存了文件系统的静态信息。系统启动初始化都会去参考这个文件。文件系统做好的最后一步就是看你需要不需要把他做成开机自动挂载了哦。先来看一下fstab这个文件。
每一行六列来描述文件系统。
#device  mount_point   FS_type   options   dump_freq  
fsck_order
特殊设备名    
/dev/sdc1      /mnt2         ext3       default        0                 0
文件系统标签    挂载点   文件系统类型           从来不转存      忽略自检
3.3.1 如何操作文件
刚刚创建ext3的时候你有没有发现它的输出有这么一行:
“正在写入inode表: 完成 ”
现在我们要来讲这个表有什么作用跟文件啥关系呀?
文件系统里维护了一张表叫内节点表,inode table:保持了一个系统中所含文件的列表,或者就是一个最简陋的二维表的数据库,文件系统通过检索这个表来为我找文件。
table中的每一项都叫做inode(里面装着最有用的信息:元数据matedata)
包含:
      文件类型 :(l,d,c,b等);
      文件权限:(777,755,644等);
      链接计数:和inode number相同的文件名的数量;
      文件所有者:UID,GID;
      时间戳:最后修改,最后inode改变时间;
      数据在硬盘的位置;
inode引用的方式:用inode number(独一无二的);
 
3.3.2你所不知到的目录
     这么突然就跳到目录来了?文件还没讲!!放心文件是“装在”目录里的不是吗?通常我们认为目录就是容器,拿来装东西用的。
而实际上它就是一个映射被表,或者就是inode表。
                  将 : 我们所看到的“文件名”<------>系统中的inode number : 对应起来。
访问文件的过程描述:当我们用ls命令查看1.txt时,系统会参考1.txt所在的目录,找到inode number,然后inode number<------>inode table找到该inode信息。然后就有如下的显示。
[root@studnet20 ~]# ls -il 1.txt
660043 -rw-r--r--. 1 root root 5329  5月 14 01:09 1.txt (inode元信息)
   检索方式如下:
 
(父目录)inode table————inode(matedata)
          |
          |
         inode num (文件名/i num)
3.3.3实验部分:
   现在我们来实践对文件的操作看看文件内部的变化到底是怎么体现在inode的。
#####################################
[root@studnet20 tmp2]# ll -il mydata
660139 -rw-r--r--. 1 root root 0  5月 19 14:58 mydata
[root@studnet20 tmp2]# cp mydata youdata
[root@studnet20 tmp2]# ll -il
总用量 0
660139 -rw-r--r--. 1 root root 0  5月 19 14:58 mydata
660153 -rw-r--r--.
1
root root 0  5月 19 15:07 youdata
发现,拷贝文件其实就是多了一个内节点而已660153。
[root@studnet20 tmp2]# mv mydata herdata
[root@studnet20 tmp2]# ll -il
总用量 0
660139 -rw-r--r--. 1 root root 0  5月 19 14:58 herdata
发现mv的操作不改变内节点号码,只是修改了元数据.
[root@studnet20 tmp2]# ls -il
总用量 0
660139 -rw-r--r--. 1 root root 0  5月 19 14:58 herdata
[root@studnet20 tmp2]# rm -f herdata
[root@studnet20 tmp2]# ls -il
总用量 0
发现内节点被释放了。链接数变没了。
那么我们想什么东西可以增加链接数呢?ln
[root@studnet20 tmp2]# ln -s mydata sofedata
[root@studnet20 tmp2]# ls -il
总用量 0
660139 -rw-r--r--. 1 root root 0  5月 19 15:13 mydata
660153 lrwxrwxrwx. 1 root root 6  5月 19 15:14 sofedata -> mydata
[root@studnet20 tmp2]# ln  mydata harddata
[root@studnet20 tmp2]# ls
harddata  mydata  youdata
[root@studnet20 tmp2]# ls -il
总用量 0
660139 -rw-r--r--.
2
root root 0  5月 19 15:13 harddata
660139 -rw-r--r--.
2
root root 0  5月 19 15:13 mydata
660153 lrwxrwxrwx. 1 root root 6  5月 19 15:14 youdata -> mydata
我们发现做了软链接之后,多了一个内节点,mydata的链接计数没有增加;
做了硬链接之后,内节点没有多,而mydata的链接数多了。那么我们说删除mydata的时候,我们要删除两次,要把所有的链接计数剪断了,文件才会被完全删除。
[root@studnet20 tmp2]# rm mydata
rm:是否删除普通空文件 "mydata"?y
[root@studnet20 tmp2]# ls -il
总用量 0
660139 -rw-r--r--. 1 root root 0  5月 19 15:13 harddata
660153 lrwxrwxrwx. 1 root root 6  5月 19 15:14 youdata -> mydata
660139 还在说明文件并没有被删除,但是软链接已经死了。
[root@studnet20 tmp2]# rm harddata
rm:是否删除普通空文件 "harddata"?y
[root@studnet20 tmp2]# ls -il
总用量 0
660153 lrwxrwxrwx. 1 root root 6  5月 19 15:14 youdata -> mydata
这时後,mydata文件才能完全删除了,链接计数已经为0。^_^。
 总结:不知到会有人看完这流水帐,做完一遍,然后写一遍,然后再验证一遍。然后,这应该是linux里最基础的东西,我故意分章节是为了做记号,我想看看在过段时间这些记号有没有标错了,嘿嘿!希望想我一样的菜鸟们,让我们open起来,飞得更高更远。