在进行文件系统维护和管理过程中,会碰到这样一些问题,例如无法安装文件系统或者无法拆卸文件系统,当文件系统的超级块被破坏,而无法正常使用文件系统,如何修复rootvg中的主要文件系统,下面就讨论如何解决一些常见的文件系统问题。
一、恢复超级块错误
有些用户在使用fsck或mount命令时,当见到下面的提示信息时,可能是文件系统的超级块出了问题: fsck: Not an AIX3 file system
fsck: Not an AIXV3 file system
fsck: Not an AIX4 file system
fsck: Not an AIXV4 file system
fsck: Not a recognized file system type
mount: invalid argument
例如,当用户安装一个/allenfs文件系统时,出现下面的错误提示: #mount /allenfs
mount: 0506-324 Cannot mount /dev/lv1 on /allenfs: A system call received a parameter that is not valid
修复该文件系统时,出现下面错误提示,并异常终止: #fsck /dev/lv1
Not a recognized filesystem type (TERMINATED)
要解决这个问题,只能用备份的超级块来恢复主超级块,我们都知道,在文件系统中,1号逻辑块是主超级块,31号逻辑块是备份超级块,因此就把31号逻辑块上的内容写到1号逻辑块上去。
例如文件系统对应的逻辑卷为/dev/lv1,则恢复该文件系统的超级块命令如下:
#dd count=1 bs=4k skip=31 seek=1 if=/dev/lv1 of=/dev/lv1
当恢复完成,就要用fsck命令来检查文件系统的完整性:
#fsck /dev/lv1
Checking /dev/rlv1 (/allen)
Phase 0 - Check Log
log redo processing for /dev/rlv00
Phase 1 - Check Blocks and Sizes
Phase 2 - Check Pathnames
Phase 3 - Check Connectivity
Phase 4 - Check Reference Counts
Phase 5 - Check Inode Map
Phase 6 - Check Block Map
9 files 608 blocks 15776 free
在许多情况下,通过恢复备份超级块到主超级块可以解决这个问题,使文件系统处于正常工作状况下。如果这样做还不能解决问题,那只能删除文件系统,然后重新建立文件系统,再恢复备份的数据。
二、无法拆卸文件系统
如果有用户或程序在一个文件系统中活动,就无法拆卸这个文件系统,当使用拆卸命令时,会提示下面的错误:
Device busy 或者 A device is already mounted or cannot be unmounted 例如由于安装程序的异常终止或其它原因经常会遇到不能正常释放光驱(光驱是CDROM文件系统)的问题,当用户再次访问光盘驱动器时就产生错误0514- 062: 指定的设备忙。
按照下面的步骤去解决:
1、检查用户自己的当前工作目录是否在这个文件系统中,如果是,则用cd /命令使当前工作目录回到根目录,然后再试着拆卸文件系统;
2、如果还是不能拆卸文件系统,可能在文件系统有文件正在被打开使用,因此在拆卸文件系统之前应该关闭这些文件。有时候可能还有一些进程在使用这个文件系统的资源,可以使用fuser命令来检查有那些进程仍然在这个文件系统中活动。Fuser命令将显示在这个文件系统中正在活动的所有进程ID号。下面就 fuser命令使用的例子:
#fuser /dev/cd
/dev/cd: 2910 3466
如果使用fuser –u /dev/cd将在进程号后指出用户名。如果root用户用fuser –k /dev/cd命令,则给这些进程发出SIGKILL信号,来杀死这些进程。然后用kill命令将这些正在活动的进程杀死,然后再试着拆卸文件系统。例如: #kill –9 2910 3466
这时您可以用下面命令检查设备的状态是否为可用: #lsdev -Cc cdrom
或者 #lsdev –C –l cd0
(若为其它文件系统,将cd0换为文件系统的逻辑名)如果设备状态为可用,您就可以使用该设备或卸载文件系统。
3、如果文件系统仍然处于忙状态,不能被拆卸,可能是在这个文件系统中加载了一个内核扩展,这种情况用fuser命令无法检查到内核扩展,系统提供了一个检查内核扩展的工具——genkex,用这个命令可以显示目前已加载的所有扩展内核。
4、如果在一个文件系统还安装了另一个文件系统,则要直接拆卸这个文件系统也是不能成功,必须先将该文件系统中所有安装的文件系统拆卸掉,才能拆卸自己。使用 mount命令查看有那些文件系统还在安装在系统上,然后根据安装点将安装在这个文件系统中的所有其它文件系统用umount命令拆卸掉,再试着拆卸自己。
三、 无法删除文件系统
当一个文件系统可以用mount命令安装或用unmount拆卸,但是无法删除该文件系统,在删除时,系统会报如下错误
: 0516-306:get lvodm: unable to find in the device confgiguration data 发生此错误的原因可能是ODM数据库中的定义与实际不一致。可以用下面命令检查该文件系统的类型:
#lsvg -l rootvg
若类型显示为,则用synclvodm -P rootvg 和 syncvg -v rootvg 命令对卷组进行同步,之后,再用命令 lsvg -l rootvg 显示出正确的文件类型。此时可以成功删除该文件系统。
四、 修复rootvg中的主要文件系统和日志
如果要检查和修复rootvg中的/、/tmp、/usr、/var文件系统,必须先将它们卸载,然而在正常的多用户环境下是无法卸载这些文件系统,要完成这些工作必须在维护模式下进行。
首先重启动系统,在系统引导时按F6键(对于图形方式)或数字“6”键(对于字符方式)进入到系统的在线诊断(Online Diagnostics)服务模式,选择“5”进入单用户模式,即维护模式。
如果当前的AIX是AIX 324或325版本,还必须设置ODMDIR环境变量,命令如下:
#ODMDIR=/etc/objrepos;export ODMDIR
运行fsck命令清理检查上面提到的文件系统,命令如下:
#fsck /dev/hd4
#fsck /dev/hd2
#fsck /dev/hd3
#fsck /dev/hd9var
当然也可使用其fsck选项。如果rootvg中缺省文件系统的日志(JFSLOG)即/dev/hd8有问题,这时也可以重建它,命令如下:
#logform /dev/hd8
然后会提示您是否继续初始化,如果回答y,以前在/dev/hd8上的日志信息就被清掉。初始化成功后,输入exit命令就退出单用户模式,根据提示按回车进入多用户模式,这些文件系统会自动被安装上。最后用shutdown命令关闭系统。
UNIX ,是一个强大的多用户、多任务 *** 作系统,支持多种处理器架构,最早由Ken Thompson、Dennis Ritchie和Douglas McIlroy于1969年在AT&T的贝尔实验室开发。经过长期的发展和完善,目前已成长为一种主流的 *** 作系统技术和基于这种技术的产品大家族。由于UNIX具有技术成熟、可靠性高、网络和数据库功能强、伸缩性突出和开放性好等特色,可满足各行各业的实际需要,特别能满足企业重要业务的需要,已经成为主要的工作站平台和重要的企业 *** 作平台。
曾经是服务器 *** 作系统的首选,占据最大市场份额,但最近在跟WINDOWS SERVER以及Linux的竞争中有所失利。
下面是UNIX的代码,根据这个代码可以很好地了解UNIX的工作流程
1 maincpp
#include "headh"
#include "blockinodesuperblockh"
#include "initialh"
#include "useroph"
#include "fileh"
#include "dirh"
#include "commandh"
#include "chsomeh"
/////////////////////////////////////////////////////////////////////////////////////////
void main()
{
controlopen("controltxt",ios::in | ios::out | ios::nocreate);
int i;
control>>i;
controlclose();
if(i!=0)//不为0就初始化
{
initial();
}
controlopen("controltxt",ios::in | ios::out | ios::nocreate);
controlseekp(0);
control<<0;//默认是上次基础上继续下去不用再初始化
controlclose();
strcpy(curname,"root");//当前目录文件名为root
road[0]=0;//当前目录路径(存放从根目录到这里的结点号)
num=1;//最后位road[num-1]为当前目录文件i结点号
cout<<"请登陆系统\n";
while( !login() )//登陆为止
cout<<"wrong !!!\n";
cout<<" login success"<<endl;
cout<<"Welcome "<<auser<<"";
readsuper();
getcommand();//命令解析函数
writesuper();
}
2 blockinodesuperblockh
/////////////////////////////////////////////////////////////////////////////////////////
int ialloc()//申请一个i结点 返回结点号 否则返回-1
{
if(superblockfiptr>0)
{
int temp=superblockfistack[80-superblockfiptr];//当前可用
superblockfistack[80-superblockfiptr]=-1;
superblockfiptr--;
return temp;
}
return -1;
}
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
void ifree(int index)//指定一个结点号,回收一个i结点
{
diskopen("disktxt",ios::in | ios::out | ios::nocreate );//清空结点
diskseekp(514+64index+2(index/8));
disk<<setw(64)<<' ';
diskclose();
for(int i=80-superblockfiptr;i<80;i++)//结点号找到合适位置插入空闲结点号栈
{
if(superblockfistack<index)//小于它的前移一位
{
superblockfistack[i-1]=superblockfistack;
}
else//放在第一个大于它的结点号前面
{
superblockfistack[i-1]=index;
break;
}
}
superblockfiptr++;
}
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
/成组链接法/
int balloc()//申请一个盘块 返回盘块号 否则返回-1
{
int temp=superblockfbstack[10-superblockfbptr];
if(superblockfbptr==1)//是栈底了==>是记录盘块了
{
//是最后记录盘块最后号0(保留作栈底 分配不成功)
if(temp==0)
{
return -1;
}
superblockfbstack[10-superblockfbptr]=-1;
superblockfbptr=0;
//盘块内容读入栈
for(int i=0;i<10;i++)
{
int id,num=0;
diskopen("disktxt",ios::in | ios::out | ios::nocreate );
//先计算盘块内容个数num(最多10),最后盘块可能不到10个
diskseekg(514temp);
for(int i=0;i<10;i++)
{
disk>>id;
num++;
if(id==0) break;
}
diskseekg(514temp);//盘块内容读入栈
for(int j=10-num;j<10;j++)
{
disk>>id;
superblockfbstack[j]=id;
}
superblockfbptr=num;
diskclose();
}
diskopen("disktxt",ios::in | ios::out | ios::nocreate );//清空回收盘块
diskseekp(514temp);
disk<<setw(512)<<' ';
diskclose();
//盘块使用掉
return temp;
}
else//不是记录盘块==>盘块使用掉
{
superblockfbstack[10-superblockfbptr]=-1;
superblockfbptr--;
return temp;
}
}
/////////////////////////////////////////////////////////////////////////////////////////
详细介绍:
Ken和Dennis最早是在贝尔实验室开发Unix的,此后的10年,Unix在学术机构和大型企业中得到了广泛的应用,当时的UNIX拥有者AT&T公司以低廉甚至免费的许可将Unix源码授权给学术机构做研究或教学之用,许多机构在此源码基础上加以扩充和改进,形成了所谓的Unix“变种 (Variations)”,这些变种反过来也促进了Unix的发展,其中最著名的变种之一是由加州大学Berkeley分校开发的BSD产品。
后来AT&T意识到了Unix的商业价值,不再将Unix源码授权给学术机构,并对之前的Unix及其变种声明了版权权利。变种BSD Unix在Unix的历史发展中具有相当大的影响力,被很多商业厂家采用,成为很多商用Unix的基础。BSD使用主版本加次版本的方法标识,如 42BSD,43BSD,在原始版本的基础上还有派生版本,这些版本通常有自己的名字,如43BSD-Net/1,43BSD-Net/2等。其不断增大的影响力终于引起了AT&T的关注,于是开始了一场旷日持久的版权官司,这场官司一直打到 AT&T将自己的Unix系统实验室卖掉,新接手的Novell公司采取了一种比较开明的做法,允许伯克利自由发布自己的BSD,但是前提是必须将来自于AT&T的代码完全删除,于是诞生了44 BSD Lite版,由于这个版本不存在法律问题,44BSD Lite成为了现代BSD系统的基础版本。尽管后来,非商业版的UNIX系统又经过了很多演变,但其最终,都是建立在BSD版本上(Linux除外)。所以从这个角度上,44 BSD又是所有自由版(Free版)Unix的基础,它们和Unix V及Linux等共同构成Unix *** 作系统这片璀璨的星空。
BSD在发展中也逐渐衍生出3个主要的分支:FreeBSD,OpenBSD和NetBSD。
此后的几十年中,Unix仍在不断变化,其版权所有者不断变更,授权者的数量也在增加。Unix的版权曾经为AT&T所有,之后Novell拥有了Unix,再之后Novell又将版权出售给了SCO(这一事实双方尚存在争议)。有很多大公司在取得了Unix的授权之后,开发了自己的Unix产品,比如IBM的AIX,HP的HPUX,SUN的Solaris和SGI的IRIX。
Unix因为其安全可靠,高效强大的特点在服务器领域得到了广泛的应用。直到GNU/Linux流行开始前,Unix也是科学计算、大型机、超级计算机等所用 *** 作系统的主流。
历史
初创期
Unix的诞生和Multics(Multiplexed Information and Computing System)是有一定渊源的。Multics是由麻省理工学院,AT&T贝尔实验室和通用电气合作进行的 *** 作系统项目,被设计运行在GE-645大型主机上,但是由于整个目标过于庞大,糅合了太多的特性,Multics虽然发布了一些产品,但是性能都很低,最终以失败而告终。
AT&T最终撤出了投入Multics项目的资源,其中一个开发者,Ken Thompson则继续为GE-645开发软件,并最终编写了一个太空旅行游戏。经过实际运行后,他发现游戏速度很慢而且耗费昂贵——每次运行会花费75美元。
在Dennis Ritchie的帮助下,Thompson用PDP-7的汇编语言重写了这个游戏,并使其在DEC PDP-7上运行起来。这次经历加上Multics项目的经验,促使Thompson开始了一个DEC PDP-7上的新 *** 作系统项目。Thompson和Ritchie领导一组开发者,开发了一个新的多任务 *** 作系统。这个系统包括命令解释器和一些实用程序,这个项目被称为UNICS(Uniplexed Information and Computing System),因为它可以支持同时的多用户 *** 作。后来这个名字被改为UNIX。
发展期
最初的Unix是用汇编语言编写的,一些应用是由叫做B语言的解释型语言和汇编语言混合编写的。B语言在进行系统编程时不够强大,所以Thompson和Ritchie对其进行了改造,并与1971年共同发明了C语言。1973 年Thompson和Ritchie用C语言重写了Unix。在当时,为了实现最高效率,系统程序都是由汇编语言编写,所以Thompson和 Ritchie此举是极具大胆创新和革命意义的。用C语言编写的Unix代码简洁紧凑、易移植、易读、易修改,为此后Unix的发展奠定了坚实基础。
1974年,Thompson和Ritchie合作在ACM通信上发表了一片关于UNIX的文章,这是UNIX第一次出现在贝尔实验室以外。此后UNIX被政府机关,研究机构,企业和大学注意到,并逐渐流行开来。
1975年,UNIX发布了4、5、6三个版本。1978年,已经有大约600台计算机在运行UNIX。1979年,版本7发布,这是最后一个广泛发布的研究型UNIX版本。20世纪80年代相继发布的8、9、10版本只授权给了少数大学。此后这个方向上的研究导致了Plan 9的出现,这是一个新的分布式 *** 作系统。
1982年,AT&T基于版本7开发了UNIX System Ⅲ的第一个版本,这是一个商业版本仅供出售。为了解决混乱的UNIX版本情况,AT&T综合了其他大学和公司开发的各种UNIX,开发了UNIX System V Release 1。
这个新的UNIX商业发布版本不再包含源代码,所以加州大学Berkeley分校继续开发BSD UNIX,作为UNIX System III和V的替代选择。BSD对UNIX最重要的贡献之一是TCP/IP。BSD 有8个主要的发行版中包含了TCP/IP:41c、42、43、43-Tahoe、43-Reno、Net2、44以及 44-lite。这些发布版中的TCP/IP代码几乎是现在所有系统中TCP/IP实现的前辈,包括AT&T System V UNIX 和Microsoft Windows。
其他一些公司也开始为其自己的小型机或工作站提供商业版本的UNIX系统,有些选择System V作为基础版本,有些则选择了BSD。BSD的一名主要开发者,Bill Joy,在BSD基础上开发了SunOS,并最终创办了Sun Microsystems。
1991年,一群BSD开发者(Donn Seeley、Mike Karels、Bill Jolitz 和 Trent Hein)离开了加州大学,创办了Berkeley Software Design, Inc (BSDI)。BSDI是第一家在便宜常见的Intel平台上提供全功能商业BSD UNIX的厂商。后来Bill Jolitz 离开了BSDI,开始了386BSD的工作。386BSD被认为是FreeBSD、OpenBSD 和 NetBSD的先辈。
AT&T继续为UNIX System V增加了文件锁定,系统管理,作业控制,流和远程文件系统。1987到1989年,AT&T决定将Xenix(微软开发的一个x86-pc上的UNIX版本),BSD,SunOS和System V融合为System V Release 4(SVR4)。这个新发布版将多种特性融为一体,结束了混乱的竞争局面。
1993年以后,大多数商业UNIX发行商都基于SVR4开发自己的UNIX变体了。
现况
UNIX System V Release 4发布后不久,AT&T就将其所有UNIX权利出售给了Novell。Novell期望以此来对抗微软的Windows NT,但其核心市场受到了严重伤害,最终Novell将SVR4的权利出售给了X/OPEN Consortium,后者是定义UNIX标准的产业团体。最后X/OPEN和OSF/1合并,创建了Open Group。Open Group定义的多个标准定义着什么是以及什么不是UNIX。
实际的UNIX代码则辗转到了Santa Cruz Operation,这家公司后来出售给了Caldera Systems。Caldera原来也出售Linux系统,交易完成后,新公司又被重命名为SCO Group。
1127部门的解散
根据一项报导指出,当年负责研发UNIX与后续维护工作的贝尔实验室1127部门已于2005年8月正式宣告解散。Ken Thompson已退休,现居加州;Dennis Ritchie调到别的部门;Douglas McIlroy在达特茅斯学院担任教授等等。
标准
从1980年代开始,POSIX,一个开放的 *** 作系统标准就在制定中,IEEE制定的POSIX标准现在是UNIX系统的基础部分。
自由的类Unix系统
Richard Stallman建立了GNU项目,要创建一个能够自由发布的类UNIX系统。20年来,这个项目不断发展壮大,包含了越来越多的内容。现在,GNU项目开发的产品,比如Emacs,GCC等已经成为各种其他自由发布的类UNIX产品中的核心角色。
1990年,Linus Torvalds决定编写一个自己的Minix内核,初名为Linus' Minix,意为Linus的Minix内核,后来改名为Linux,此内核于1991年正式发布,并逐渐引起人们的注意。当GNU软件与Linux内核结合后,GNU软件构成了这个POSIX兼容 *** 作系统GNU/Linux的基础。今天GNU/Linux已经成为发展最为活跃的自由/开放源码的类Unix *** 作系统。
1994年,BSD Unix走上了复兴的道路。BSD的开发也走向了几个不同的方向,并最终导致了FreeBSD、OpenBSD和NetBSD的出现。
类Unix *** 作系统
A/UX | AIX | BSD | DragonFly BSD | FreeBSD | GNU | HP-UX | IRIX | Linux | LynxOS | Mac OS X | Minix | NetBSD | NEXTSTEP | OpenBSD | QNX | SCO OpenServer | Solaris | System V | Tru64 | Xenix | 更多
*** 作系统可能包含许多关于系统当前状态的信息。当系统发生变化时,这些数据结构必须做相应的改变以反映这些情况。例如,当用户登录进系统时将产生一个新的进程。核心必须创建表示新进程的数据结构,同时 将它和系统中其他进程的数据结构连接在一起。 大多数数据结构存在于物理内存中并只能由核心或者其子系统来访问。数据结构包括数据和指针;还有其他数据结构的地址或者子程序的地址。它们混在一起让Linux核心数据结构看上去非常混乱。尽管可能被几个核心子系统同时用到,每个数据结构都有其专门的用途。理解Linux核心的关键是理解它的数据结构以及Linux核心中 *** 纵这些数据结构的各种函数。本书把Linux核心的 描叙重点放在数据结构上,主要讨论每个核心子系统的算法,完成任务的途径以及对核心数据结构的使用。
231 连接列表
Linux使用的许多软件工程的技术来连接它的数据结构。在许多场合下,它使用linked或者chained数据结构。 每个数据结构描叙某一事物,比如某个进程或网络设备,核心必须能够访问到所有这些结构。在链表结构中,个根节点指针包含第一个结构的地址,而在每个结构中又包含表中下一个结构的指针。表的最后一项必须是0或者NULL,以表明这是表的尾部。在双向链表中,每个结构包含着指向表中前一结构和后一结构的指针。使用双向链表的好处在于更容易在表的中部添加与删除节点,但需要更多的内存 *** 作。这是一种典型的 *** 作系统开销与CPU循环之间的折中。
232 散列表
链表用来连接数据结构比较方便,但链表的 *** 作效率不高。如果要搜寻某个特定内容,我们可能不得不遍历整个链表。Linux使用另外一种技术:散列表来提高效率。散列表是指针的数组或向量,指向内存中连续的相邻数据集合。散列表中每个指针元素指向一个独立链表。如果你使用数据结构来描叙村子里的人,则你可以使用年龄作为索引。为了找到某个人的数据,可以在人口散列表中使用年龄作为索引,找到包含此人特定数据的数据结构。但是在村子里有很多人的年龄相同,这样散列表指针变成了一个指向具有相同年龄的人数据链表的指针。搜索这个小链表的速度显然要比搜索整个数据链表快得多。 由于散列表加快了对数据结构的访问速度,Linux经常使用它来实现Caches。Caches是保存经常访问的信息的子集。经常被核心使用的数据结构将被放入Cache中保存。Caches的缺点是比使用和维护单一链表和散列表更复杂。寻找某个数据结构时,如果在Cache中能够找到(这种情况称为cache 命中),这的确很不错。但是如果没有找到,则必须找出它,并且添加到Cache中去。如果Cache空间已经用完则Linux必须决定哪一个结构将从其中抛弃,但是有可能这个要抛弃的数据就是Linux下次要使用的数据。
233 抽象接口
Linux核心常将其接口抽象出来。接口指一组以特定方式执行的子程序和数据结构的集合。例如,所有的网络设备驱动必须提供对某些特定数据结构进行 *** 作的子程序。通用代码可能会使用底层的某些代码。例如网络层代码是通用的,它得到遵循标准接口的特定设备相关代码的支持。 通常在系统启动时,底层接口向更高层接口注册(Register)自身。这些注册 *** 作包括向链表中加入结构节点。例如,构造进核心的每个文件系统在系统启动时将其自身向核心注册。文件/proc/filesysems中可以看到已经向核心注册过的文件系统。注册数据结构通常包括指向函数的指针,以文件系统注册为例,它向Linux核心注册时必须将那些mount文件系统连接时使用的一些相关函数的地址传入。
以上就是关于如何解决AIX的文件系统故障全部的内容,包括:如何解决AIX的文件系统故障、UNIX是什么意思、什么是linux核心数据结构等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)