1、文件系统和网络系统,2,文件,文件类型 普通文件 文本文件,可执行文件,数据文件,. 目录 设备文件 块设备 字符设备 符号链接 管道 .,3,drwxr-xr-x 20 root root 118784 May 8 14:22 dev,brw-rw- 1 root disk 3, 0 Jan 30 2003 hda,crw- 1 root root 4, 1 Apr 2 12:25 tty1,-rw-r-r- 1 liyi users 20471 Mar 14 2003 Makefile,lrwxrwxrwx 1 root root 4 Jan 29 2005 sh - bash,prw-r
2、-r- 1 liyi users 0 Apr 2 16:59 myfifo,普通文件,目录,设备文件,符号链接,管道,Linux系统上的各种形式的文件,4,文件系统,文件系统基本概念 一种特定的文件存储格式 ext2, ext3, vfat, jffs, yaffs, cramfs, iso9660, ntfs, . 按特定的存储格式格式化好的一块介质 硬盘,flash,内存,文件,. 操作系统中用来管理文件系统以及对文件进行操作的机制及其实现 Linux文件系统结构 树形结构 根目录 文件 子目录,5,ext2文件系统,系统结构 超级块(super block) 块组描述符表(block g
3、roup descriptor table) 块位图(block bitmap) 索引节点位图(inode bitmap) 索引节点表(inode table) 数据块(data block),6,磁盘上的ext2文件系统结构示意图,文件系统管理的空间,7,块(block)和块组(block group),块 ext2文件系统将磁盘分成固定大小的块 1k,2k,4k,8k,. 文件系统以块为基本单位使用磁盘空间 块组 ext2文件系统将磁盘块组成块组进行管理 每个块组大小一致 块位图大小 X 1个字节的位数 X 块大小 块位图只占用1个块 例:1块 = 4k,1个块组 = 4k x 8 x 4
4、k = 128M 每个块组中都有用于管理的元数据(metadata)和文件数据(data) 位图,索引节点表 数据块,8,超级块(super block),大小 1k 主要内容(struct ext2_super_block) s_inodes_count:总索引节点数 s_blocks_count:以块为单位的文件系统大小 s_log_block_size:块大小(2n表示,以1k为单位) s_blocks_per_group:一个块组中块的数目 s_mtime:最后一次挂载的时间 s_mnt_count, s_max_mnt_count:当前挂载次数和最大挂载次数 s_magic:文件系统
5、的魔数 s_lastcheck, s_checkinterval:最后一次系统检查的时间和检查时间间隔 s_creator_os:创建文件系统使用的操作系统 s_def_resuid, s_def_resgid:保留块的用户ID和组ID s_inode_size:磁盘上索引节点用数据结构的大小 s_volume_name:卷标 .,9,位图和索引节点表,块位图 只占用1块的空间 每一位表示一个块的使用情况 索引节点位图 只占用1块的空间 每一位表示一个索引节点的使用情况 索引节点表 块组中的索引节点数组,数组中的每个元素为一个索引节点 索引节点数量的选取与文件平均大小有关,10,索引节点(in
6、ode),索引节点是ext2文件系统管理文件的基本结构,ext2文件系统上的每个文件对应一个索引节点。 ext2文件系统的索引节点大小为128字节 struct ext2_inode 例:一个4k的块可以保存32个索引节点 每个索引节点有一个唯一的编号:索引节点号 索引节点中保存文件的基本信息 文件属性,存取权限等。 各种时间戳和状态标志 文件存储的位置信息,11,索引节点的结构,12,索引磁盘数据块,索引节点中保存指向文件使用的数据块的指针 include/linux/ext2_fs.h i_blockEXT2_N_BLOCKS,. #define EXT2_NDIR_BLOCKS 12 #
7、define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) . struct ext2_inode ._u32 i_blockEXT2_N_BLOCKS;. ,include/linux/ext2_fs.h:,13,直接索引,0,1,2,11,12,13,14,一重间接索引,二重间接索引,三重间接索引,i_bl
8、ock,磁盘数据块的索引,磁盘数据块,14,文件大小上限,15,例1:建立一个ext2文件系统,创建基于文件的ext2文件系统,$ dd if=/dev/zero of=myfile bs=1K count=4K 4096+0 records in 4096+0 records out $ $ $ file myfile myfile: data $,第一步,创建一个指定大小的普通文件 myfile,16,$ mke2fs myfile -b 4096 -m 0 -L mylable -F mke2fs 1.32 (09-Nov-2002) Filesystem label=mylable O
9、S type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 1024 inodes, 1024 blocks 0 blocks (0.00%) reserved for the super user First data block=0 1 block group 32768 blocks per group, 32768 fragments per group 1024 inodes per groupWriting inode tables: done Writing superblocks and filesystem
10、 accounting information: doneThis filesystem will be automatically checked every 29 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. $ $ $ file myfile myfile: Linux rev 1.0 ext2 filesystem data $,第二步,将普通文件myfile制作成一个ext2文件系统,17,$ mount -t ext2 -o loop myfile /mnt/mymnt $
11、$ mount /dev/hda3 on / type ext3 (rw) none on /proc type proc (rw) . /home/liyi/temp/myfile on /mnt/mymnt type ext2 (rw,loop=/dev/loop0) $ $ $ tune2fs -l /dev/loop0 tune2fs 1.32 (09-Nov-2002) Filesystem volume name: mylable Last mounted on: Filesystem UUID: 60a84a03-5315-4dad-82a3-b56777d275d7 Files
12、ystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: filetype sparse_super Default mount options: (none) Filesystem state: not clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 1024 Block count: 1024 .,第三步,将上述文件系统挂载到系统上,18,目录、目录项、文件,ext2文件系统为一个统一的目录
13、结构 目录是ext2文件系统上的一种特殊文件 所有文件都保存在目录下 整个文件系统有一个唯一的起点,即根目录。 根目录在系统启动时建立 只能有一个根目录 目录作为一种特殊的文件,它的内容即为目录项。 目录项作为目录文件的内容,保存在磁盘上的数据块中。,19,ext2文件系统目录项的基本结构,#define EXT2_NAME_LEN 255 . struct ext2_dir_entry_2 _u32 inode; /* Inode number */_u16 rec_len; /* Directory entry length */_u8 name_len; /* Name length *
14、/_u8 file_type;char nameEXT2_NAME_LEN; /* File name */ ;,include/linux/ext2_fs.h:,20,例2:在ext2文件系统上定位文件,我们要使用/home/liyi/spioc.c文件,在ext2文件系统上如何找到呢?,根目录,查找/home,得到 索引节点6,索引节点号6用于/home目录,索引节点6表示/home在块122中,/home/liyi对应索引节点23,索引节点23用于/home/liyi,索引节点23表示/home/liyi在块1768中,块122用于/home目录,/home/liyi/spioc.c对应
15、于索引节点81,块1768为目录/home/liyi,因为每个索引节点号对应磁盘的固定位置,因此根据索引节点号找到索引节点是很直接的。找到文件spioc.c的索引节点即找到了文件的内容在磁盘上的存储位置。,21,创建特殊文件,创建目录 $ mkdir mydir创建设备文件 $ mknod mycdev c 234 0 $ mknod mybdev b 125 1创建管道 $ mkfifo mypipe $ mknod mypipe p创建符号链接 $ ln -s afile mylink,例:创建目录、设备文件、命名管道、符号链接。,22,虚拟文件系统(VFS),虚拟文件系统是Linux内核
16、中的一个软件层,处理与具体文件系统相关的系统调用。1986年首先在SunOS提出和实现。 Linux系统可支持多种具体的文件系统 ext2,ext3,msdos,yaffs,nfs,proc,. 虚拟文件系统支持的文件系统分类 磁盘文件系统 ext2,ext3,msdos,yaffs,iso9660,. 网络文件系统 nfs,coda,afs,. 特殊文件系统(虚文件系统) /proc,23,例3:不同文件系统间文件拷贝,24,通用文件模型,不同文件系统对文件的定义和使用方式不同 如:FAT文件系统中的目录不属于文件 通用文件模型包括如下几种对象 超级块对象 索引节点对象 文件对象 目录项对象
17、 虚拟文件系统将所有文件用一个统一的数据结构表示,struct file数据结构。,25,文件对象,struct file struct list_head f_list;struct dentry *f_dentry;struct vfsmount *f_vfsmnt;struct file_operations *f_op;atomic_t f_count;unsigned int f_flags;mode_t f_mode;loff_t f_pos;unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;struct fown_
18、struct f_owner;unsigned int f_uid, f_gid;int f_error;unsigned long f_version;/* needed for tty driver, and maybe others */void *private_data;/* preallocated helper kiobuf to speedup O_DIRECT */struct kiobuf *f_iobuf;long f_iobuf_lock; ;,include/linux/fs.h:,26,struct file_operations,struct file_opera
19、tions struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char *, size_t, loff_t *);ssize_t (*write) (struct file *, const char *, size_t, loff_t *);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table
20、_struct *);int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, struct dentry
21、 *, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);ssize_t (*sendpage) (struct
22、file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); ;,include/linux/fs.h:,27,索引节点对象,struct inode struct list_head i_hash;struct list_head i_list;struct list_head i_dentry;struct list_head i_
23、dirty_buffers;struct list_head i_dirty_data_buffers;unsigned long i_ino;atomic_t i_count;kdev_t i_dev;umode_t i_mode;unsigned int i_nlink;uid_t i_uid;gid_t i_gid;kdev_t i_rdev;loff_t i_size;time_t i_atime;.union struct minix_inode_info minix_i;struct ext2_inode_info ext2_i;. u; ;,include/linux/fs.h:
24、,28,各种特殊文件系统,none:表示没有挂载点 any:表示可由用户随意挂载到任何位置,29,proc文件系统,启用ip转发 $ echo 1 /proc/sys/net/ipv4/ip_forward查看系统上使用的文件系统 $ cd /proc $ more filesystems,例:使用proc文件系统。,proc文件系统是一个虚文件系统,其中的内容也是虚文件和虚目录。 proc文件系统提供了运行时的内核信息,并提供了对内核信息读取和修改的易用方式。 用户可通过proc文件系统对运行时的内核进行配置。如:sysctl命令。,30,根文件系统,Linux系统的运行需要一个根文件系统
25、文件系统的根:/,根目录,根节点。 根文件系统可以存在于多种地方 磁盘,网络,内存中。 根文件系统可以在系统启动运行后改变。 原则上,根文件系统可以只提供一个根节点,但实际应用中根文件系统中需要提供各种库和系统应用程序及配置文件等。 只有在根文件系统加载后才能加载其它文件系统。 根文件系统不能象其它文件系统那样卸载。,31,文件系统的挂载,mount, umount, /etc/fstab 挂载点 一个文件系统被多次挂载到不同挂载点上 一个挂载点上多次挂载不同文件系统,$ mount -t vfat /dev/sda1 /mnt/usbdisk $ $ umount /mnt/usbdisk
26、$,例:将Windows下格式化好的usb盘在Linux系统上的挂载和卸载。,32,网络系统,Linux支持多种网络系统结构 802,atm,appletalk,ax25,ipv4/6,ipx,. Linux支持多种网络功能 路由,防火墙,内核网页服务器,. 分层的网络系统结构 开放系统互连(OSI)模型 网络系统构成 硬件接口设备 并没有文件系统中对应的设备文件 协议 TCP/IP协议栈 应用层协议:HTTP,ftp,smtp,. 套接口(socket),33,TCP/IP协议,TCP协议 TCP和UDP TCP: Transmission Control Protocol,传输控制协议 有
27、连接通讯协议,用于提供可靠的通信连接。 需要多次握手,可靠但效率不高。 UDP: User Datagram Protocol,用户数据报协议 非连接通讯协议,提供不可靠的通信连接。 不需握手,不可靠但传输效率高。 端口(port) 对应各种应用 IP协议 IP: Internet Protocol,网际协议,互联网协议,网间网协议 用于实现基本的网络数据传输报文,34,OSI七层参考模型,35,TCP和UDP数据报文格式,报头,31,0,(bit),31,0,(bit),TCP,UDP,36,IP数据报文格式,报头,31,0,(bit),37,ip地址(ipv4),组成 4个字节(ipv4)
28、,xxx.xxx.xxx.xxx。xxx: 0-255 分类 A,B,C类:单播地址 D类:多播地址 E类:保留 私有地址 A类:10.0.0.0-10.255.255.255 B类:172.16.0.0-172.31.255.255 C类:192.168.0.0-192.168.255.255,38,.,.,.,.,.,.,A类地址,0,B类地址,0,1,.,.,.,C类地址,1,1,0,.,.,.,D类地址,1,1,1,.,.,.,E类地址,1,1,0,1,1,范围:0.0.0.0 - 127.255.255.255,范围:128.0.0.0 - 191.255.255.255,范围:19
29、2.0.0.0 - 223.255.255.255,范围:224.0.0.0 - 239.255.255.255,范围:240.0.0.0 - 255.255.255.255,ip地址分类及其地址范围,http:/www.iana.org/assignments/ipv4-address-space,39,套接口(socket,套接字),套接口是用户使用网络系统的端点 一个网络系统上的套接口类似于一个文件系统上的文件 用户可以创建套接口用于数据传输 一个传输通道需要2个套接口,数据从一个套接口送出,通过网络和网络系统,在另一个套接口上被接收。 Linux使用BSD socket 一个套接口作为
30、特殊文件系统sockfs上的文件 一个套接口是一个socket型的数据结构 inode ops close, connect,sendmsg, recvmsg, bind,. .,40,例4:互联网编程,说明:一个简单的网络客户端,它可以向某个网页服务器发送请求,并将返回结果显示出来。,#include #include #include #include #include #include #define PROTOCOL “tcp“ #define REQUEST “GET / HTTP/1.0nn“int main(int argc, char *argv) int sockid;str
31、uct servent *serviceaddr;struct hostent *hostaddr;struct protoent *protocol;struct sockaddr_in socketaddr;char buffer1024;int count;,myclient.c,41,/* 第一步: 初始化套接口. */* 变量socketaddr初始化. */bzero(char *),myclient.c (续),42,/* 第二步:创建套接口. */* 注意:因为是TCP协议,所以使用SOCK_STREAM. */sockid = socket(PF_INET, SOCK_STR
32、EAM, protocol-p_proto);if (sockid 0) printf(“failed to creat socket.n“);/* 第三步:连接服务器. */if (connect(sockid, (struct sockaddr *) ,myclient.c (续),43,$ gcc -o myclient myclient.c $ $ ./myclient http HTTP/1.0 200 OK Cache-Control: private Content-Type: text/html; charset=ISO-8859-1 Set-Cookie: PREF=ID=
33、fe0e41dbe50b2312:NW=1:TM=1208239843:LM=1208239843:S=3tZHwIXn lV0BpU98; expires=Thu, 15-Apr-2010 06:10:43 GMT; path=/; domain= Server: gws Date: Tue, 15 Apr 2008 06:10:43 GMT Connection: Close.,myclient编译和运行,44,作业,在例1中创建的文件系统上 共有多少个块组? 共有多少个块? 共有多少个可用块? 共有多少个可用索引节点? 已被占用的块都有哪些?都用来保存什么数据? 提示:除使用tune2fs等命令外,还可将myfile作为一个文件使用od命令查看其内容。,45,参考资料,深入理解Linux内核 第二版 第十二章,第十七章,