文档库 最新最全的文档下载
当前位置:文档库 › 磁盘文件管理

磁盘文件管理

磁盘文件管理
磁盘文件管理

计算机与信息工程系实验报告

班级计算机1001班姓名时间2011.11.30-12.07 地点文理楼A504

实验名称

实验目的

进行的一次全面的综合训练,通过课程设计,让我更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了我的动手能力。

实验内容

能实现:用户登录、列文件目录、创建文件、删除文件、打开文件、关闭文件、读文件、写文件,列目录时要列出文件名、物理地址、保护码和文件长度,源文件可以进行读写保护。

实验结果

文件管理系统模拟

1.实验目的

通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现

2.实验内容

为Linux系统设计一个简单的二级文件系统。要求做到以下几点:

(1)可以实现下列几条命令(至少4条)

login 用户登录

dir 列文件目录

create 创建文件

delete 删除文件

open 打开文件

close 关闭文件

read 读文件

write 写文件

(2)列目录时要列出文件名、物理地址、保护码和文件长度;

(3)源文件可以进行读写保护。

3.实验提示

(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

(2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。

4.源代码:

#include

#include

#include

#define MEM_D_SIZE 1024*1024 //总磁盘空间为1M

#define DISKSIZE 1024 //磁盘块的大小1K

#define DISK_NUM 1024 //磁盘块数目1K

#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小

#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号#define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小

#define DIR_MAXSIZE 1024 //路径最大长度为1KB

#define MSD 5 //最大子目录数5

#define MOFN 5 //最大文件深度为5

#define MAX_WRITE 1024*128 //最大写入文字长度128KB

struct fatitem /* size 8*/

{

int item; /*存放文件下一个磁盘的指针*/

char em_disk; /*磁盘块是否空闲标志位 0 空闲*/

};

struct direct

{

/*-----文件控制快信息-----*/

struct FCB

{

char name[9]; /*文件/目录名 8位*/

char property; /*属性 1位目录 0位普通文件*/

int size; /*文件/目录字节数、盘块数)*/

int firstdisk; /*文件/目录起始盘块号*/

int next; /*子目录起始盘块号*/

int sign; /*1是根目录 0不是根目录*/

}directitem[MSD+2];

};

struct opentable

{

struct openttableitem

{

char name[9]; /*文件名*/

int firstdisk; /*起始盘块号*/

int size; /*文件的大小*/

int cur_size; /*当前打文件的数目*/

};

struct fatitem *fat; /*FAT表*/

struct direct *root; /*根目录*/

struct direct *cur_dir; /*当前目录*/

struct opentable u_opentable; /*文件打开表*/

int fd=-1; /*文件打开表的序号*/

char *bufferdir; /*记录当前路径的名称*/

char *fdisk; /*虚拟磁盘起始地址*/

void initfile();

void format();

void enter();

void halt();

int create(char *name);

int open(char *name);

int close(char *name);

int write(int fd,char *buf,int len);

int read(int fd,char *buf);

int del(char *name);

int mkdir(char *name);

int rmdir(char *name);

void dir();

int cd(char *name);

void print();

void show();

void initfile()

{

fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M空间*/

format();

}

void format()

{

int i;

FILE *fp;

fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址,引导区向后偏移 1k)*/ /*-----初始化FAT表------------*/

fat[0].item=-1; /*引导块*/

fat[0].em_disk='1';

{

fat[i].item=i+1;

fat[i].em_disk='1';

}

fat[ROOT_DISK_NO].item=-1; /*存放根目录的磁盘块号*/

fat[ROOT_DISK_NO].em_disk='1';

for(i=ROOT_DISK_NO+1;i

{

fat[i].item = -1;

fat[i].em_disk = '0';

}

/*-----------------------------------------------*/

root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/ /*初始化目录*/

/*---------指向当前目录的目录项---------*/

root->directitem[0].sign = 1;

root->directitem[0].firstdisk = ROOT_DISK_NO;

strcpy(root->directitem[0].name,".");

root->directitem[0].next = root->directitem[0].firstdisk;

root->directitem[0].property = '1';

root->directitem[0].size = ROOT_DISK_SIZE;

/*-------指向上一级目录的目录项---------*/

root->directitem[1].sign = 1;

root->directitem[1].firstdisk = ROOT_DISK_NO;

strcpy(root->directitem[1].name,"..");

root->directitem[1].next = root->directitem[0].firstdisk;

root->directitem[1].property = '1';

root->directitem[1].size = ROOT_DISK_SIZE;

if((fp = fopen("disk.dat","wb"))==NULL)

{

printf("Error:\n Cannot open file \n");

return;

}

for(i=2;i

{

root->directitem[i].sign = 0;

root->directitem[i].firstdisk = -1;

strcpy(root->directitem[i].name,"");

root->directitem[i].next = -1;

root->directitem[i].property = '0';

root->directitem[i].size = 0;

}

if((fp = fopen("disk.dat","wb"))==NULL)

{

printf("Error:\n Cannot open file \n");

return;

}

if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虚拟磁盘空间保存到磁盘文件中*/ {

printf("Error:\n File write error! \n");

}

fclose(fp);

}

void enter()

{

FILE *fp;

int i;

fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M空间*/

if((fp=fopen("disk.dat","rb"))==NULL)

{

printf("Error:\nCannot open file\n");

return;

}

if(!fread(fdisk,MEM_D_SIZE,1,fp)) /*把磁盘文件disk.dat 读入虚拟磁盘空间(内存)*/

{

printf("Error:\nCannot read file\n");

exit(0);

}

fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/

root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/

fclose(fp);

/*--------------初始化用户打开表------------------*/

for(i=0;i

{

strcpy(u_opentable.openitem[i].name,"");

u_opentable.openitem[i].firstdisk = -1;

u_opentable.openitem[i].size = 0;

}

u_opentable.cur_size = 0;

cur_dir = root; /*当前目录为根目录*/

bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char));

strcpy(bufferdir,"Root:");

void halt()

{

FILE *fp;

int i;

if((fp=fopen("disk.dat","wb"))==NULL)

{

printf("Error:\nCannot open file\n");

return;

}

if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /*把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat */

{

printf("Error:\nFile write error!\n");

}

fclose(fp);

free(fdisk);

free(bufferdir);

return;

}

int create(char *name)

{

int i,j;

if(strlen(name)>8) /*文件名大于 8位*/

return(-1);

for(j=2;j

{

if(!strcmp(cur_dir->directitem[j].name,name))

break;

}

if(j

return(-4);

for(i=2;i

{

if(cur_dir->directitem[i].firstdisk==-1)

break;

}

if(i>=MSD+2) /*无空目录项*/

if(u_opentable.cur_size>=MOFN) /*打开文件太多*/

return(-3);

for(j=ROOT_DISK_NO+1;j

if(fat[j].em_disk=='0')

break;

}

if(j>=DISK_NUM)

return(-5);

fat[j].em_disk = '1'; /*将空闲块置为已经分配*/

/*-----------填写目录项-----------------*/

strcpy(cur_dir->directitem[i].name,name);

cur_dir->directitem[i].firstdisk = j;

cur_dir->directitem[i].size = 0;

cur_dir->directitem[i].next = j;

cur_dir->directitem[i].property = '0';

/*---------------------------------*/

fd = open(name);

return 0;

}

int open(char *name)

{

int i, j;

for(i=2;i

{

if(!strcmp(cur_dir->directitem[i].name,name))

break;

}

if(i>=MSD+2)

return(-1);

/*--------是文件还是目录-----------------------*/

if(cur_dir->directitem[i].property=='1')

return(-4);

/*--------文件是否打开-----------------------*/

for(j=0;j

{

if(!strcmp(u_opentable.openitem[j].name,name))

break;

}

return(-2);

if(u_opentable.cur_size>=MOFN) /*文件打开太多*/

return(-3);

/*--------查找一个空闲用户打开表项-----------------------*/

for(j=0;j

{

if(u_opentable.openitem[j].firstdisk==-1)

break;

}

/*--------------填写表项的相关信息------------------------*/

u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk; strcpy(u_opentable.openitem[j].name,name);

u_opentable.openitem[j].size = cur_dir->directitem[i].size;

u_opentable.cur_size++;

/*----------返回用户打开表表项的序号--------------------------*/

return(j);

}

int close(char *name)

{

int i;

for(i=0;i

{

if(!strcmp(u_opentable.openitem[i].name,name))

break;

}

if(i>=MOFN)

return(-1);

/*-----------清空该文件的用户打开表项的内容---------------------*/

strcpy(u_opentable.openitem[i].name,"");

u_opentable.openitem[i].firstdisk = -1;

u_opentable.openitem[i].size = 0;

u_opentable.cur_size--;

return 0;

}

int write(int fd, char *buf, int len)

{

char *first;

int ilen1, ilen2, modlen, temp;

/*----------用 $ 字符作为空格 # 字符作为换行符-----------------------*/ char Space = 32;

char Endter= '\n';

for(i=0;i

{

if(buf[i] == '$')

buf[i] = Space;

else if(buf[i] == '#')

buf[i] = Endter;

}

/*----------读取用户打开表对应表项第一个盘块号-----------------------*/ item = u_opentable.openitem[fd].firstdisk;

/*-------------找到当前目录所对应表项的序号-------------------------*/ for(i=2;i

{

if(cur_dir->directitem[i].firstdisk==item)

break;

}

temp = i; /*-存放当前目录项的下标-*/

/*------找到的item 是该文件的最后一块磁盘块-------------------*/

while(fat[item].item!=-1)

{

item =fat[item].item; /*-查找该文件的下一盘块--*/

}

/*-----计算出该文件的最末地址-------*/

first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;

/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/

if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len)

{

strcpy(first,buf);

u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;

cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len; }

else

{

for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)

{/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/

first[i] = buf [i];

/*-----计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-------*/

ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);

ilen2 = ilen1/DISKSIZE;

modlen = ilen1%DISKSIZE;

if(modlen>0)

ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/

for(j=0;j

{

for(i=ROOT_DISK_NO+1;i

{

if(fat[i].em_disk=='0')

break;

}

if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/

return(-1);

first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/

if(j==ilen2-1) /*--如果是最后要分配的一块-*/

{

for(k=0;k

first[k] = buf[k];

}

else/*-如果不是要最后分配的一块--*/

{

for(k=0;k

first[k] =buf[k];

}

fat[item].item = i; /*--找到一块后将它的序号存放在上一块的指针中-*/

fat[i].em_disk = '1'; /*--置找到的磁盘快的空闲标志位为已分配-*/

fat[i].item = -1; /*--它的指针为 -1 (即没有下一块)-*/

}

/*--修改长度-*/

u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;

cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;

}

return 0;

}

int read(int fd, char *buf)

{

int len = u_opentable.openitem[fd].size;

int i, j, item;

int ilen1, modlen;

item = u_opentable.openitem[fd].firstdisk;

ilen1 = len/DISKSIZE;

modlen = len%DISKSIZE;

if(modlen!=0)

ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/ first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/

for(i=0;i

{

if(i==ilen1-1) /*--如果在最后一个磁盘块-*/

{

for(j=0;j

buf[i*DISKSIZE+j] = first[j];

}

else /*--不在最后一块磁盘块-*/

{

for(j=0;j

buf[i*DISKSIZE+j] = first[j];

item = fat[item].item; /*-查找下一盘块-*/

first = fdisk+item*DISKSIZE;

}

}

return 0;

}

int del(char *name)

{

int i,cur_item,item,temp;

for(i=2;i

if(!strcmp(cur_dir->directitem[i].name,name))

break;

}

cur_item = i; /*--用来保存目录项的序号,供释放目录中-*/

if(i>=MSD+2) /*--如果不在当前目录中-*/

return(-1);

return(-3);

for(i=0;i

{

if(!strcmp(u_opentable.openitem[i].name,name))

return(-2);

}

item = cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/ while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/

{

temp = fat[item].item;

fat[item].item = -1;

fat[item].em_disk = '0';

item = temp;

}

/*-----------------释放目录项-----------------------*/

cur_dir->directitem[cur_item].sign = 0;

cur_dir->directitem[cur_item].firstdisk = -1;

strcpy(u_opentable.openitem[cur_item].name,"");

cur_dir->directitem[cur_item].next = -1;

cur_dir->directitem[cur_item].property = '0';

cur_dir->directitem[cur_item].size = 0;

return 0;

}

int mkdir(char *name)

{

int i,j;

struct direct *cur_mkdir;

if(!strcmp(name,"."))

return(-4);

if(!strcmp(name,".."))

return(-4);

if(strlen(name)>8) /*-如果目录名长度大于 8位-*/

return(-1);

for(i=2;i

{

if(cur_dir->directitem[i].firstdisk==-1)

break;

}

if(i>=MSD+2) /*-目录/文件已满-*/

return(-2);

{

if(!strcmp(cur_dir->directitem[j].name,name))

break;

}

if(j

return(-3);

for(j=ROOT_DISK_NO+1;j

{

if(fat[j].em_disk=='0')

break;

}

if(j>=DISK_NUM)

return(-5);

fat[j].em_disk='1'; /*-将该空闲块设置为已分配-*/

/*-------------填写目录项----------*/

strcpy(cur_dir->directitem[i].name,name);

cur_dir->directitem[i].firstdisk=j;

cur_dir->directitem[i].size=ROOT_DISK_SIZE;

cur_dir->directitem[i].next=j;

cur_dir->directitem[i].property='1';

/*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/

cur_mkdir=(struct direct *)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE);

/*-初始化目录-*/

/*-指向当前目录的目录项-*/

cur_mkdir->directitem[0].sign=0;

cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].firstdisk;

strcpy(cur_mkdir->directitem[0].name,".");

cur_mkdir->directitem[0].next=cur_mkdir->directitem[0].firstdisk;

cur_mkdir->directitem[0].property='1';

cur_mkdir->directitem[0].size=ROOT_DISK_SIZE;

/*-指向上一级目录的目录项-*/

cur_mkdir->directitem[1].sign=cur_dir->directitem[0].sign;

cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[0].firstdisk;

strcpy(cur_mkdir->directitem[1].name,"..");

cur_mkdir->directitem[1].next=cur_mkdir->directitem[1].firstdisk;

cur_mkdir->directitem[1].property='1';

cur_mkdir->directitem[1].size=ROOT_DISK_SIZE;

for(i=2;i

{

cur_mkdir->directitem[i].sign=0;

strcpy(cur_mkdir->directitem[i].name,"");

cur_mkdir->directitem[i].next=-1;

cur_mkdir->directitem[i].property='0';

cur_mkdir->directitem[i].size=0;

}

return 0;

}

int rmdir(char *name)

{

int i,j,item;

struct direct *temp_dir;

/*-检查当前目录项中有无该目录-*/

for(i=2;i

{

if(!strcmp(cur_dir->directitem[i].name,name))

break;

}

if(i>=MSD+2) /*-没有这个文件或目录-*/

return(-1);

if(cur_dir->directitem[i].property!='1')/*-删除的不是目录-*/ return(-3);

/*-判断要删除的目录有无子目录-*/

temp_dir=(struct direct *)(fdisk+cur_dir->directitem[i].next*DISKSIZE);

for(j=2;j

{

if(temp_dir->directitem[j].next!=-1)

break;

}

if(j

return(-2);

/*------------找到起始盘块号,并将其释放----------------*/

item=cur_dir->directitem[i].firstdisk;

fat[item].em_disk='0';

/*-修改目录项-*/

cur_dir->directitem[i].sign=0;

cur_dir->directitem[i].firstdisk=-1;

strcpy(cur_dir->directitem[i].name,"");

cur_dir->directitem[i].next=-1;

cur_dir->directitem[i].property='0';

cur_dir->directitem[i].size=0;

return 0;

void dir()

{

int i;

for(i=2;i

{

if(cur_dir->directitem[i].firstdisk!=-1) /*-如果存在子目录-*/

{

printf("%s\t",cur_dir->directitem[i].name);

if(cur_dir->directitem[i].property=='0') /*-文件-*/

printf("%d\t\t\n",cur_dir->directitem[i].size);

else

printf("\t<目录>\t\n");

}

}

}

int cd(char *name)

{

int i,j,item;

char *str;

char *temp,*point,*point1;

struct direct *temp_dir;

temp_dir=cur_dir;

str=name;

if(!strcmp("\\",name))

{

cur_dir = root;

strcpy(bufferdir,"Root:");

return 0;

}

temp = (char *)malloc(DIR_MAXSIZE*sizeof(char));/*-最长路径名字分配空间-*/

for(i=0;i<(int)strlen(str);i++)

temp[i]=str[i];

temp[i]='\0';

for(j=0;j

{

if(!strcmp(temp_dir->directitem[j].name,temp))

break;

}

//if(temp_dir->directitem[j].property!='1') /*-打开的不是目录-*/

//return(-2);

if(j>=MSD+2) /*-不在当前目录-*/

return(-1);

item=temp_dir->directitem[j].firstdisk;

/*-当前目录在磁盘中位置-*/

temp_dir=(struct direct *)(fdisk+item*DISKSIZE);

if(!strcmp("..",name))

{

if(cur_dir->directitem[j-1].sign!=1) /*-如果上级目录不是根目录-*/

{

point=strchr(bufferdir,'\\'); //查找字符串bufferdir中首次出现字符\ 的位置

while(point!=NULL)

{

point1=point+1; /*-减去'\'所占的空间,记录下次查找的起始地址-*/

point=strchr(point1,'\\');

}

*(point1-1)='\0'; /*-将上一级目录删除-*/

}

}

else

{

//if(name[0] !='\\')

bufferdir = strcat(bufferdir,"\\"); /*-修改当前目录-*/

bufferdir = strcat(bufferdir,name);

}

cur_dir=temp_dir; /*-将当前目录确定下来-*/

return 0;

}

void show()

{

printf("%s>",bufferdir);

}

void print()

{

printf("*********************************************************\n");

printf("*\t命令格式说明*\n");

printf("*\tcd 目录名更改当前目录*\n");

printf("*\tmkdir 目录名创建子目录*\n");

printf("*\trmdir 目录名删除子目录*\n");

printf("*\tdir 显示当前目录的子目录 *\n");

printf("*\tcreate 文件名创建文件*\n");

printf("*\tdel 文件名删除文件*\n");

printf("*\topen 文件名打开文件*\n");

printf("*\tclose 文件名关闭文件*\n");

printf("*\tread 读文件*\n");

printf("*\twrite 写文件*\n");

printf("*\texit 退出系统*\n");

printf("*********************************************************\n"); }

void main()

{

FILE *fp;

char ch;

char a[100];

char code[11][10];

char name[10];

int i,flag,r_size;

char *contect;

contect = (char *)malloc(MAX_WRITE*sizeof(char));

if((fp=fopen("disk.dat","rb"))==NULL)

{

printf("You have not format,Do you want format?(y/n)");

scanf("%c",&ch);

if(ch=='y')

{

initfile();

printf("Successfully format! \n");

}

else

{

return;

}

}

enter();

show();

strcpy(code[0],"exit");

strcpy(code[1],"create");

strcpy(code[2],"open");

strcpy(code[3],"close");

strcpy(code[4],"write");

strcpy(code[5],"read");

strcpy(code[6],"del");

strcpy(code[7],"mkdir");

strcpy(code[8],"rmdir");

strcpy(code[9],"dir");

strcpy(code[10],"cd");

while(1)

{

scanf("%s",a);

for(i=0;i<11;i++)

{

if(!strcmp(code[i],a))

break;

}

switch(i)

{

case 0: //退出文件系统

free(contect);

halt();

return;

case 1: //创建文件

scanf("%s",name);

flag = create(name);

if(flag==-1)

{

printf("Error: \n The length is too long !\n");

}

else if(flag==-2)

{

printf("Error: \n The direct item is already full !\n");

}

else if(flag==-3)

{

printf("Error: \n The number of openfile is too much !\n");

}

else if(flag==-4)

printf("Error: \n The name is already in the direct !\n");

}

else if(flag==-5)

{

printf("Error: \n The disk space is full!\n");

}

else

{

printf("Successfully create a file! \n");

}

show();

break;

case 2://打开文件

scanf("%s",name);

fd = open(name);

if(fd == -1)

{

printf("Error: \n The open file not exit! \n");

}

else if(fd == -2)

{

printf("Error: \n The file have already opened! \n");

}

else if(fd == -3)

{

printf("Error: \n The number of open file is too much! \n");

}

else if(fd == -4)

{

printf("Error: \n It is a direct,can not open for read or write! \n");

}

else

{

printf("Successfully opened! \n");

}

show();

break;

case 3://关闭文件

scanf("%s",name);

flag = close(name);

if(flag == -1)

{

Linux硬盘管理原理及操作命令

Linux硬盘管理原理及操作命令 1、Linux硬盘管理概述 Linux系统下,系统识别到硬盘后会为硬盘创建一份初始分区表。硬盘在分区后才可以使用,系统通过分区表来管理硬盘的使用。Linux系统中,IDE存储设备一般被识别为hd(第一块硬盘即为had),SATA、USB、SCSI存储设备一般被识别为sd(如sda、sdb)。 硬盘管理方式可分为分区管理和逻辑卷管理。 硬盘分区有两种方式: 1)传统MBR方式;这种方式下,一块硬盘最多可分为四个主分区(primary),如果已经给硬盘创建了4个主分区,那么即使硬盘还有剩余空间,也不能再分区。如 果想要创建更多的分区,需要创建扩展分区(extended),再在扩展分区上创建逻 辑分区,逻辑分区的分区号一定是从5开始,单个分区最大不超过2TB; 2)GPT方式;除了不受到类似传统MBR分区的限制(主分区最多4个、分区不超过2TB),还提供了分区表的冗余来实现分区表的安全和备份。 逻辑卷管理与直接使用硬盘分区管理的区别主要是,直接分区管理的硬盘后期分区不可再改变大小,如果要改变,只能删除已有分区重新分区,而逻辑卷则可根据实际需要灵活扩充空间大小(安装完系统后,后期如果存储空间不够,可以添加硬盘【win7/xp等个人操作系统可能需要安装硬盘驱动,虚拟机添加虚拟硬盘】,再建立逻辑卷或扩充原有逻辑卷)。原理可以这样理解:直接进行分区管理的硬盘分区彼此独立,无法组合,就像一个个圆形,而逻辑卷则是方形,可以相互组合来扩充,通过对组合后的硬盘再进行分区来管理。逻辑卷管理的步骤: 1)先对传统方式创建的分区进行初始化,创建物理卷; 2)创建物理卷组,将单个或多个物理卷进行组合; 3)在卷组中提取容量来创建逻辑卷; 不管哪种方式来管理硬盘,创建的分区都要进行格式化后挂载到文件系统中的某个目录下,分区空间才可以使用。 2、相关命令 1)MBR方式分区管理命令: 查看硬盘及分区情况:# fdisk -l [设备名称] 硬盘分区:fdisk -cu设备名称,如: # fdisk -cu /dev/sdb

Linux文件信息命令和基本文件管理(精品文档)_共8页

7.2 Linux文件信息命令和基本文件管理 实验目的 通过本实验: 1) 使用控制字符执行特殊功能; 2) 使用file和strings命令确定文件类型; 3) 使用cat利more命令显示文本文件的内容; 4) 使用head和tail命令显示文本文件的部分内容; 5) 使用wc命令确定单词、行和字符数; 6) 使用diff命令比较2个文件。 7) 回顾文件和目录命名约定; 8) 使用touch命令创建新文件; 9) 使用mkdir命令创建新目录; 10) 使用rm命令删除文件; 11) 使用rm -r命令删除目录。 实验内容与步骤 1. 文件信息命令 步骤1:开机,登录进入GNOME。 在GNOME登录框中填写指导老师分配的用户名和口令并登录。 步骤2:访问命令行。 单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开终端窗口。 步骤3:使用控制字符执行特殊功能。 控制字符用来执行特殊的作业,如中止和启动屏幕输出。 大多数PC键盘有两个控制键。它们通常标记为Ctr1,可以在键盘的左右下角找到。为了输入一个控制字符序列,可按住Ctrl键不放,然后按下键盘上相应的字符。 Ctrl + C:中断当前活动。当你在csh中键入一个不可识别的命令行(例如,$ls “) ,收到第2个提示符的时候,Ctrl + C也可以用于恢复shell提示符。 Ctrl + Z:终止当前活动。显示ls命令的手册页面(man ls) ,然后使用Ctrl -z中止输出。 当你接下Ctrl + Z的时候,发生了什么事情? ___终止当前活动__________________________________________________ Ctrl + D:表示文件的末尾或者退出。Ctrl + D用于退出一些Linux工具程序(bc、write等) ,退出一个终端窗口,注销一个终端会话或者命令行登录会话。作为一个一般的规则,当您出现“死机”时,或者如果Ctrl + C不起作用,可试试Ctrl + D。例如: 1) 在shell提示符下键入bc,启动基本的计算器工具程序。

第9章文件管理

第9章文件管理 一、填空 1.一个文件的文件名是在时给出的。 2.所谓“文件系统”,由与文件管理有关的、被管理的文件以及管理所需要的数据结构三部分组成。 3.是辅助存储器与内存之间进行信息传输的单位。 4.在用位示图管理磁盘存储空间时,位示图的尺寸由磁盘的决定。 5.采用空闲区表法管理磁盘存储空间,类似于存储管理中采用方法管理内存储器。 6.操作系统是通过感知一个文件的存在的。 7.按用户对文件的存取权限将用户分成若干组,规定每一组用户对文件的访问权限。这样,所有用户组存取权限的集合称为该文件的。 8.根据在辅存上的不同存储方式,文件可以有顺序、和索引三种不同的物理结构。 9.如果把文件视为有序的字符集合,在其内部不再对信息进行组织划分,那么这种文件的逻辑结构被称为。 10.如果用户把文件信息划分成一个个记录,存取时以记录为单位进行,那么这种文件的逻辑结构称为。 二、选择 1.下面的不是文件的存储结构。 A.索引文件B.记录式文件 C.串联文件D.连续文件 2.有一磁盘,共有10个柱面,每个柱面20个磁道,每个盘面分成16个扇区。采用位示图对其存储空间进行管理。如果字长是16个二进制位,那么位示图共需字。 A.200 B.128 C.256 D.100 3.操作系统为每一个文件开辟一个存储区,在它的里面记录着该文件的有关信息。这就是所谓的。 A.进程控制块B.文件控制块 C.设备控制块D.作业控制块 4.文件控制块的英文缩写符号是。 A.PCB B.DCB C.FCB D.JCB 5.一个文件的绝对路径名总是以打头。 A.磁盘名B.字符串C.分隔符D.文件名6.一个文件的绝对路径名是从开始,逐步沿着每一级子目录向下,最后到达指定文件的整个通路上所有子目录名组成的一个字符串。 A.当前目录B.根目录 C.多级目录D.二级目录

数据恢复的常用方法

数据恢复的常用方法 硬盘作为计算机中存储数据的载体,往往会因为硬件、软件,恶意与非恶意破坏等因素而出现存储数据完全或部分丢失的现象,特别是在这个随时可能遭受攻击的网络时代,硬盘数据还面临网络方面的破坏。重要数据文件一旦丢失,损失势必难以估量…… 面对这些潜在的危险,再周密和谨慎的数据备份工作都不可能为我们的数据文件提供实时、完整的保护。因此,如何在硬盘数据被破坏后进行妥善而有效的数据拯救,就成为广大用户普遍关心的一件事情。下面本文就硬盘存储数据丢失的原因、恢复技术及相关保护措施方面进行了一些探讨。 一、数据丢失的原因及产生现象 造成数据丢失的原因大致可以分为三大类:软件、硬件和网络。 1.软件方面的起因比较复杂,通常有病毒感染、误格式化、误分区、误克隆、误作等几种,具体表现为无作系统,读盘错误,文件找不到、打不开、乱码,报告无分区等。 2.硬件方面的起因有磁盘划伤、磁组损坏、芯片及其它原器件烧坏、突然断电等。具体表现为硬盘不认,盘体有异常响声或电机不转、通电后无任何声音等现象。 3.网络方面的起因有共享漏洞被探知并利用此漏洞进行的数据破坏、木马病毒等。 上述三种数据的丢失往往都是瞬间发生的事情,能否正确地第一时间判断出数据丢失的原因对于下一步所讲述的数据恢复是很重要的。 二、硬盘数据恢复的可能性与成功率 什么是数据修复呢,数据修复就是把遭受破坏或误作导致丢失的数据找回来的方法。包括硬盘、软盘、可移动磁盘的数据恢复等。数据恢复可以针对不同作系统(DOS、Windows9X/NT/2000、UNIX、NOVELL 等)的数据进行恢复,对于一些比较特殊的数据丢失原因,数据恢复可能会出现完全不能恢复或只能恢复部分数据,如:数据被覆盖(OVERWRITE)、低级格式化(LOWLEVELFORMAT)、磁盘盘片严重损伤等。 1.恢复数据的几项原则 如果希望在数据恢复时保持最大程度的恢复率,应遵循以下几项原则: 发现问题时:如果可能,应立即停止所有的写作,并进行必要的数据备份,出现明显的硬件故障时,不要尝试修复,应送往专业的数据恢复公司。 恢复数据时:如果可能,则应立即进行必要的数据备份,并优先抢救最关键的数据,在恢复分区时则应优先修复扩展分区,再修复C。 2.数据恢复可能性分析 硬盘数据丢失后,数据还能恢复吗?这是许多电脑用户最关心的问题。根据现有的数据恢复实践和经验表明:大多数情况下,用户找不到的数据往往并没有真正的丢失和被破坏,80%的情况下,数据都是可以复原的。下面是常见的几种数据恢复可能性与成功率分析: ·病毒破坏 破坏硬盘数据信息是电脑病毒主要的设计目的与破坏手段。有些病毒可以篡改、删除用户文件数据,导致文件无法打开,或文件丢失;有些更具破坏力的病毒则修改系统数据,导致计算机无法正常启动和运行。针对病毒导致的硬盘数据丢失,国内各大杀毒软件厂商都掌握了相当成熟的恢复经验,例如江民科技的KV系列杀毒软件就曾将恢复这类数据的过程与方面在软件中设计成了一个模块,即使是初级的用户也只需经过简单的几个步骤就可恢复85~100%的数据。 ·软件破坏 软件破坏通常包括:误删除、误格式化、误分区、误克隆等。目前的硬盘数据恢复技术对于软件破坏而导致的数据丢失恢复成功率相当的高平均90%以上。此类数据恢复技术已经可以对FAT12、FAT16、FAT32、NTFS4.0、NTFS5.0等分区格式,DOS、Windows9X/ME、WindowsNT/2000、WindowsXP、UNIX、Linux 等作系统完全兼容。 ·硬件破坏 硬件原因导致数据丢失,如果是介质设备硬件损坏,电路板有明显的烧毁痕迹或设备(如硬盘)有异响或BIOS不认硬盘参数,这种情况下的数据恢复对于个人用户显得非常困难,所以遇到这种情况,

linux下磁盘分区详解 图文

linux下磁盘分区详解图文 来源:互联网作者:佚名时间:07-10 21:28:58【大中小】linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从a—d)因为IDE硬盘最多四个,SCSI,SATA,USB硬盘为sdx(x为a—z)),硬盘主分区最多为4个,不用说大家也知道 Centos下磁盘管理 1.磁盘分区格式说明 linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从a—d)因为ID E硬盘最多四个,SCSI,SATA,USB硬盘为sdx(x为a—z)),硬盘主分区最多为4个,不用说大家也知道…..所以主分区从sdb1开始到sdb4,逻辑分区从sdb5开始,(逻辑分区永远从sdb5开始…)设备名可以使用fdisk –l查看 2.分区详解 使用ssh远程连接工具登录到系统,使用fdisk -l命令查看磁盘状态 此处可以看到两块硬盘hda和hdb,第一块硬盘hda是装好系统的。hdb硬盘是未进行分区的。 本例将这个10G的硬盘分区,分区计划:分一个主分区,大小3G,文件格式ext3.三个逻辑分区,大小分别为2G,2G,3G。实际分区个数和大小可论情况所定。 下面就是分区的详细步骤,由于是每一步都进行了截图和说明,内容略显复杂,其实很简单。输入 fdisk /dev/hdb 然后回车,给硬盘进行分区。如下图

输入n回车新建分区,接着再输入p回车新建主分区,如图 此处要求选择分区号在1-4间,输入1回车 First cylinder (1-20805, default 1):这里是设置分区起始的柱面,直接回车选择默认即可,回车后如下图 Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805):此处是设置分区结束柱面,+3G表示从起始柱面开始向后3G结束,也是是设置分区大小为3G,输入+3G后回车,如下图所示

习题03_ Linux文件管理

习题03_ Linux文件管理 一、单选 1.对名为fido的文件用命令“chmod 551 fido”进行了修改,则它的许可权是(D )。 A. -rwxr-xr-x B. –rwxr--r-- C. -r--r--r-- D. -r-xr-x--x 2. 用ls –al 命令列出下面的文件列表,(D )文件是符号连接文件。 A. -rw-rw-rw- 2 hel-s users 56 Sep 09 11:05 hello B. -rwxrwxrwx 2 hel-s users 56 Sep 09 11:05 goodbey C. drwxr--r-- 1 hel users 1024 Sep 10 08:10 zhang D. lrwxr--r-- 1 hel users 2024 Sep 12 08:12 cheng 3. 下列关于链接描述,错误的是( B )。 A. 硬链接就是让链接文件的i节点号指向被链接文件的i节点 B. 硬链接和符号连接都是产生一个新的i节点 C. 链接分为硬链接和符号链接 D. 硬连接不能链接目录文件 4. 文件权限读、写、执行的三种标志符号依次是( A )。 A. rwx B. Xrw C. rdx D. srw 5. Linux文件权限一共10位长度,分成四段,第三段表示的内容是( C )。 A. 文件类型 B. 文件所有者的权限 C. 文件所有者所在组的权限 D. 其他用户的权限 6. 如何删除一个非空子目录/tmp ( B )。 A. del /tmp/* B. rm -rf /tmp C. rm -Ra /tmp/* D. rm –rf /tmp/* 7. 如果执行命令#chmod 746 file.txt,那么该文件的权限是( A )。 A. rwxr--rw- B. rw-r--r— C. --xr—rwx D. rwxr--r— 8. 如果要列出一个目录下的所有文件需要使用命令行( C )。 A. ls –l B. ls C. ls –a D. ls –d 9. 除非特别指定,cp假定要拷贝的文件在下面哪个目录下( D )。 A. 用户目录 B. home目录 C. root目录 D. 当前目录 10. Linux启动的第一个进程init启动的第一个脚本程序是( B )。 A. /etc/rc.d/init.d B. /etc/rc.d/rc.sysinit C. /etc/rc.d/rc5.d D. /etc/rc.d/rc3.d 11. 用来分离目录名和文件名的字符是( B )。 A. dash (-) B. slash (/) C. period (.) D. asterisk(*) 12. 用"rm -i",系统会提示什么来让你确认( B )。 A. 命令行的每个选项 B. 是否真的删除

Ghost For Linux备份和恢复磁盘系统

Ghost For Linux 使用手册 一、准备环境 本手册测试环境为vmware workstation 9.0系统,安装windows xp pro操作系统,分区为4G大小,做全盘的镜像和恢复。 需要工具:ghost for linux0.45版本的镜像工具。 使用本手册,需要熟练使用vmware虚拟机软件。 应用环境包含了一个FTP服务器端,需要设置可以读写访问的目录,用户名和密码都设置成:nihao;本次使用的是FileZilla_Server,打开FTP服务的主界面,设置ftp根目录为可读写。 设置完成后,最小化到任务栏即可。 本方法,适用于所有X86结构的windows和linux操作系统,支持全盘和分区的备份,通过ftp服务器的方式备份,保证了全网系统镜像的统一性和安全性,安装完成好系统后,依据软件和操作系统的安装配置手册,对软件和操作系统进行设置即可投入使用。 二、备份系统 2.1、虚拟机开机准备 准备好工具后,打开虚拟机并开机, 运行光盘系统。 查看信息后,三次回车, 检测系统的网络配置 设置本地键盘模式 基本信息查看 回车键打开系统命令提示符: 输入G41,打开ghost for linux的主界面 选择网络模式 出现主界面 2.2、一些配置 需要设置FTP服务器地址,用户名和密码,备份到FTP上边的文件名,压缩的格式等信息,如下图所示。 本地IP地址通过虚拟机DHCP自动生成,实际使用过程中,需要手动设置,保障网络的正常通讯即可。

设置FTP的备份用户名:xp_ 设置好的界面如下: 2.3、开始备份全盘 设置完成后,选择H:backup,开始备份全盘系统,注意:只选取HAD全盘即可,后边的分区不用选择。 开始进行全盘备份。 FTP服务器状态: 等待返回到主界面后,完成此次全盘镜像的备份,FTP服务器端的文件备份名:xp_ 注意:备份系统过程中,一定要等待系统备份完成,返回主界面,否则可能会存在备份不完全的情况。 三、还原系统 还原系统的过程与备份过程保持一致,是一个相反的过程,对应图片参考备份过程;注意实际操作过程中的IP地址和用户名密码的设置。 四、管理系统镜像 在AFC中央数据机房里,设置一台全网可以访问的FTP服务器,仅作为系统备份和环境使用。

(完整版)linux文件系统管理-权限管理实验4报告

实验报告 课程Linux系统应用与开发教程实验名称linux文件系统管理-权限管理(高级设置) 一、实验目的 1、掌握Linux文件系统权限的设置 2、掌握linux用户帐号与组管理 3、掌握linux 文件共享的设置方法 4、掌握linux 文件共享的权限设置方法 二、实验内容 1、使用root帐号通过系统提供的6个虚拟控制台登陆到linux,或在x-windows开启一个终端。 2、完成以下的实验内容 (1)、假设你是系统管理员:现要在公司linux服务器系统中新增一些用户与一个用户组。 ?使用groupadd account 添加一个名为account的组 ?使用useradd -G account acc-user1,(该命令将添加一个用户名为acc-user1的用户, 同时会建立一个与用户名同名的私有组(该私有组为用户的默认组,这个组中只有一个用户名),并把该用户将加入account的标准组,同时,按同样的方法建立acc-user2、acc-user3、acc-user4。 ?建立用户后,请使用x-window中的用户与组管理工具查看用户与组建立情况,检查用户与组的归属情况。 (2)、开启多个控制台,分别使用acc-user1、acc-user2、acc-user3登陆系统(可以在控制台分别登陆,也可以在X-windows中多开几个终端程序,默认使用root登陆,然后使用su命令通过切换用户的方式登陆,其语法为“su - user-name”,提示可以在登陆成功后运行命令“id”查看当前登陆的用户属于哪些组,当前的默认组是什么?) (3)、为account组建立一个公共共享目录/home/account-share,满足以下的权限设定要求,以及设置何种的umask: ?该目录的拥有者为acc-user1,所属组为account。 ?在该目录下建立一个/home/account-share/full-share的子目录,修改该目录的权限,使得account组的成员均能在对该目录有完全控制权限,account组外的其他用户没有任何权限,即account组的成员都可以在该目录下建立文件,同时在该子目录full-share下建立的文件,只有文件建立者有权限删除,并且每个用户在该子目录full-share下建立的文件也能自动与该account组成员可读共享。 ?在/home/account-share/为每个用户建立一个与用户名同名的子目录(如/home/account-share/acc-user1为用户acc-user1的目录,其拥有者为acc-user1,所在的组为account),配置该子目录的拥有者有完全控制权限,而同组用户只能读取,同时在用户在该目录下建立的文件,可供同组用户读。 (4)、考虑完成以上的共享目录权限设置,应注意哪些设置。包括目录的权限,目录的拥有者,目录所在的组,具体文件的权限,umask设置等。 (5)、实验报告应体现出使用不同身份的用户对所配置目录的访问测试过程。 三、实验环境 安装有vmware或visual pc软件的window主机,系统中有提供turbolinux或redhat的硬盘

模拟磁盘文件管理的程序

模拟磁盘文件管理的程序 一、课程设计内容 ⑴自定义磁盘文件管理的数据结构; ⑵能够自由创建、修改、删除文件; ⑶文件具有一定自定义的属性; ⑷能够显示当前系统文件的状态。 二、课程设计的数据结构说明 程序中定义了两个类: class file//文件类 {private: char name[10]; //文件名 public: int tag; //删除标记 1:已删 0:未删 file( ){ } char *getname( ){return name;} //获取文件名 int gettag( ){return tag;} //获取删除标记 int getlength() {return length;} //获取文件大小 int getblocknum() {return blocknum;} // 磁盘块数 int getblocksum1(){return blocksum1;} //磁盘块号的始点 int getblocksum2(){return blocksum2;} //磁盘块号的终点 int length,blocknum,blocksum1,blocksum2; void setname(char na[ ] ) {strcpy(name,na);} //设置文件名 void delwenjian(){ tag=1; }//设置删除标记 1:已删 0:未删 void creatfile(char *na,int L,int num,int s1,int s2) //创建文件 void deltefile(char *na) {tag=1; strcpy(name,na);} //删除文件 void disp( )//输出文件信息 class fdatabase //文件库类 { private: int top; //文件记录指针 file f[50]; public: fdatabase(){top=-1;} //构造函数 int search(char *fname)//按文件名查找 int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在 int deltefile(char *na)//删除文件时先查找是否存在 void disp() //输出所有文件信息 };

数据恢复精灵官方图文教程----恢复整个磁盘的文件

数据恢复精灵官方图文教程----恢复整个磁盘的文件 如果一个磁盘的分区表信息严重损坏,导致无法通过“恢复丢失的分区”功能找到分区时,可以使用“恢复整个磁盘的文件”功能直接从磁盘上搜索文件。它会扫描整个磁盘,搜索完成后,软件会尽可能完整地还原文件夹层次结构,并将文件按其所属分区归类。 要开始从整个磁盘恢复文件,请点击数据恢复精灵软件主界面上的“恢复整个磁盘的文件”按钮。如下图所示: 本功能将以向导的方式,依次执行如下五个步骤:“1、选择磁盘”、“2、扫描文件”、“3、选择要恢复的文件”、“4、选择目标文件夹”、“5、保存文件”。

先选择要恢复的磁盘。所选磁盘的有关信息(包括容量、型号、当前分区状况等)将显示在右边的窗口中。如下图:

选择磁盘后,如果不想全盘恢复,只需要从磁盘的某一部分恢复文件,还可以设置扫描范围。比如可以扫描某一个分区、或某个未分区区域(空闲区域),甚至可以指定任意范围。 如果在之前恢复过该分区的文件并保存了恢复进度,可以在此时点击“加载扫描进度”按钮,以便继续上次未完成的扫描。 选择好要恢复的磁盘并设置好扫描范围后,就可以点击“下一步”按钮开始搜索文件了。如下图:

扫描完成后,软件将显示搜索到的所有分区及其文件。显示方式和Windows系统的“资源管理器”类似。左侧显示分区及文件目录,右侧显示文件列表。在每个文件及文件夹图标左侧均有一个复选框。此时,请勾选所有需要恢复的文件及文件夹,然后点击“下一步”按钮。当您点击了某个文件时,在右下方的窗口中会显示该文件的预览,可以通过预览来判断文件能否被成功恢复。软件支持文档、图片、视频、音频文件的预览。

Linux文件系统与磁盘管理LVM

硬盘的结构与分区? 磁头Header,磁轨(Track),磁柱(Cylinder) ? 扇区(Sector) 512字节 分区(Partition) *指定从哪个磁柱(起始磁柱)到哪个磁柱(结束磁柱)的范围存储以何种文件系统存储 * MBR(Master Booter Recorder) 文件系统 *逻辑块(Block) 分区时文件系统所指定的最小存储单位

df 命令格式: df 选项 Linux下的磁盘操作命令显示目前硬盘总容量和可用容量 装置或设备名 如: df –h /dev/sda 参数: -h 以M或G方式显示 du 显示目录或者文件的容量命令格式: du 选项目录名或者装置名如: du –h /home 参数: -h 以M或G方式显示

硬盘的分割与格式化? fdisk工具的使用 fdisk -l [设备名] 显示所选设备的分区情况 实验一: 如何调整linux分区 *删除磁盘分区 *新增磁盘分区 *磁盘格式化 mke2fs -j[b] 分区代号 b : 指定块的大小,支持1024,2048,4096 实验二: linux里如何添加硬盘

特殊的文件系统LVM ? 什么是LVM:PV,VG,PE,LV LVM : Logical Volume Manager 逻辑卷管理PV: Physical Volume 物理卷VG: Volume Group 卷组PE: Physical Extend LVM块LV: Logical Volume 逻辑卷组

特殊的文件系统LVM

特殊的文件系统LVM ? LVM文件系统资料写入方式 *线性模式(linear) 如将/dev/sdb1,/dev/sdb2两个物理分区一起加入,则资料是先将 /dev/sdb1写满,然后再写/dev/sdb2 *交错模式(triped) 将一份资料分成两份,然后再分别写如两个分区 注:LVM主要用途是能够动态的扩展一个硬盘分区的大小,并不特别注重性能

操作系统磁盘文件管理源码

#include #include #include #define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024 //磁盘块数目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号 #define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小 #define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5 //最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名 8位*/ char property; /*属性 1位目录 0位普通文件*/ int size; /*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录起始盘块号*/ int next; /*子目录起始盘块号*/ int sign; /*1是根目录 0不是根目录*/ }directitem[MSD+2]; }; struct opentable { struct openttableitem { char name[9]; /*文件名*/ int firstdisk; /*起始盘块号*/

Unix,Linux 磁盘 IO 性能监控命令

Unix/Linux 磁盘I/O 性能监控命令 磁盘I/O 性能监控指标和调优方法 在介绍磁盘I/O 监控命令前,我们需要了解磁盘I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能。磁盘I/O 性能监控的指标主要包括: 指标1:每秒I/O 数(IOPS 或tps) 对于磁盘来说,一次磁盘的连续读或者连续写称为一次磁盘I/O, 磁盘的IOPS 就是每秒磁盘连续读次数和连续写次数之和。当传输小块不连续数据时,该指标有重要参考意义。 指标2:吞吐量(Throughput) 指硬盘传输数据流的速度,传输数据为读出数据和写入数据的和。其单位一般为Kbps, MB/s 等。当传输大块不连续数据的数据,该指标有重要参考作用。 指标3:平均I/O 数据尺寸 平均I/O 数据尺寸为吞吐量除以I/O 数目,该指标对揭示磁盘使用模式有重要意义。一般来说,如果平均I/O 数据尺寸小于32K,可认为磁盘使用模式以随机存取为主;如果平均每次I/O 数据尺寸大于 32K,可认为磁盘使用模式以顺序存取为主。 指标4:磁盘活动时间百分比(Utilization) 磁盘处于活动时间的百分比,即磁盘利用率,磁盘在数据传输和处理命令(如寻道)处于活动状态。磁盘利用率与资源争用程度成正比,与性能成反比。也就是说磁盘利用率越高,资源争用就越严重,性能也就越差,响应时间就越长。一般来说,如果磁盘利用率超过70%,应用进程将花费较长的时间等待I/O 完成,因为绝大多数进程在等待过程中将被阻塞或休眠。 指标5:服务时间(Service Time) 指磁盘读或写操作执行的时间,包括寻道,旋转时延,和数据传输等时间。其大小一般和磁盘性能有关,CPU/ 内存的负荷也会对其有影响,请求过多也会间接导致服务时间的增加。如果该值持续超过20ms,一般可考虑会对上层应用产生影响。 指标6:I/O 等待队列长度(Queue Length) 指待处理的I/O 请求的数目,如果I/O 请求压力持续超出磁盘处理能力,该值将增加。如果单块磁盘的队列长度持续超过2,一般认为该磁盘存在I/O 性能问题。需要注意的是,如果该磁盘为磁盘阵列虚拟的逻辑驱动器,需要再将该值除以组成这个逻辑驱动器的实际物理磁盘数目,以获得平均单块硬盘的I/O 等待队列长度。 指标7:等待时间(Wait Time) 指磁盘读或写操作等待执行的时间,即在队列中排队的时间。如果I/O 请求持续超出磁盘处理能力,意味着来不及处理的I/O 请求不得不在队列中等待较长时间。 通过监控以上指标,并将这些指标数值与历史数据,经验数据以及磁盘标称值对比,必要时结合CPU、内存、交换分区的使用状况,不难发现磁盘I/O 潜在或已经出现的问题。但如果避免和解决这些问题呢?这就需要利用到磁盘I/O 性能优化方面的知识和技术。限于本文主题和篇幅,仅列出一些常用的优化方法供读者参考: 1.调整数据布局,尽量将I/O 请求较合理的分配到所有物理磁盘中。 2.对于RAID 磁盘阵列,尽量使应用程序I/O 等于条带尺寸或者为条带尺寸的倍数。并选取合适 的RAID 方式,如RAID10,RAID5。 3.增大磁盘驱动程序的队列深度,但不要超过磁盘的处理能力,否则,部分I/O 请求会因为丢失 而重新发出,这将降低性能。 4.应用缓存技术减少应用存取磁盘的次数,缓存技术可应用在文件系统级别或者应用程序级别。

实验 Linux文件和目录操作

实验Linux文件和目录操作(1) 一、实验内容 练习Linux文件和目录操作命令。 二、实验目的 掌握文件与目录管理命令 掌握文件内容查阅命令 三、实验题目 1. 文件与目录管理 (1) 查看CentOS根目录下有哪些内容? (2) 进入/tmp目录,以自己的学号建一个目录,并进入该目录。 (3) 显示目前所在的目录。 (4) 在当前目录下,建立权限为741的目录test1,查看是否创建成功。 (5) 在目录test1下建立目录test2/teat3/test4。 (6) 进入test2,删除目录test3/test4。 (7) 将root用户家目录下的.bashrc复制到/tmp下,并更名为bashrc (8) 重复步骤6,要求在覆盖前询问是否覆盖。 (9) 复制目录/etc/下的内容到/tmp下。 (10) 在当前目录下建立文件aaa。 (11)查看该文件的权限、大小及时间 (12) 强制删除该文件。 (13) 将/tmp下的bashrc移到/tmp/test1/test2中。 (14) 将/test1目录及其下面包含的所有文件删除。 2. 文件内容查阅、权限与文件查找 (1) 使用cat命令加行号显示文件/etc/issue的内容。 (2) 反向显示/etc/issue中的内容。 (3) 用nl列出/etc/issue中的内容。 (4) 使用more命令查看文件/etc/man.config (5) 使用less命令前后翻看文件/etc/man.config中的内容 (6) 使用head命令查看文件/etc/man.config前20行 (7) 使用less命令查看文件/etc/man.config后5行 (8) 查看文件/etc/man.config前20行中后5行的内容 (9) 将/usr/bin/passwd中的内容使用ASCII方式输出 (10) 进入/tmp目录,将/root/.bashrc复制成bashrc,复制完全的属性,检查其日期 (11) 修改文件bashrc的时间为当前时间

Linux磁盘管理命令l

Linux磁盘管理命令 功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。 语法:df [选项] 说明:df命令可显示所有文件系统对i节点和磁盘块的使用情况。 该命令各个选项的含义如下: -a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。 -k 以k字节为单位显示。 -i 显示i节点信息,而不是磁盘块。 -t 显示各指定类型的文件系统的磁盘空间使用情况。 -x 列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。 -T 显示文件系统类型。 du命令 du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况。功能:统计目录(或文件)所占磁盘空间的大小。 语法:du [选项] [Names…] 说明:该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出Names,则对当前目录进行统计。 该命令的各个选项含义如下: -s 对每个Names参数只给出占用的数据块总数。 -a 递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。 -b 以字节为单位列出磁盘空间使用情况(系统缺省以k字节为单位)。-k 以1024字节为单位列出磁盘空间使用情况。 -c 最后再加上一个总计(系统缺省设置)。 -l 计算所有的文件大小,对硬链接文件,则计算多次。 -x 跳过在不同文件系统上的目录不予统计。 dd命令 功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的diskcopy命令的作用。

操作系统实验5文件系统:Linux文件管理

实验5 文件系统:Linux文件管理 1.实验目的 (1)掌握Linux提供的文件系统调用的使用方法; (2)熟悉文件和目录操作的系统调用用户接口; (3)了解操作系统文件系统的工作原理和工作方式。 2.实验内容 (1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:*********** 0. 退出 1. 创建新文件 2. 写文件 3. 读文件 4. 复制文件 5. 修改文件权限 6. 查看文件权限 7. 创建子目录 8. 删除子目录 9. 改变当前目录到指定目录 10. 链接操作 *********** 代码: #include #include #include #include #include #include #include #include void menu(void); void openfile(void); void writefile(void); void readfile(void); void copyfile(void); void chmd(void); void ckqx(void); void cjml(void); void scml(void); void ggml(void); void ylj(void); int main() { int choose; int suliangjin=1;

menu(); scanf("%d",&choose); while(choose!=0) { switch(choose) { case 1:openfile();break; case 2:writefile();break; case 3:readfile();break; case 4:copyfile();break; case 5:chmd();break; case 6:ckqx();break; case 7:cjml();break; case 8:scml();break; case 9:ggml();break; case 10:ylj();break; } menu(); scanf("%d",&choose); } return 0; } void menu(void) { printf("文件系统\n"); printf("1.创建新文件\n"); printf("2.写文件\n"); printf("3.读文件\n"); printf("4.复制文件\n"); printf("5.修改文件权限\n"); printf("6.查看文件权限\n"); printf("7.创建子目录\n"); printf("8.删除子目录\n"); printf("9.改变目前目录到指定目录\n"); printf("10.链接操作\n"); printf("0.退出\n"); printf("请输入您的选择...\n"); } void openfile(void) { int fd; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");

磁盘管理和文件系统管理

实验三磁盘管理和文件系统管理 一、 掌握Windows Server 2003系统中的磁盘管理和文件系统管理,包括基本磁盘中分区的创建,动态磁盘中各种动态卷的创建及DFS的配置。 二、实验环境: Pentium 550Hz以上的CPU。 建议至少256MB的内存 建议硬盘至少2GB,并有1GB空闲空间。 三、实验内容: 磁盘的管理。 文件系统的管理。 四、实验步骤: 1.在虚拟机中再添加两块磁盘,如图1-1。 图1-1 2.使用磁盘管理控制台,在基本磁盘中新建主磁盘分区、扩展磁盘分区和逻辑驱动器,并对已经创建好的分区做格式化、更改磁盘驱动器号及路径等几个操作,如图1-2。 创建主磁盘分区的步骤如下: (1)启动【磁盘管理】。 (2)选取一块未指派的磁盘空间,如下图所示,这里我们选择“磁盘1”。 (3)用鼠标右击该空间,在弹出的菜单中选择【创建磁盘分区】,在出现“欢迎使用创建磁盘分区向导”对话框时,单击【下一步】按钮。

图1-2 (4)【选择分区类型】对话框中,选择【主磁盘分区】,单击【下一步】按钮。 (5)在【指定分区大小】对话框中,输入该主磁盘分区的容量,此例中输入“500MB”。 完成后单击【下一步】按钮。 (6)下图所示的对话框中,完成其中的单选框选择,单击【下一步】按钮,出现格式化分区对话框。设置驱动器号为“H”。 (7)在【格式化分区】对话框中,可以选择是否格式化该分区;格式化该分区的方式 设置,如设置①使用的文件系统为NTFS;②分配单位大小:为默认值;③卷标为默认值; ④执行快速格式化⑤不启动文件及文件夹压缩功能。 (8)完成以上内容设置,系统进入【完成】对话框,并列出用户所设置的所有参数。 单击【完成】按钮,开始格式化该分区。

实验二--文件系统及磁盘管理

实验二文件系统及磁盘管理 1.文件系统管理 一、实验目的 ●掌握Linux下文件系统的创建、挂载与卸载。 ●掌握文件系统的自动挂载。 二、项目背景 某企业的Linux服务器中新增了一块硬盘/dev/sdb,请使用fdisk命令新建/dev/sdb1主分区和/dev/sdb2扩展分区,并在扩展分区中新建逻辑分区/dev/sdb5,并使用mkfs命令分别创建vfat和ext3文件系统。然后用fsck命令检查这两个文件系统;最后,把这两个文件系统挂载到系统上。 三、实验内容 练习Linux系统下文件系统的创建、挂载与卸载及自动挂载的实现。 四、实验步骤 子项目1.创建/dev/sdb1和/dev/sdb5 ●使用fdisk命令创建/dev/sdb1主分区。 ●使用fdisk命令创建/dev/sdb2扩展分区。

●使用fdisk命令创建/dev/sdb5逻辑分区。 ●输入子命令w,把设置写入硬盘分区表,退出fdisk并重新启动系统。 ●用mkfs命令在上述刚刚创建的分区上创建ext3文件系统和vfat文件系统。 ●用fsck命令检查上面创建的文件系统。 子项目2.挂载/dev/sdb1和/dev/sdb5 ●利用mkdir命令,在/mnt目录下建立挂载点,mountpoint1和mountpoint2。 ●把上述新创建的ext3分区挂载到/mnt/mountpoint1上。

●把上述新创建的vfat分区挂载到/mnt/mountpoint2上。 ●利用mount命令列出挂载到系统上的分区,查看挂载是否成功。 ●利用umount命令卸载上面的两个分区。 子项目3.实现/dev/sdb1和/dev/sdb5的自动挂载 ●编辑系统文件/etc/fstab文件,把上面两个分区加入此文件中。 ●重新启动系统,显示已经挂载到系统上的分区,检查设置是否成功。 子项目4.挂载光盘和U盘 ●取一张光盘放入光驱中,将光盘挂载到/media/cdrom目录下。查看光盘中的文件。 ●利用与上述相似的命令完成U盘的挂载与卸载。 五、实验思考题 1. 在Linux下能创建Windows 的分区吗?在Linux下能创建Windows的文件系统吗? Windows操作系统可以识别ext3文件系统吗? 2.系统挂装表的文件名?系统挂装表的作用是什么?其文件格式使什么? 3.利用mount命令挂装一个文件系统和将其写入/etc/fstab文件的区别是什么?

相关文档
相关文档 最新文档