blocklinux
‘壹’ 请问linux系统中inode和block的关系
1. inode和block
---------------------------------
提到inode,我们不得不先介绍硬盘的整体结构。硬盘中包含多个硬盘盘片,硬盘盘片为圆形,每个硬盘盘片都有一个可以读写的磁头(Head),将这个磁
头固定,使硬盘盘片旋转一周,所走轨迹就是磁道(Track)。硬盘内所有盘片的相同磁道号的集合成为磁柱(Cylinder)。每一磁道被划分成许多区
域,每个区域叫一个扇区(Sector)。扇区是硬盘的最小存储物理量,一个扇区的存储容量大约是512字节(约0.5K)。
知道了硬盘的大体结构之后,再来谈谈怎么进行硬盘分区。进行硬盘分割的最小单位是磁柱,分割完之后自然就是格式化(format)。在Linux中进行格式化必须考虑Block与inode,Block还好理解,它是磁盘可以记录的最小单位,是由数个扇区组成,所以大小通常为n*512Bytes,例如4K。
那么inode是什么呢Block是记录文件内容的区域,inode则是记录该文件的属性及其放置在哪个Block之内的信息。所
以,每个文件都会占用一个inode。当Linux系统要查找某个文件时,它会先搜索雀咐inode
table找到这个文件的属性及数据存放地点,然后再查找数据存放的Block进而将数据取出。inode数量在一开始已被设定好,其设定方式通常是"硬
盘大小/一个容量",这个容顷哗纯量比Block大一些较佳,例如刚才将Block设为4K,那么这个容量可以设为8K左右。所以,一块1GB的硬盘如果以8K
大小划分它的inode数,则会有131072个inode。一个inode的大小为128Byte,这样,我们就可以清楚地知道,一个分区被格式化为一个文件系统之后,基本上它一定会有inode table与数据区域两大块,一个用来记录文件的属性信息与该文件存放的Block块,一个用来记录文件的内容。
2. 硬链接
---------------------------------
刚才说过,当系统要读取某个文件时,它会先读inode
table,然后根据inode的信息到数据区域将数据取出备用。硬链接就是再建立一个inode链接到文件放置的Block块。也就是说,进行硬链接
时,实际上您的文件内容不会改变,只是原来的inode与后来添加的inode均可指定到该文件存放的地点,因此,读取两个inode的结果都是读取同一
个文件的内容。不过,这样一来就有个问题,因为inode会链接到Block块,而"目录"本身仅消耗inode,这样,硬链接就不能链接目录。所以,硬芦纯
链接有两个最大的限制:
(1) 不能跨文件系统,因为不同的文件系统有不同的inode table;
(2) 不能链接目录。
3. 软链接(符号链接)
---------------------------------
相对于硬链接,符号链接比较好理解,基本上,它是再建立一个独立文件,而这个文件会让数据读取操作指向它链接的那个文件。由于只是利用文件作为指向的动作,所以,当源文件被删除,符号链接的文件就打不开了,屏幕会显式"无法开启某文件"。
因此,硬链接比较安全,因为即某一个inode被删除,只要还有一个inode,该文件就能被找到。
4. 分区和文件系统
---------------------------------
磁盘分割的重点了: 也就是记录每一个分割区(Partition)的起始与结束磁柱。好了,那么这个分割区的起始与结束磁柱的信息放在哪里呢? 存放在Master Boot Recorder(MBR)
告知系统分割区所在的起始与结束磁柱之后,接着需要将分割区格式化为操作系统认识的文件系统(Filesystem)。因为每个操作系统认识的文件系统并不相同,所以要针对操作系统来格式化分割区 。
一个分割区就是一个文件系统。硬盘的最小储存单位是扇区(Sector),不过数据储存的最小单位并不是扇区,因为用
扇区来存储数据效率低下。因为一个扇区只有512Bytes,而磁头是一个扇区一个扇区地读取数据,如果文件有10MBytes,那么为了读这个文件,磁
头必须要进行20480次读取(I/O)操作。
为了克服这个效率上的困扰,引入了逻辑区块(Block)。逻辑区块是在对分割区进行格式化时,所指定的数据最小储存单位,这个最小储存单位是建立在扇区
的大小之上的(因为扇区是硬盘的最小物理储存单位),所以,逻辑区块的大小为扇区
的2的次方倍数。此时,磁头一次可以读取一个逻辑区块(若干个连续的扇区),如果在格式化时,指定逻辑区块为4KBytes(亦8个连续的扇区构成一个逻
辑区块),那么同样一个10MBytes的文件,磁头要读取的次数则为2560次,可以大幅提高文件的读取效率。
不过,逻辑区块单位的规划并不是越大越好。因为一个逻辑区块最多仅能容纳一个文件。假如逻辑区块规划为4KBytes,而一个文件大小为
0.1KBytes,这个小文件将占用一个逻辑区块的空间,该逻辑区块虽然可以容纳4Kbytes的容量,然而由于文件只占用了0.1Kbytes,所
以,实际上剩下的3.9KBytes是不能再被使用了。在考虑逻辑区块的规划时,需要同时考虑到:
* 文件读取的效率
* 文件大小可能造成的硬盘空间浪费
因此,在规划磁盘时,需要根据主机的用途来进行规划较佳。例如BBS主机由于文章较短, 逻辑区块小一点的好;而如果主机主要用在储存大容量的文件,那么考虑到效率,逻辑区块规划的大一点会比较妥当。
‘贰’ Linux里面block代表什么意思
在2.4 的 fs/buffers.c 的函数
static int __block_prepare_write(struct inode *inode, struct page *page,
unsigned from, unsigned to, get_block_t *get_block)
中有如下代码:
if (!page->buffers)
create_empty_buffers(page, inode->i_dev, blocksize);
head = page->buffers;
bbits = inode->i_sb->s_blocksize_bits;
block = page->index << (PAGE_CACHE_SHIFT - bbits);
for(bh = head, block_start = 0; bh != head || !block_start;
block++, block_start=block_end, bh = bh->b_this_page) {
if (!bh)
BUG();
block_end = block_start+blocksize;
if (block_end <= from)
continue;
if (block_start >= to)
break;
if (!buffer_mapped(bh)) {
err = get_block(inode, block, bh, 1);
if (err)
goto out;
if (buffer_new(bh)) {
unmap_underlying_metadata(bh);
if (Page_Uptodate(page)) {
set_bit(BH_Uptodate, &bh->b_state);
continue;
}
if (block_end > to)
memset(kaddr+to, 0, block_end-to);
if (block_start < from)
memset(kaddr+block_start, 0, from-block_start);
if (block_end > to || block_start < from)
flush_dcache_page(page);
continue;
}
}
对unmap_underlying_metadata 的意义不是特别明确, 注释说是释放潜在的bh. 实现是从hash中找到bh代表的设备上, bh-->blocknr 那个块的oldbh, 如果有的话把它释放.
奇怪的是,既然是新分配的,为什么慎雹在hash中能找到? 如宏孝察果hash中本来就有, 需要蔽茄新分配吗?
/*
* We are taking a block for data and we don't want any output from any
* buffer-cache aliases starting from return from that function and
* until the moment when something will explicitly mark the buffer
* dirty (hopefully that will not happen until we will free that block ;-)
* We don't even need to mark it not-uptodate - nobody can expect
* anything from a newly allocated buffer anyway. We used to used
* unmap_buffer() for such invalidation, but that was wrong. We definitely
* don't want to mark the alias unmapped, for example - it would confuse
* anyone who might pick it with bread() afterwards...
*/
static void unmap_underlying_metadata(struct buffer_head * bh)
{
struct buffer_head *old_bh;
old_bh = get_hash_table(bh->b_dev, bh->b_blocknr, bh->b_size);
if (old_bh) {
mark_buffer_clean(old_bh);
wait_on_buffer(old_bh);
clear_bit(BH_Req, &old_bh->b_state);
/* Here we could run brelse or bforget. We use
bforget because it will try to put the buffer
in the freelist. */
__bforget(old_bh);
}
}
‘叁’ linux系统存储同一份文件的多个数据块(block)是如何联系到一起的,和数据块号的使用时如何联系起来的
在linux文件系统中,一般是采用索引式文件系统,这种类型的文件系统在硬盘格式化的时候,会将硬盘上的数据块分为两种类型的块,第一种是保存文件信息的inode块,第二种就是实际存储数据的data块。data块就是你所说的存放数据的地方,然后都有对应的编号,这些编号都是按照顺序以表格的形式存放在inode块中,。
因此,当你要读取一个文件的内容时,它会先查找inode块里信息,判断你是否有权限读取这个文件,权限判断通过后,再去查找data块编号变,然后根据编号表里的编号依次查找所有的data块,按顺序拼接起来,就是一个完整文件的内容了。
‘肆’ linux stat 命令显示的 block 是扇区吗
不是,是逻辑块
扇区: 是硬盘片上的最小存储单位,一个扇区一般是512字节
逻辑块(block): 分区进行格式化时所指定的“最小存储单位”。即文件系统存储的最小单位;EXT3 文件系统中的块规格有 1024 Bytes, 2048 Bytes 和4096 Bytes 三种,它并不直接等于扇区的大小
‘伍’ linux block 是不是越大越好
一般默认是4096byte,
block小的话,会节省空间,但是会影响读取速度,
block大的话,对放置大文件,比如iso有帮助,可以提高读取速度,但是对于雀帆小文件,会浪费很多顷稿雹空敬轮间。
这要看你的具体需求。
‘陆’ Linux里面block和superblock区别是什么
superblock就相当于文件系统的元数据(MetaData),存储了文件系统的概略信息,例如如果一个ext文件系统受损,如果superblock没有问题的话有很大可能恢复
块设备是一种以块(block)为单位可以进行随机存取的硬件设备。常见的块设备有硬盘,软盘,闪存等。
块设备的最小寻址单元是扇区(sector),一个扇区是2\^n个字节,512Bytes是最常见的扇区大小。内核的文件系统使用块(block)作为最小寻址单元。 常见的block大小为512Bytes,1KB,4KB ; 默认的inode 是存放文件属性信息的 默认大小128byte(c58) 256byte(c64);
一个文件至少需要占用一个inode 和block
默认的情况下: inode是足够的,block消耗的快;
‘柒’ Linux中目录占用Block不
一般默认嫌裂握是4096byte, block小的话,会节省空间,但是会影响读取速度, block大的话,对放置大文件,比如iso有帮助,可以提高芹庆读取速度,但是对于小文件,会浪费很多空间。 这要看你的具体需求。
一般默认是4096byte, block小的话,会源烂节省空间,但是会影响读取速度, block大的话,对放置大文件,比如iso有帮助,可以提高读取速度,但是对于小文件,会浪费很多空间。 这要看你的具体需求。
‘捌’ Linux系统分区
Linux默认可分为3个分区,分别是boot分区、swap分区和根分区。
boot分区
在linux中,boot是存储内核及在引导过程中使用文件的分区,是启动linux时使用的一些核心文件;在boot中包括了系统Kernel的配置文件、启动管理程序GRUB的目录、启动时的模块供应的主要来源Initrd文件和vmlinuz文件。
/boot分区就是操作系统的内核及在引导过程中使用的文件,一般是几年前的版本要求划分的一个区,大小为100MB左右,但现在的新版本都不需要对这个分区进行单独划分,也就是说你完全可以不分/boot。
安装Linux只要求两个基本分区,即根分区及交换分区,如果你的磁盘空间足够大,可以多划分空间给根分区,你也可以把常用的目录新建到桌面,如下载的软件包,放到桌面不影响你进入Linux系统的速度,当然这要求你有足够大的根分区。
swap分区
SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用
它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且对用户不可见。
需要注意的是,虽然这个SWAP分区能够作为"虚拟"的内存,但它的速度比物理内存可是慢多了,因此如果需要更快的速度的话,并不能寄厚望于SWAP,最好的办法仍然是加大物理内存。SWAP分区只是临时的解决办法.
根分区
linux根分区是系统分区的意思,系统内所有的东西都存放在根分区中,也被称为root分区;Linux是一个树形文件系统,根分区就是它的root节点,任何的目录文件都会挂在根节点以下,并且linux只有一个根,不管对硬盘分多少个区,都要将这些分区挂载到根目录底下才可以使用。
所谓根分区,说白了就是系统分区,是root分区,所有的东西都放在这里面。
Linux是一个树形文件系统,根分区就是它的root节点,任何的目录文件都会挂在根节点以下。Linux只有一个根。你可以给你的硬盘进行分区,但是,分区设备一定挂载到linux根目录下的指定位置,如/usr,/var,/home等。如果要对分区进行操作的话,只能到分区所挂载的目录中进行操作。所以,不管对硬盘分多少个区,都要将这些分区挂载到根目录底下才可以使用。