2009/1

Linux分区个数限制

在linux上,对于IDE硬盘来说,分区个数限制在63个;而对于SCSI硬盘限制在15个。

我们可以直接在linux内核源代码中找到证据:

include/linux/ide.h

define PARTN_BITS 6 / number of minor dev bits for partitions /

次设备号也就决定了可挂载的IDE设备不会超过63个(2^6-1,之所以减一是因为hdX本身也会占用一个)。

SCSI也差不多,见 drivers/scsi/sd.c

if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)

define SD_MINORS 16

else

define SD_MINORS 0

endif

在内核文档中也可以看到,见Documentation/devices.txt :

For partitions, add to the whole disk device number:
0 = /dev/hd? Whole disk
1 = /dev/hd?1 First partition
2 = /dev/hd?2 Second partition

63 = /dev/hd?63 63rd partition

8 block SCSI disk devices (0-15)

Partitions are handled in the same way as for IDE
disks (see major number 3) except that the limit on
partitions is 15.

IDE, ATA, SCSI 等等

关于硬盘的术语有一大堆,而且和很多别的计算机术语一样,界定不清,含义模糊。在这里简单澄清一下,但我不排除你看了之后会更糊涂。:^)

IDE:Integrated Drive Electronics 的缩写。最早的硬盘接口,后来被 ATA 标准所取代,准确地讲应该是 ATA-1。所以有时也被称为 IDE/ATA,可参见其历史介绍。后来,几乎和ATA-1同时出现的 EIDE(Enhanced IDE )又被规范化为 ATA-2。

ATA:Advanced Technology Attachment 的缩写,存储设备(并非仅限硬盘)的接口标准。有时也被称为 IDE。IDE 在 ATA 标准出现之前就有了,所以估计这个也是因为历史原因。不过根据wikipedia记载,这两个术语还是有些许不同之处的:

The terms “integrated drive electronics” (IDE), “enhanced IDE” and “EIDE” have come to be used interchangeably with ATA (now Parallel ATA). However the terms “IDE” and “EIDE” are at best imprecise. Every ATA drive is an “integrated drive electronics” drive, but not every “integrated drive electronics” drive is an ATA drive, as the term also correctly describes SCSI drives: They have the drive controllers on board and present the drive to the host as an array of blocks.
后来就都是 ATA 了。又因为 SATA(Serial ATA,即 ATA-7)的出现,所以老的 ATA 又都被称为 PATA(Parallel ATA)了。

SCSI:Small Computer System Interface 的缩写,另一个完全不同的标准,定义了内部的命令,协议和接口。SCSI更快,当然也更贵,多用在中,高性能服务器上,不过apple的mac也是最早使用它的计算机之一。新的SCSI标准,Serial Attached SCSI又被简称为SAS

SCSI 和前面的总起来并列为三个标准:PATA,SATA,SCSI。其中SATA应该是会继续流行的PC机硬盘接口。

HDD:Hard Disk Drive 的缩写,就是我们通常所说的硬盘,磁盘。

SSD:Solid State Drive 的缩写,通常我们称为固态硬盘。SSD耗电少,抗震性能好,但比起HDD来要贵一些,而且容量通常也不像HDD那么大。

RAID:Redundant Array of Independent Disks 的缩写,就是我们通常所说的磁盘阵列。RAID是对多块硬盘的组合,需要硬件支持(貌似也有从文件系统层支持RAID的,btrfs?)。根据不同的组合方式,RAID又分为RAID0到RAID7,详细参考这里

参考:

http://www.91wp.com/Article/jswz/200704/350.html
http://www.pcbuyerbeware.co.uk/IDE.htm
http://www.pcguide.com/ref/hdd/if/ide/over.htm
http://en.wikipedia.org/wiki/RAID
http://en.wikipedia.org/wiki/SCSI
http://en.wikipedia.org/wiki/AT_Attachment

Linux PID namespace

一直对linux内核的namespace感到困惑,今天看了一下代码才知道,原来所谓的namespace其实就是给虚拟化用的,PID namespace其实就是建立一个新的PID空间,这样内部可以使用一套新的PID,而且不会和外部冲突。这也就是说某个进程其实会有两个PID,一个空间一个。

我写了段C代码来展示这个问题。
[c]

include

include

include

include

include

include

static int fork_child(void *arg)
{
int a = (int)arg;
int i;
pid_t pid;

printf("In the container, my pid is: %dn", getpid());
for (i = 0; i < a; i++) {
    pid = fork();
    if (pid < 0)
        return pid;
    else if (pid)
        printf("pid of my child is %dn", pid);
    else if (pid == 0) {
        sleep(3);
        exit(0);
    }
}
return 0;

}

int main(int argc, char argv[])
{
int cpid;
void
childstack, stack;
int flags;
int ret = 0;
int stacksize = getpagesize()
4;

if (argc != 2) {
    fprintf(stderr, "Wrong usage.n");
    return -1;
}

stack = malloc(stacksize);
if (!stack) {
    perror("malloc");
    return -1;
}

printf("Out of the container, my pid is: %dn", getpid());

childstack = stack + stacksize;
flags = CLONE_NEWPID | CLONE_NEWNS;

cpid = clone(fork_child, childstack, flags, (void *)atoi(argv[1]));
printf("cpid: %dn", cpid);

if (cpid < 0) {
    perror("clone");
    ret = -1;
    goto out;
}

fprintf(stderr, "Parent sleeping 20 secondsn");
sleep(20);
ret = 0;

out:
free(stack);
return ret;
}
[/c]

运行结果:

$ sudo ./pid_container 3
Out of the container, my pid is: 7061
cpid: 7062
In the container, my pid is: 1
Parent sleeping 20 seconds
pid of my child is 2
pid of my child is 3
pid of my child is 4

其实被namespace化的不只是PID,还有很多东西,貌似它们合起来被称为container。可以看 include/linux/nsproxy.h:

struct nsproxy {
atomic_t count;
struct uts_namespace uts_ns;
struct ipc_namespace
ipc_ns;
struct mnt_namespace mnt_ns;
struct pid_namespace
pid_ns;
struct net *net_ns;
};

虚拟化的东西是越来越让人摸不清头脑了。。。。

旅行总结(下)

长沙

在长沙终于见到了认识很久的网友,王大大同学。虽然和她聊天感觉她很小气,但实际上一点也不是,她招待得很周到,还有她男友,对我都很好。听她讲了很多湖南话,我总感觉湖南话基本上就是四川话和粤语的混合……

在长沙有两件有意思的事,一件是到长沙那天开始下雪,还比较大,晚上电视台都发不橙色警报了,我琢磨着是不是又会像去年那样,不过还好,第二天不下了,一点儿事也没有;另一件是去长沙火车站时差五分钟就晚了火车!我冲出公交车后基本上是一路飞奔到火车里的,还好有惊无险。

长沙的岳麓书院不错,值得一去。

黄兴南路步行街附近有条小吃街,不错,靠着太平街,我在那里第一次吃湖南臭豆腐,开始感觉臭,越吃越香,吃完感觉很爽!很奇特。

P.S. 在长沙吃的每道菜基本上都有辣子,无语了……

广州

见到了阔别已久的老大,基本上还是那么胖。不过这次终于把老大雪藏已久的“大嫂”给见到了,还拍了N张照片给兄弟们散发了一下。我就不多作什么评论了,要不老大非得杀了我。:-)

老大请我们吃了很多好吃的,我也是头一次尝到了粤菜,对于我一个山东人来说,他们的菜基本上算是没放盐……而且广州人还真吃那些乱七八糟的东西,唉…… 不过汤确实煲得不错。比较遗憾的是,由于老大的失误,我这次没吃到撒尿牛丸。。。

白云山离老大太远,而且爬山太累,所以我就没去。去了趟越秀公园,不错,很美很别致的一个公园,很有广州特色。陈家祠也不错,可惜里面还有的在装修。

最后,来广州一定不能不乘船夜游一下珠江,很美很有情调!记着带上美女哦~!

深圳

深圳基本上没什么好逛的,世界之窗吧,也就那个玻璃架子,欢乐谷吧,也就个游乐园。不过还好,海边的红树林不错,风景挺美。在深圳做的两件比较疯狂的事是:一,吃了一次青蛙,头一次吃,一开始心理上还不好接受,不过确实很好吃,没有枉费我们排队等那一个小时;二,又去了一次酒吧,歌舞那个升平啊。。。。

P.S. 正好赶上参加了深圳LUG的聚会,见到了好几个在网络上素未谋面的朋友,挺有意思的。

福州

感觉福州实在是没什么独特的,和长沙差不多,不过人家长沙至少还有个岳麓书院啊!连陪我逛的小林子都不知道福州有啥好玩的。最后我们就逛了一下五一广场,台江步行街,三坊七巷。小林子带我吃了一下福州菜,基本上全都是海鲜,饼里面有,叫蛎饼;还有海鲜版的煎饼果子,忘了叫啥名了;就连我最后叫的米粉里都有海鲜!海鲜我就能吃个别的鱼和虾,其它软体动物基本上都不能接受……不习惯啊,不习惯~!唉,还有,也是没放盐……

这次旅行就全部结束啦~!多亏各位朋友的帮忙才使得整个旅行有条不紊地按照我的计划全部进行完!走过了很多地方,见到了很多朋友,吃到了很多小吃!当然了,因为时间关系也有不少的遗憾,但毫无疑问,这是一次愉快的旅行!这就是旅行的意义。:-)

希望各位朋友生活更开心幸福!加油!

旅行总结(上)

济南

除了轻轨,基本上没怎么变。

北京

坐地铁,挤死;坐公交,堵死;出去逛,冻死。。。

去了趟颐和园,基本上就滑冰去了!

想去奥运体育馆,基本上没找到!

最大的意外是:发现北京居然也有蓝天,太tmd不可思议了。。。

天津

08年的最后一天,邱曼的生日。

西安

见到了很多同学,老师,朋友~~张老师要有baby啦,陈mm的脸越来越大了~

又去吃了一次建基泡馍,那个爽啊~

通宵了一个晚上,那个疯啊~

还是西安好!

武汉

吃了很多小吃,还专门尝了几种很奇特的武汉小吃,在别的地方从来没有吃过,比如那个糯米卷油条。来武汉一定不要错过户部巷,就像去西安一定要去回民街一样。一般人我不告诉他。:-)