linux文件系统基础

2025-02-05 版权声明 我要投稿

linux文件系统基础

linux文件系统基础 篇1

/boot:存放linux内核和系统启动文件,包括Grub,lilo启动程序

/dev:存放所有设备文件,包括硬盘、分区、鼠标、USB、tty

/etc:存放系统的所有配置文件

/home:用户目录的默认位置

/media:Ubuntu系统自动挂载CD-ROM、软驱、USB存储期后,存放临时读入的文件

/mnt:该目录通常用于作为被挂载的文件的挂载点

绝对路径:指文件在系统中的准确位置

相对路径:指相对于用户当前位置的一个文件或目录的位置

文件类型

- 普通文件

b 块输入、输出文件

c 字符设备文件

d 包含若干文件或子目录

l 只保留了文件地址,而不是文件本身

p 一种进程间通信的机制,用于进程间通信的暂时文件

s 用于进程间通信,两台计算机间通信的应用程序接口

mkdir -p 表示嵌套的创建子目录

列:mkdir -p dir1/dir2/dir3

rmdir -p :递归的删除子目录

列:rmdir -p dir1/dir2/dir3(等价于rm -r dir1)

chmod:改变文件属性

chmod -R改变该目录及下面所有文件的属性

硬连接:利用linux中为每个文件分配的物理号-inode建立连接,

linux文件系统基础

硬:ln target link:target为文件,link为创建的连接名

软连接:利用文件的路径名建立连接。

软:ln -s target link :target为文件,link为创建的连接名

tar:

-x 释放归档文件

-c 创建一个新的归档文件

-v 显示归档和释放的全过程

-f 用户指定归档文件的文件名,否则使用默认名称

-j 由tar生成归档,然后由bzip2压缩

-z 由tar生成归档,然后由gzip压缩

列: tar -cjf example.tar example 将example文件全部归档,并使用bzip2压缩问一个文件example.tar

tar -czf example.tar example 将example文件全部归档,并使用gzip压缩问一个文件example.tar

tar -xvzf example.tar.bz 等效于先解压缩后释放tar文件

linux文件系统基础 篇2

关键词:可堆叠文件系统,访问控制,文件系统

1 引言

Linux系统拥有为人称道的安全性,在服务器领域占有不小的应用比例,但是它与Windows一样,存在提权漏洞。如果攻击者通过漏洞攻击获取了root权限,现有的用户权限访问控制机制就已经无法保护系统文件免遭篡改和破坏了。为进一步提高Linux系统安全性,有必要在系统中增加一道防线,增强其访问控制能力。利用可堆叠文件系统技术(stackable file system),可以在不修改系统内核的前提下,实现一个提供访问控制功能的特殊文件系统,它建立于实际存储数据的文件系统之上,具备良好的兼容性,可以应用于几乎所有Linux系统中,无论其使用的文件系统是早期的ext2,还是最新的btrfs。

2 可堆叠文件系统原理

可堆叠文件系统,顾名思义,就是可以在其他文件系统上叠加的文件系统。一个可堆叠文件系统自身并不存储任何数据,而使用其他文件系统来存储其数据。它的原理就是使自身对于上一层的VFS调用看来像是一个实际的文件系统,对于下层文件系统而言,像是VFS层,起到一个承上启下的作用。本文中称可堆叠文件系统为上层文件系统,把被它堆叠于其下的文件系统称为下层文件系统。

可堆叠文件系统(简称SFS)的意义在于可以在VFS层和具体的文件系统层之间加入一个实现所需附加功能的层次,在这一层可以加入安全控制、日志记录、行为审计、文件加解密等多种功能。以系统读取文件的流程为例,Linux系统中使用vfs(虚拟文件系统)来提供对各种不同文件系统的支持,常规的流程是系统调用sys_read()在VFS层触发vfs_read(),然后通过此方法中的file->f_op->read()调用具体文件系统的读取文件方法,例如ext4系统的do_sync_read()。加入SFS层后,VFS层会调用SFS层的sfs_read()方法,在这里可以实现安全控制、加密解密等各种功能,然后在sfs_read()方法中模拟vfs层来调用具体文件系统的read()方法。SFS层与其他层次结构的关系如图1所示。

3 访问控制文件系统的设计

VFS层通过vfs_read()、vsf_write()等统一的方法对实际文件系统进行访问,具体实现就是在以上方法中通过调用具体文件系统中f_op、i_op、i_fop、d_op等操作方法集中的read、write等函数指针所指向的实现读写操作的方法,例如:ext4文件系统下的do_sync_read()、do_sync_write()。根据以上特点,SFS具体的实现方式如下。

3.1 访问权限控制

通过一个根据访问控制列表来判断进程访问权限的方法,实现对特定文件的控制、保护。访问控制列表以链表的形式存储,内容可以包含uid,gid,路径信息等,能够根据不同的需求来进行添加、删除和修改。可以将完整的访问控制列表信息保存在一个配置文件中,便于获取和修改。

3.2 完成数据的传递

分别通过SFS层的super_block、dentry、inode、file结构中的私有域s_fs_info、d_fsdata、i_private、private_data来存储下层文件的中对应的结构的信息,建立上下层文件对象之间的对应关系。确保了在完成sfs层的访问权限判断操作后,能够顺利地将下层文件系统的对象数据发送给具体文件系统中的文件访问方法,以最终完成对文件的操作。本文建立了以下结构用于存储下层文件系统的各类对象指针:

(1)sfs_sb_info对象

用于存储下层文件系统的super_block对象,自身被储存在SFS层的super_block对象的s_fs_info私有域中。

(2)sfs_file_info对象

用于存储下层文件系统的file对象,自身被储存在SFS层的file对象的private_data私有域中。

(3)sfs_inode_info对象

用于存储下层文件系统的inode对象和SFS层的inode对象。

(4)sfs_dentry_info对象

用于存储下层文件系统的dentry、vfsmount对象,自身被储存在SFS层的dentry对象的d_fsdata私有域中。

3.3 文件访问方法

根据实际需要分别实现super_block结构中的s_d_op、dentry结构中的d_op、inode机构中的i_op等方法操作集的全部或者部分方法,使自身可以响应VFS层的vfs_read()、vsf_write()等方法,此为承上;在SFS的方法集的特定函数中,完成访问权限判断后,再决定是否调用vfs_read()、vsf_write()等方法,如果具备相应的权限,就将从VFS方法传递过来的关于下层文件系统的数据(如dentry、inode、path等结构的实例)传给这些函数,实现模拟VFS层对下层文件系统的访问,此为启下。通过这种当“中间人”的方式,SFS实现承上启下的功能。

4 访问控制文件系统的核心代码

4.1 访问控制函数

为了实现访问控制,必须在关键函数调用下层文件系统之前使用一个访问控制函数sfs_check_access()进行判断,如果操作不符合要求,就直接返回,从而起到阻止未授权的文件访问的作用。由于读写文件之前都必须首先打开文件,所以把sfs_check_access()放在sfs_open函数中,在初始化SFS层的file对象前进行访问权限判断,可以实现对文件系统中文件对象读写访问的拦截过滤操作。具体实现如下:

sfs_check_access()负责进行访问控制权限判断,此处可以通过current->gid,current->uid,current->comm等获取当前进程的用户组ID,用户ID,调用命令等信息,与设定的规则进行比对(规则信息存放在特定的文件中,在挂载访问控制文件系统时,读入数据,完成访问控制列表的初始化),确认其是否满足访问控制规则,并根据需要,对特定的操作进行日志记录。

4.2 文件的读写等操作

是根据函数定义所需的参数来获取适当的下层文件系统的对象,并将其传递给下层文件系统以完成磁盘读写操作。以sfs_read()为例,对其实现进行说明如下:

5 性能和稳定性考虑

要在Linux中实现可堆叠文件系统这一技术重点在于必须解决数据缓存、调用传递等重点问题。通过建立sfs_sb_Info,sfs_dentry_info,sfs_inode_info等对象的缓存,以此为准,不考虑下层文件系统自身的缓存内容,这样符合操作系统中认为上层缓存数据更加权威的理念,也解决了上下层文件系统缓存不一致的问题。Linux在3.0内核中已经加入了对可堆叠文件系统的支持,在fs/stack.c中提供了在编写可堆叠文件系统时常用的方法,如:fsstack_copy_inode_size和fsstack_copy_attr_all,分别用于从下层文件系统中复制索引节点的大小和复制索引节点的所有属性到上层文件系统的索引节点中。这为数据传递的顺利实现打下了良好的基础。还有一个必须注意的问题就是文件系统中各个对象的引用计数,一个对象在引用计数为0时将被内核释放。由于可堆叠文件系统在实际系统之上增加了一个层次,必须将需要使用到的下层文件系统的dentry、inode、file等对象的引用计数进行相应增加,防止引用下层文件系统时对象已经被释放导致空引用,造成内核崩溃。

6 结语

对如何使用可堆叠文件系统技术实现一个具备访问控制功能的文件系统进行了详细的阐述。文件系统由于在系统内核中增加了一个层次,带来了额外的开支,对读写速度有一定的影响,但经过测试,其最高系统读写性能损耗不超过10%,可以在提供更高安全性的同时满足大部分使用者对操作系统性能的需求。

参考文献

[1]Peter Jay Salzman,Ichael Burian,Ori Pomerantz.The LinuxKernel Module Programming Guide.http://www.tldp.org.2007-05-18.

[2]Bryan Henderson.Linux Loadable Kernel Module HOWTO.http://www.tldp.org.2006-09-24.

linux文件系统基础 篇3

关键词:嵌入式Linux;根文件系统;MTD;NAND Flash

中图分类号:TP311 文献标识码:A文章编号:1007-9599 (2010) 13-0000-01

The Construction of Root File System for the Embedded Linux&NAND flash

Cheng Jian

(School of Computer Science&Technology,Anhui University of Science and Technology,Huainan232001,China)

Abstract:The embedded Linux selecting a Nand Flash to save root file system generally,this paper explains some common file systemes and the feature of the NAND Flash firstly.Secondly it deatily states the principle of the MTD layer and the configurations procedure of a root file system through the example of constucting the YAFFS and Cramfs file systemes in the platform of Sumsang’s ARM9 2410s .

Keywords:The emdedded Linux;Root file system;MTD;NAND flash

近些年嵌入式系统的发展非常快。随着硬件技术的进步,越来越多的嵌入式设备使用Linux作为操作系统,可以实现功能更强的应用。Linux的内核在启动过程中会安装文件系统,是不可或缺的重要组成部分。本文以三星的ARM9 2410S为例,采用了Linux 2.6.24版本说明了如何在NAND flash 存储器上构建文件系统。

一、嵌入式Linux及文件系统

文件系统有两个含义。一个是磁盘和磁盘机制的文件系统即物理文件系统,另一个含义是用户能操作的逻辑文件系统。Linux的一个特点是它支持很多不同的文件系统如JFS、ext、ext2、NTFS、Cramfs等等。

文件系统都会被烧录在某一个存储设备上。嵌入式设备往往选用ROM、闪存(flash memory)等作为主要的存储设备。在嵌入式设备上选用哪种文件系统格式与闪存的特点是相关的。

目前在嵌入式设备上应用最广泛的flash是NOR和NAND flash。NOR的特點是可在芯片内执行,应用程序可直接在flash内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,但写入和擦除的速度较低。而NAND结构能提供极高的单元密度,并且写入和擦除的速度也快,是高数据存储密度的最佳选择,但应用较复杂。不过很多操作系统包括Linux都支持NAND flash。在实际应用中,很多嵌入式设备厂家选用低容量但价格昂股的NOR flash存储启动引导程序和内核,而把文件系统放在NAND flash中。

二、MTD驱动层

要使用Cramfs或YAFFS文件系统,离不开MTD驱动层的支持。MTD(Memory Technology Device)是Liunx中的一个存储设备统一接口层,是专为基于Flash的设备而设计的。MTD包含很多特定类型Flash芯片的驱动程序。在使用MTD时首先要选择合适的Flash芯片驱动。Flash芯片驱动向上层提供读、写、擦除等基本的Flash操作方法。MTD对这些进行封装后向用户提供MTD char和MTD block类型的设备。MTD char类型的设备包括/dev/mtd0,/dev/ted1。它们提供对Flash的原始字符访问。MTD block类型的设备包括/dev/mtdblock0,/dev/mtdblock1等。MTD block将Flash模拟成快设备,这样就可以在Flash上创建Cramfs等格式的文件系统了。

另外,MTD支持CFI(Common Flash Ingerface)接口。利用它可以在一块Flash上创建多个Flash分区。每一个分区作为一个MTD block设备,这样可以把系统软件和数据等分配到不同的分区上,也可以在不同的分区上采用不同的文件系统。

在源代码arch/arm/mach-s3c2410/common-smdk.c文件下的函数“mtd_partition smdk_default_nand_part[]={}”中,可以看到默认的MTD分区,也可以根据需要进行个、修改。

三、MTD及文件系统的配置

(一)配置MTD 要使用Cramfs和YAFFS文件系统,首先要配置MTD。在Memory Technology Devices(MTD)-选项选中如下选项:

<*> Memory Technoloy Device (MTD)support /*MTD支持

[*] MTD Technology suppory/*MTD分区支持

<*>Direct char device access to MTD devices/*字符设备的支持

<*>Caching block device access to MTD devices/*块设备支持

NAND Flash Device Drivers -对NAND Flash的支持

<*>SMC Device support /*

<*>Simple Block Device for Nand Flash(BON FS)

<*>SMC device on S3C2410 SMDK

[*] Use MTD From SMC

(二)配置文件系统

<*> Kernel automounter version 4 support (also supports v3)/*文件系统自动挂载支持

<*>DOS FAT fs support/*对DOS/FAT文件系统的支持

<*>Yaffs filesystem on NAND /*对YAFFS文件系统的支持

<*>Compressed ROM file system support /*对Cramfs文件系统的支持

[*] Virtual memory file system support(former shm fs) /*对temfs 文件系统的支持

<*> Simple RAM-based file system support

[*] /proc file system support/*對/proc 和/dev设备文件系统的支持

[*]/dev file system support (EXPERIMENTAL)/*对/dev设备文件系统支持

[*] Automatiocally mount at boot/*启动时自动挂载的支持

[*] /dev/pts file system for Unix98 PTYs

Network File Systems-/*对NFS网络文件系统的支持

<*>NFS files system support

[*] Provid NFSv3 client support

四、总结

一个使用Linux内核的嵌入式系统中root文件系统必修包含支持完整Linux系统的全部东西,因此至少包含:基本文件系统结构如目录/dev、/proc、/bin、/etc、/lib、/usr;最基本的应用程序如sh 、ls、 cp、 mv等;最低限度的配置文件如inittab、fstab等;设备如/dev/null、/dev/console、/dev/tty*、/dev/ttys*、对应flash分区的设备节点等;基本程序运行所需的函数库等。但由于嵌入式系统资源相对紧缺,在构建时候要根据系统进行定制。

参考文献:

[1]Linux. http://www.linux-mtd.infradead.org

[2]北京博创.UP-CUP S2410 经典 Linux 指导书[M].北京:北京博创兴业科技有限公司,2009

[3]胡勇其,侯学锋.嵌入式Linux下NAND存储器系统的设计与实现[J].计算机工程,2006,32(4)

[4]查启鹏,姚国良.嵌入式Linux下大容量Flash的YAFFS文件系统构建[J].现代电子技术,2007,257(18)

[5]冯翔,李仁发.嵌入式Linux中闪存设备驱动程序开发[J].计算机科学与工程,2005,27(3)

作者简介:程建(1975.6-)男,安徽桐城人,硕士,讲师,主要从事嵌入式系统的研究与教学。

linux文件系统基础 篇4

随着Linux的不断发展,越来越多的人开始使用Linux,。如果想熟练使用Linux,让Linux听

命于自己,就必须掌握这些目录;以XteamLinux 4.0为

例,介绍一下在该系统下的目录。

发表于: 2002-07-18 14:39发表主题: 解析Linux操作系统文件目录

随着Linux的不断发展,越来越多的人开始使用Linux,对于那些刚刚接触的人来说,恐

怕最先感到困惑的就是那些“不明不白”的目录了。如果想熟练使用Linux,让Linux听

命于自己,就必须掌握这些目录,下面就以Xteam公司的最新产品――XteamLinux 4.0为

例,介绍一下在该系统下的目录。

/bin bin是Binary的缩写。这个目录存放着最经常使用的命令。

/boot这里存放的是启动Linux时使用的一些核心文件,包括一些链接文件以及镜像

文件。

/dev dev是Device(设备)的缩写。该目录下存放的是Linux的外部设备,在Linux中

访问设备的方式和访问文件的方式是相同的。

/etc这个目录用来存放所有的系统管理所需要的配置文件和子目录。

/home用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是

以用户的账号命名的。

/lib这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的D

LL文件。几乎所有的应用程序都需要用到这些共享库。

/lost+found这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文

件。

/mnt在这里面中有四个目录,系统提供这些目录是为了让用户临时挂载别的文件系

统的,我们可以将光驱挂载在/mnt/cdrom上,然后进入该目录就可以查看光驱里的内容

了,

/proc这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这

个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修

改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping

你的机器:

echo 1 >/proc/sys/net/ipv4/icmp_echo_

ignore_all。

/root该目录为系统管理员,也称作超级权限者的用户主目录。

/sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

/tmp这个目录是用来存放一些临时文件的。

我们要用到的很多应用程序和文件几乎都存放在usr目录下。具体来说:

/usr/X11R6存放X-Windows的目录;

/usr/games存放着XteamLinux自带的小游戏;

/usr/bin存放着许多应用程序;

/usr/sbin存放root超级用户使用的管理程序;

/usr/doc Linux技术文档;

/usr/include用来存放Linux下开发和编译应用程序所需要的头文件;

/usr/lib存放一些常用的动态链接共享库和静态档案库;

/usr/local这是提供给一般用户的/usr目录,在这里安装一般的应用软件;

/usr/man帮助文档所在的目录;

/usr/src Linux开放的源代码,就存在这个目录,爱好者们别放过哦;

/var这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放

在这个目录下。包括各种日志文件。如果你想做一个网站,你也会用到/var/www这个目

录。

本文简单讲解了一下目录的大致内容,如果想成为Linux高手,则还要进一步学习L

inux下的这些目录。

linux文件系统基础 篇5

mysql远程连接这个以前已经实践过了,依稀记得该死的空间商封了3306….

今天从早上一直研究到现在就为了搞定rsync同步

服务器1:同步源服务器

服务器2:同步服务器也就是新服务器

首先检查两个服务器有没有安装rsync

代码如下复制代码[root@localhost .ssh]# rpm -qa rsync#如果没有安装可以 yum install rsync

接下来需要配置源服务器了

代码如下复制代码

#vi /etc/rsyncd.conf

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

[test]                                     #rsync区段的设定名称,待会同步服务器会用到

path =/data/www/       #需要同步的数据存放路径

comment = test folder   #注释

uid = apache             #采用什么身份进行文件读取

gid = apache             #同上,必须是有读取path权限的用户、组

ignore errors                          #忽略错误

read nly = yes           #只读

list = no                                 #不能列表

auth users = bak               #连接rsync服务的帐号

secrets file = /etc/rsyncd.secrets   #指定存放帐号密码的位置

接下来我们新建存放帐号用户名的文件

代码如下复制代码#vi /etc/rsyncd.secrets

#格式:帐号:密码

bak:bac123

更改文件密码文件的权限

代码如下复制代码

#chown root:root /etc/rsyncd.secrets

#chmod 600 /etc/rsyncd.secrets

启动rsync服务

代码如下复制代码

#rsync --daemon

停止rsync服务器

代码如下复制代码

kill `cat /var/run/rsyncd.pid`  #kill 后是反引号

由于这里只是过渡备份使用所以就不加入自启动,加入自启动如下

修改/etc/xinetd.d/rsync文件,把其中的disable=yes改为disable=no

代码如下复制代码

#sed -i -e “/disable/{ s/yes/no/ }” /etc/xinetd.d/rsync

#service xinetd.d restart

同步服务器配置

代码如下复制代码

#rsync -azv --delete rsync://bak@192.168.1.2/test /var/www/html --password-file=/etc/rsyncpassword

#vi /etc/rsyncpassword  #直接填写密码即可#

#chmod 600 /etc/rsyncpassword #修改文件的权限

#chown root:root /etc/rsyncpassword #修改文件的所属用户和组

定时更新

代码如下复制代码

crontab -e

20 * * * * /data/rsync.sh #每20分钟同步一次,这里是增量备份所以不需要担心

至此rsync同步已经算搞定了,这样就搞定了我们的业务需求了,

下次买服务器还是得买个靠谱的,不然换个服务器真心难受。

linux文件系统基础 篇6

问题如题,解决方法:

# 假设要解压的分卷文件是file.zip file.z01, file.z03 file.z04,(其他情况可类推)

cat file.z01, file.z03 file.z04 file.zip >hana.zip

unziphana.zip

将分卷文件合成一个完整的压缩文件hana.zip,然后在使用unzip解压file.zip即可,

linux文件系统基础 篇7

关键词:Linux系统,权限管理

1 Linux文件权限简介

Linux是一个多用户和多多任务的操作系统, 在Linux系统中信息都存放在文件中, 系统里运行的程序都以文件的形式存储。不同的用户为了不同的目的使用操作系统是通过系统赋予用户对某个文件的特定权限来实现的。

Linux系统中文件或目录的访问权限分为读权限, 写权限和可执行权限三种, 分别用r、w和x表示。用户具有读权限可以使用cat、more等文件查看程序读取文件的内容, 这种方式仅仅是读取, 不能对文件进行修改;用户具有写权限可以在目录中创建新的文件或者修改已有的文件;用户具有执行权限可以执行一些可执行程序。在linux系统中, 有三种不同类型的用户可对对文件或者目录拥有不同的权限, 这三类用户是文件所有者, 同组用户、其他用户。

用户可以通过ls-l命令查看系统中目录或者文件的权限信息, 运行结果如下所示:

上述结果中第一列数据表示了文件或者目录的类型和权限信息, 其中第一位字符表示了该文件的类型;第二位到第十位字符表示了该文件所对应的系统中三类用户所具有的权限信息, 其中第二到四位表示该文件的所有者对该文件所具有的权限;第五到七位表示同组用户对该文件所具有的权限;第八到十位表示了系统中除了前两类用户以外的其他用户对该文件所具有的权限。这三组信息依次由r、w、x或者-组成, 如果在某个位置上的字符是-, 说明此类用户没有该位置上的某个权限。例如:rwx表示该用户具有读、写、执行的权限;r-x表示该用户具有读、执行权限, 而没有写权限。

2 Linux文件权限设置

确定了某个文件或者目录的访问权限以后, 用户可以使用linux系统提供的chmod命令来重新设置文件或者目录的访问权限, 达到控制不同用户对文件的不同的访问权限。该命令有两种用法。一是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

2.1 文字设定法

利用chmod设置文件权限的文字设定法的语法格式如下:

chmod[who][+|-|=][mode]文件名列表

选项Who的取值以及含义:u表示“属主 (user) ”, 即文件或者目录的所有者;g表示“所属组 (group) ”里的用户, 即组名或者组ID与文件中的组名或者组ID相同的用户;o表示既不属于属主 (user) , 也不属于group的其他用户;a表示“所有 (all) ”用户。它是系统默认值。选项中“+”表示添加某个权限;“-”表示取消某个权限;“=”表示赋予某个权限, 并取消原有的权限。Mode选项取值和含义:r表示可读权限;w表示可写权限;x表示可执行权限。命令中可以给出多种权限方式中间用逗号隔开。

应用实例1:为同组用户添加对文件a.txt的执行权限

应用实例2:取消其他用户对文件a.txt的写权限

应用实例3:重新赋予文件所有者对文件a.txt权限为读权限和写权限

应用实例4:为同组用户和其他用户添加对文件a.txt的写权限

应用实例5:取消同组用户对文件a.txt的写权限并添加其他用户对文件a.txt的写权限

2.2 数字设定法

数字设定法是与文字设定法功能等价的设定方法, 只不过比文字设定法更加简洁。数字设定法用3个二进制位来表示文件权限。第一位表示r权限 (可读) , 第二位表示w权限 (可写) , 也可以直接用十进制数计算。0表示没有权限, 1表示x权限, 2表示w权限, 4表示r权限, 然后将其相加。所以数字属性的格式应为3个从0到7的八进制数, 其顺序是 (u) 、 (g) 、 (o) 。其他的与文字设定法基本一致。

语法格式为:

其中mode由XXX三位数字组成, 第一位的数字表示所有者的权限, 第二位数字表示同组用户的权限, 第三位数字表示其他用户的权限, filename为设定权限的文件名称。

应用实例6:设置a.txt的文件权限使所有者具有读、写、执行权限;同组用户具有读、写权限;其他用户具有读、执行权限

分析:读权限用4表示, 写权限用2表示, 执行权限用1表示;所有者具有读、写、执行权限, 因此权限所代表的数字相加为4+2+1=7;同理同组用户权限为6, 其他用户权限为5, 综上所述, 字符数字设定法中的mode的应设置为765。

参考文献

[1]刘海涛, 等.Linux中文件权限管理的探讨[J].微型计算机信息, 2006 (3) .

[2]何明, 等.Linux培训教程[M].清华大学出版社, 2010.01.

[3]贺惠萍, 等.应用程序用户权限机制研究[J].微计算机信息, 2005, 9:19-21.

[4]罗琰, 等.Linux环境下访问控制列表机制的设计与实现.解放军理工大学学报 (自然科学版) , 2004.6.

[5]陈旭, 等.Linux系统网络安全问题分析及对策[J].合肥工业大学学报, 2002, 5 (3) .

linux文件系统基础 篇8

实现目标:

服务器A与服务器B同步备份,这里只说明服务器A同步到服务器B,服务器B还原到服务器A。

考虑安全因素,使用普通用户进行同步。

使用cronjob,定时同步。

A 服务器上/opt/web 目录,与B客户端服务器上/opt/web目录实现同步。即:B主动与A进行同步。(A的文件会同步到B机器上)

代码如下复制代码OS: Reaht AS4

A Server192.168.0.100 /opt/web

B Server192.168.0.60 /opt/web

一.A Server config

1.安装服务

代码如下复制代码yum install xinetd

yum install rsync

2. vi /etc/xinetd.d/rsync修改 disable =yes 为 disable =no ,修改后的文件如下

代码如下复制代码

# default: off

# description: The rsync server is a good addition to an ftp server, as it

#allows crc checksumming etc.

service rsync

{

disable = no

socket_type= stream

wait= no

user= backup

server= /usr/bin/rsync

server_args= –daemon

log_on_failure+= USERID

}

3. 编辑主要配置文件/etc/rsyncd.conf (不存在则自己创建)

代码如下复制代码vi /etc/rsyncd.conf

uid = backup

gid = backup

use chroot = no# 不使用chroot

max connections = 4# 最大连接数为4

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

log file = /var/log/rsyncd.log# 日志记录文件

[web]# 这里是认证的模块名,在client端需要指定

path = /opt/web# 需要做镜像的目录

ignore errors# 可以忽略一些无关的IO错误

read nly = true# 只读

list = false# 不允许列文件

hosts allow = 192.168.0.0# 允许的IP地址

hosts deny = 0.0.0.0/32# 禁止的IP 地址

auth users = backup# 认证的用户名,如果没有这行,则表明是匿名

secrets file = /etc/backup.pass#认证用户的密码文件 认证文件名

4. 编辑服务器的密码文件 /etc/backup.pass,文件只能有可读权限 400

代码如下复制代码vi /etc/backup.pass#文件格式如下

backup:123456

chmod 400 /etc/backup.pass

5.启动服务

首次启动rsync

代码如下复制代码rsync –daemon –config=/etc/rsyncd.conf

如果提示

代码如下复制代码failed to create pid file /var/run/rsyncd.pid: File exists

使用指令

代码如下复制代码rm -rf /var/run/rsyncd.pid

用以下命令查看rsync是否已经运行:netstat -an|grep 873

代码如下复制代码[root@localhost web]# netstat -an|grep 873

tcp00 0.0.0.0:8730.0.0.0:*LISTEN

tcp00 :::873:::*LISTEN

重启已经在运行的rsync

代码如下复制代码[root@mail video]# ps -ef | grep rsync

root2728410 10:26 ?00:00:00 rsync –daemon –config=/etc/rsyncd.conf

root30516 299860 18:35 pts/300:00:00 grep rsync

[root@mail video]# kill -9 27284

[root@mail video]# rsync –daemon –config=/etc/rsyncd.conf

service xinetd restart,重启 xinted 服务

rsync 系统自带, 需要使用 –deamon 方式进行启动,服务端口是 TCP 873

rsync –deamon –config=/etc/rsyncd.conf

如果要在启动时把服务起来,有几种不同的方法,比如:

a、加入inetd.conf

编辑/etc/services,加入rsync873/tcp,指定rsync的服务端口是873

编加/etc/inetd.conf,加入rsyncstreamtcpnowaitbackup/bin/rsync rsync –daemon

b、加入rc.local

在各种操作系统中,rc文件存放位置不尽相同,可以修改使系统启动时rsync –daemon加载进去,

二. B Serverconfig

1.yum install rsync安装rsync服务

2. 创建rsync连接时的密码文件/etc/rsync_client.pass,所放目录自己随意安排,文件权限为只读400

vi /etc/rsync_client.pass #文件格式如下:

#只需要配置连接时使用的密码即可,必须与A服务器上定义的密码相同.

代码如下复制代码chmod 400 /etc/rsync_client.pass

3. 使用 rsync 命令连接服务器,实现文件同步

代码如下复制代码rsync -vzrtopg –progress –delete –password-file=/etc/rsync_client.pass backup@192.168.0.100::web /opt/web

PS:目录同步时要保存相同的文件属主信息,需要在B服务器上创建相同的用户

代码如下复制代码rsync -qcazrtopgl –progress –delete –password-file=/etc/rsync_client.pass –exclude=”*.gz” –exclude-from=/opt/pcdir backup@192.168.0.100::web /opt/web

backup为认证用户名;

192.168.0.100为服务器端IP;

Web为模块名;

/opt/web 为本地的目录

三.定时任务

代码如下复制代码[root@localhost admin_backups]# vi backup.sh

内容如下:

代码如下复制代码#/bin/sh

rsync -qcazrtopgl –progress –delete –password-file=/etc/rsync_client.pass –exclude=”*.gz” –exclude-from=/opt/pcdir backup@192.168.0.100::web /opt/web

添加定时任务:

代码如下复制代码[root@localhost admin_backups]# crontab –e

添加以下内容:

代码如下复制代码*/1 * * * * /home/admin/admin_backups/backup.sh > /dev/null 2>&1

每个一分钟从服务器A同步到服务器B!

4. 使用 –execlude= 排除不需要同步的文件后缀名

代码如下复制代码rsync -vzrtopg –progress –delete –password-file=/etc/rsync_client.pass –exclude=”*.tmp”

backup@192.168.0.100::web /opt/web

5. 使用 –execlude-from= 排除不需要同步的目录

代码如下复制代码[root@localhost opt]# rsync -vzrtopg –progress –delete –password-file=/etc/rsync_client.pass –exclude-from=/opt/pcdir backup@192.168.0.100::web /opt/web

/opt/pcdir 文件的内容如下

cat /opt/pcdir

temp/

参数说明

-vzrtopg里的

v是verbose,

z是压缩,

r是recursive,

topg都是保持文件原有属性如属主、时间的参数

—-progress

是指显示出详细的进度情况

–delete

是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致

–exclude=”*.tmp”不包含某些文件

–execlude-from=排除不需要同步的目录

/opt/web/

linux文件系统基础 篇9

有时候,我们会遇到这种情况:不知道当前运行的php配置文件php.ini在什么位置

这个时候,使用如下命令

代码如下复制代码

strace -o php.log -s 65535 php -i然后在输出结果文件php.log中搜索ini

可能的输出结果是:

open(“/usr/bin/php-cli.ini”, O_RDONLY) = -1 ENOENT (No such file or directory)

open(“/etc/php-cli.ini”, O_RDONLY) = -1 ENOENT (No such file or directory)

open(“/usr/bin/php.ini”, O_RDONLY) = -1 ENOENT (No such file or directory)

open(“/etc/php.ini”, O_RDONLY)如上,最终定位到 /etc/php.ini

strace这个命令在跟踪程序执行的时候特别有用,这个命令值得深入研究。

补充:

linux下如何查找文件的命令是:

find/ 要查找的文件名称 -print

那么我们利用这个命令就可以快速找到php.ini这个文件,然后对他进行修改了

代码如下复制代码

find/ php.ini -print

在linux服务器上用命令行

代码如下复制代码

/data/php/bin/phpa.php | grep php.ini

显示

Configuration File (php.ini) Path => /data/php/etc

Loaded Configuration File => /data/php/bin/php.ini

/data/php/bin/php.ini的权限linux服务器上用的是 nginx+php

-rwxrwxrwx. 1 root root 69737 2月3 13:49 /data/php/bin/php.ini

要怎么处理才能在浏览器里浏览a.php显示Loaded Configuration File => /data/php/bin/php.ini

linux文件系统基础 篇10

(1) 系统的尺寸较小。Linux系统的尺寸小是因为系统本身的Flash决定, 大部分系统只有几兆的Flash, 掌上电脑的Linux系统也不超过几十兆, 所以系统的尺寸必须要小。控制系统的尺寸可以从下面两方面出发:一方面是系统的内核, 一般Linux系统的内核只有1兆左右, 要想提高系统工作的效率, 应该制定更为小巧的内核;另一方面是窗口系统, Linux桌面上包含很多的图形窗口, 这些也会占据系统的内存, 所以应该设置小巧的图形窗口来加快系统的运行速度。

(2) 支持标准的系统调用。Linux系统是UNIX系统的克隆, 也实现了POSIX标准, 大部分的UNIX程序可以直接转移到Linux中, 再加上系统本身能够免费下载大量的资料, 使得这种系统受到越来越多用户的欢迎。Linux系统对于标准化的系统调用不用进行修改, 可以直接使用那些免费的软件, Linux上开发的软件也可以直接在系统中使用, 为系统的运行提供了有利的条件。

(3) 能够支持特殊的硬件设备。Linux系统中经常会使用不同的硬件设施, 但是系统本身并不具有键盘和鼠标等硬件, Linux可以直接用触屏和按键代替, 一般的掌上电脑都需要进行电源管理, 所以在Linux在操作的过程中还需要增加这方面的内容, 改变了原本的系统。

(4) 文件系统。系统启动后, 内核以及所有应用程序都需要Linux支持, 不同设备使用的文件系统也不相同, 所以需要对不同的文件进行编程。每个文件应该有对应的程序, 这样才能保证文件在使用的过程中不会出现差错。

二、Linux系统下的文件编程和时间编程

2.1文件编程

文件编程的方式可以分为系统调用和C库函数, 系统调用依附于系统本身, 但是C库函数可以单独使用。

(1) 系统调用。首先是创建文件, 常见的文件创建模式可以分为可读、可写以及可执行三种, 同时还可以利用数字来设置文件的权限;其次是对文件进行描述, 系统中每一个文件都对应一个描述符, 通过描述符来打开文件, Linux系统可以打来1024个文件;然后是关闭文件, 阅读完文件后系统会自动关闭文件, 关闭的文件也会有相应的描述符;最后是定位文件, 定位文件可以通过文件开头、结尾以及读写指针指示的位置。定位文件可以将whence移动offset个字节, 操作完成后, 文件指针会自动回到文件的开头, 要判断文件能否进行读、写等操作时, 可以使用access函数, 可以设置文件可读、文件可写、文件可执行以及文件存在等来设置权限。

(2) C库函数。C库函数的文件操作可以独立存在, 不用依靠Linux系统。首先是创建和打开文件, 打开的方式主要有只读打开和只写打开, 如果文件没有反应就需要重新创建, 不同的文件打开和创建的方式也有一定的区别。系统在编写程序时, 应该确定文件的路径, 这时候C库函数会利用getcwd来确定文件的路径。创建和打开文件之后就是建立目录, 将系统中不同的文件整理在一起, 方便使用。

2.2时间编程

Linux系统在操作的过程中经常会用到系统的输出时间、程序的执行时间以及延长的时间等等, 所以应该进行时间编程。系统中的时间可以分为世界标准时间和日历时间, 不同的时间参照的标准也不一样。Time的目的是为了获取日历时间, 计算系统从开始到结束的时间, 还可以利用gmtime将日历时间转化为世界标准时间, 转为世界标准时间后系统会保持TM结构, TM结构的时间会显示为字符。实行时间编程最主要的目的是为了促进系统的正常运行, 保证系统的安全。

三、总结

Linux系统是计算机信息技术发展的产物, 能为用户提供更多的信息资源, 它具有灵活性、小巧、方便使用等优势, 但是在实际的应用中还是要注意文件的时间的编程。但是完善后的Linux系统能够同时支持1024个文件的使用, 在同一条件下能够为用户提供更多的信息。在文件编程中也需要处理好世界标准时间与日历时间的关系, 特定的情况下还可以延迟程序的执行, 保证系统运行的安全。

参考文献

[1]丁德文.Linux系统下的文件与时间编程[J].电子世界, 2013 (1)

[2]郑仕碧.基于嵌入式Linux的数据采集系统关键模块设计[D].电子科技大学, 2013

[3]赖明壮.基于PowerPC的嵌入式Linux系统平台的应用和实现[D].成都理工大学, 2012

linux文件系统基础 篇11

简单命令

代码如下复制代码

$xz -d ***.tar.xz

$tar -xvf***.tar

可以看到tar.xz 文件,采用双层压缩方式,外层用xz压缩,里层用tar压缩

下在看在Centos中:

yum -y install xz 完成后

运行 xz -d x.tar.xz 得到 x.tar ,

linux文件系统基础 篇12

代码如下复制代码

find /dir -size +100M -exec ls -lh {} \;

如果想直接删除大于50M的文件,使用命令

代码如下复制代码

find /var/mail/ -size +50M -exec rm {} \;

如果要清空一些文本文件类的东西,可以使用

代码如下复制代码

echo “” >/www.111cn.net /xxx.log

此命令能与“echo >/var/log/big.log”达到相同效果,不过,命令执行后,需要用“Ctrl + d”结束

代码如下复制代码

clear >/opt/log/big.log

此命令会把big.log文件内容清空,而不删除文件

同样的效果,用true、flase、“:”等也能实现清空文件内容,而不删除文件的效果

代码如下复制代码

true >/opt/log/big.log

flase >/opt/log/big.log

: >/opt/log/big.log

若想删除文件,只需利用rm命令即可

代码如下复制代码

rm -f /opt/log/big.log

如果想排序文件夹和文件,可以使用

代码如下复制代码

du -s * | sort -nr | head

补充两个好用简单的方法

代码如下复制代码

cat /dev/null >要清空的文件

>要清空的文件

linux文件系统基础 篇13

1 Linux根文件系统介绍

Linux嵌入式系统由Linux内核,bootloader,Linux根文件系统组成,如图1所示。Linux嵌入式系统都存储在flash存储器中,嵌入式系统启动首先运行bootloader,通过bootloader的c入口进入内核初始化,最后进入根文件系统的启动文件。Linux根文件系统的装载是Linux内核启动期间进行的最后操作之一,它是Linux嵌入式系统的一个重要组成部分。Linux根文件系统是一个目录树结构,目录树可以分为小的部分,每个部分可以在自己的磁盘或分区上。主要部分是/lib、/usr、/var和/home文件系统。每个部分有不同的作用。每台机器都有根文件系统,它包含系统引导和使其他文件系统得以mount所必要的文件,根文件系统应该有单用户状态所必须的足够的内容,还应该包括修复损坏系统、恢复备份等的工具。Linux根文件系统就其基本组成来说,包含着系统软件和库文件,以及应用软件。至少应包括以下几项内容。

(1)基本的文件系统结构,包括一些必需的目录比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。

(2)基本程序运行所需的库函数,如Glibc/uC-libc。

(3)基本的系统配置文件,比如rc,inittab等脚本文件。

(4)必要的设备文件:/dev/hd*,/dev/tty*,/dev/fd0。

(5)基本的应用程序,如sh,ls,cp,mv等。

busybox是标准Linux工具的一个单个可执行文件。busybox包含了一些简单的工具,例如cat和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet。busybox在设计上就充分考虑了硬件资源受限的特殊工作环境。它采用一种很巧妙的办法减少自己的体积:所有的命令都通过“插件”的方式集中到一个可执行文件中,在实际应用过程中通过不同的符号链接来确定到底要执行哪个操作。例如最终生成的可执行文件为busybox,当为它建立一个符号链接ls的时候,就可以通过执行这个新命令实现列目录的功能。Busybox主要用来生成一些Linux系统需要命令,它集成了一百多个最常用Linux命令和工具软件,甚至还集成了一个http服务器和一个telnet服务器,并且支持Glibc和uClibc。用户可以非常方便地在Busybox中制作所需的应用程序。所以本文选用BusyBox来完成一些基本工具。

3 嵌入式视频监控系统根文件的实现

根文件系统能在开发板上使用,必须具备上面的目录,且在各目录下存储相应文件。比如在/lib目录下必须要有相应的库文件等。制作Linux根文件系统的过程就是,逐步把相关目录的功能实现。本系统的Linux根文件系统的具体实现如下:

(1)建立库文件,使用YP2440开发板自带的镜像文件:YLP2440.cramfs来提取库文件。

$mkdir/home/cxl/evb_rootfs

#mount-o loop YLP2440.cramfs/home/cxl/evb_rootfs

$cd/home/cxl/evb_rootfs/lib

$cp-r.//home/cxl/rootfs/lib

(2)通过busybox制作/bin,/Linuxrc,/sbin,/usr等目录。下载Busybox1.8.2 (http://www.Busybox.net/downloads/),解压,安装Busybox。选择根文件系统所必须的命令和配置信息。比如编译前,配置busbox时选择BusyBox编译成动态链接的可执行文件的选项,及insmod等命令,安装Busybox时应注意一些选项,不然会在编译出错。把生成的_install目录拷贝到根文件系统目录下。

(3)无线网卡的配置。把无线网卡对应的驱动模块加载到内核,使得/proc目录下有对应的无线网卡节点。

其次为了能够在根文件系统下对无线网卡进行配置,必须添加无线网卡的配置命令。这些命令在网上下载,本系统选择Wireless Tools for Linux作为无线网卡工具集。执行以下命令编译生成该工具集:

tar-zxvf wireless_tools.29.tar.gz

cd wireless_tools.29

make CC=arm-Linux-gcc

执行make后生成iwconfig iwevent iwgetid iwlist iwspy iwpriv。将这些文件复制到/sbin中,把libiw.so.29放入/lib。把无线网卡驱动文件zd1211b.ko放入/usr。

通过以上步骤实现了把无线网卡命令添加到根文件系统。

Linux式的操作系统访问网络接口的方法是给它们分配一个唯一的名字(比如eth0),但这个名字在文件系统中(比如/dev目录下)不存在对应的节点项,该节点在系统启动并加载无线网卡驱动后自动生成。所以就不需要在在/dev目录下建立网卡对应的节点。

(4)摄像头的配置。首先把摄像头对应的驱动模块加载到内核,加载成功后会自动在/proc目录下生成对应的摄像头节点,并且在/dev目录下自动生成v4l/video1。

其次为了能够通过对根文件系统的操作来控制摄像头。通过查看/proc目录确定摄像头驱动的主设备号。由于视频采集系统通过/dev/video0这个文件对摄像头进行操作,所以必须建立/dev/video0。最后把/dev/v41/vidio1与/dev/video0建立软链接。ln-s/dev/v4l/video 1/dev/video0

在宿主机下把servfox-R1_0_0.tar.gz解压,make生成服务器视频采集程序servfox,然后把生成的servfox复制到目标机的/sbin目录下。

(5)建立其他需要的目录:$mkdir dev etc lib proc sys tmps

(6)设备文件的实现:

mknod-m 660 console c 5

mknod-m 660 null c 1

mknod-m 660 ttySACO c 204 64

(7)/etc目录的实现:

在/etc目录下建立文本文件inittab,它的内容如下:

#/etc/inittab

::sysinit:/etc/init.d/rc.S

ttySACO::askfirst:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount-a-r

在/etc/init.d目录下,创建rcS脚本,它的内容如下:

#!/bin/sh

ifconfigeth0 192.168.1.253

mount-a

在/etc目录下建立文本文件fstab,它的内容如下:

(8)制作yaffs文件系统包

mkyaffsimage evb_rootfs evb_rootfs.yaffs

4 结束语

本文针对嵌入式视频监控系统,对Linux根文件系统添加无线网卡的库文件和专有命令,以及摄像头驱动的添加和视频采集服务器的添加。通过上面的操作就完成了嵌入式视频监控系统的根文件的制作。只要把evb_rootfs.yaffs烧写到开发板上,根文件系统就可以运行起来。

参考文献

[1]刘富强.数字视频监控系统开发及应用[M].北京:机械工业出版社.2003.

[2]罗世伟,左涛,邹开耀.视频监控系统原理及维护[M].北京:电子工业出版社.2007.

[3]吕立波.现在安全防范技术与应用[M].济南:黄河出版社,2006.

[4]周立功.ARM嵌入式系统基础教程[M].北京:北京航空航天大学出版社.2005.

[5]田泽.ARM嵌入式开发实验与实践[M].北京:北京航空航天大学出版社.2006.

[6]孙天泽,袁文菊,张海峰.嵌入式设计及Linux驱动开发指南一基于ARM处理器[M].北京:电子工业出版社,2005.

[7]韦东山.嵌入式Linux应用开发[M].北京:人民邮电出版社,2008.

linux文件系统基础 篇14

本地文件在commit到仓库之前若没有chmod +x 权限的话,那在svn仓库里的文件将会保持当前无可执行属性状态。

即使在本地chmod +x filename 之后,再提交到仓库也是没有用的。check out到其他目录的时候,文件仍然没有可执行权限,

需要使用svn 设置文件属性,如下

代码如下复制代码

svn propset svn:executable on *

设置执行权限

代码如下复制代码

svn propset svn:executable on test.c

linux文件系统基础 篇15

为LINUX 设计一个简单的二级文件系统

菜鸟程序员

院(系)

计算机科学与工程学院 专业班级 学

指导教师

课程设计日期 2011年 6月2 日至7月1日

目 录

1题目分析..........................................................1 2算法设计..........................................................1 2.1 用户登录模块..................................................1 2.2 新建目录模块..................................................2 2.3新建文件模块..................................................3 2.4 删除文件模块..................................................4 2.5 读取文件模块..................................................5 3 设计实现..........................................................6 3.1登录界面外观布局..............................................6 3.2树状显示目录..................................................7 3.3新建目录实现主要代码:.......................................10 3.4新建文件实现.................................................12 3.5删除文件实现.................................................14 3.6读取文件实现.................................................16 4设计总结.........................................................17 5参考文献.........................................................18

1题目分析

为Linux设计一个简单的二级文件系统,可以实现用户登录、列出文件目录、创建目录、创建文件、删除目录、删除文件、读取文件的功能。本次设计采用的开发语言是Java,通过Java来实现整体布局和实现相关的功能。

2算法设计

本次二级文件系统主要分为五大模块,分别是用户登录模块、新建目录模块、新建文件模块、删除文件模块和读取文件模块。用户登录成功后才可以进行其他模块的操作。

2.1 用户登录模块

用户登录模块要求用户输入账号与密码,当输入正确后进入主视图并能进行其他模块操作,否则提示账号密码错误并要求用户重新输入(默认的账号和密码都是“123”)。用户登录模块流程图如图1所示。

开始输入账号和密码账号和密码都正确?否是显示默认目录的所有文件与目录提示输入错误结束 图1 用户登录模块流程图

2.2 新建目录模块

新建目录模块是根据用户鼠标右击时选择到的节点来确定节点的名字与路径,然后判断该节点是否可以拥有子节点,若拥有则根据用户输入的目录名称新建一个目录,否则提示不能新增目录。新建目录模块流程图如图2所示。

开始获得右击时选择到的节点的路径与名字被选择的节点是否可以拥有子节点?否是用户输入新建目录的名字提示不能创建目录在本地硬盘新建一文件夹,在树型视图新增一节点结束 图2 新建目录流程图

2.3新建文件模块

新建文件模块是根据用户鼠标右击时选择到的节点来确定节点的名字与路径,然后判断该节点是否可以拥有子节点,若拥有则根据用户输入的文件名称新建一个文件,否则提示不能新增文件。新建文件模块流程图如图3所示。

开始获得右击时选择到的节点的路径与名字被选择的节点是否可以拥有子节点?否是用户输入新建文件的名字提示不能创建文件在本地硬盘新建改文件,在树型视图新增一节点结束 图3 新建文件流程图

2.4 删除文件模块

删除文件模块是根据用户鼠标右击时选择到的节点来确定要删除节点的名字与路径,然后判断该节点是目录还是文件。若是文件则直接删除文件,若是目录则进入该目录再删除其全部文件。删除文件模块流程图如图4所示。

开始获得右击时选择到的节点的路径与名字在树状视图上删除该节点否该节点是一目录?是进入该目录并遍历所有文件删除该文件删除所有被遍历的文件结束 图4 删除文件模块流程图

2.5 读取文件模块

读取文件模块是根据FileDialog类中事先设定的默认路径而打开一个选择对话框,然后根据用户选择的文件而获取文件的名字与路径。最后通过输入流而把读取到的数据显示在一个文本域中。读取文件流程图如图5所示。

开始新建一个空的文本区域生成FileDialog选择框根据用户的选择而获得文件的路径和名字运用输入输出流读取文件的数据把读取到的数据显示到文本域中结束 图5 读取文件模块流程图 设计实现

3.1登录界面外观布局

登录界面主要代码:

JLabel labelID=null,labelPassword=null,title=null;JTextField id,password;JButton conform=new JButton(“确认”);JButton cancle=new JButton(“取消”);LoginWindow(){ init();this.setTitle(“登录界面”);this.setBounds(400,200,550,400);this.setResizable(false);

this.setVisible(true);

}

void init(){

this.setLayout(null);

labelID=new JLabel(“请输入账号:”);labelID.setBounds(50, 100, 100, 30);this.add(labelID);

labelPassword=new JLabel(“请输入密码:”);labelPassword.setBounds(50, 200, 100, 30);this.add(labelPassword);

id=new JTextField(20);id.setBounds(170, 100, 300,30);this.add(id);

password=new JTextField(20);password.setBounds(170, 200, 300, 30);this.add(password);title=new JLabel(“登录界面”);conform.setBounds(100, 280, 80, 30);cancle.setBounds(250, 280, 80, 30);

conform.addActionListener(new LoginListener());cancle.addActionListener(new LoginListener());

this.add(conform);this.add(cancle);} 登录界面如图6所示

图6 登录界面

3.2树状显示目录

登录成功后显示默认路径的树状文件目录的主要代码:

void getRoot(DefaultMutableTreeNode superroot, File f){

File files[] = f.listFiles();

for(int i = 0;i < files.length;i++){

DefaultMutableTreeNode de = new DefaultMutableTreeNode(files[i].getName());

if(files[i].isDirectory()){

de.setAllowsChildren(true);

} else {

de.setAllowsChildren(false);

System.out.println(“不是目录的有:” + de.toString());

}

superroot.add(de);

} }

private class TreeListener implements TreeExpansionListener { // 重写两个方法

public void treeCollapsed(TreeExpansionEvent event){

}

public void treeExpanded(TreeExpansionEvent event){

DefaultMutableTreeNode node =(DefaultMutableTreeNode)(event

.getPath()).getLastPathComponent();

if(node.getChildCount()== 0){

DefaultMutableTreeNode originalNode = node;

String fileName = node.toString();

while(node.getParent()!= null){

node =(DefaultMutableTreeNode)node.getParent();

fileName = node.toString()+ “" + fileName;System.out.println(”当前展开路径名“ + fileName);

} if(originalNode!= null){

File f = new File(fileName);

if(f.isDirectory()){

File files[] = f.listFiles();

if(files!= null)

for(int i = 0;i < files.length;i++){

DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode(files[i].getName());

if(files[i].isDirectory())

dmtn.setAllowsChildren(true);

else

dmtn.setAllowsChildren(false);

dtm.insertNodeInto(dmtn, originalNode,originalNode.getChildCount());

}

}

}

} }

树状目录显示如图7所示:

图7 树状显示目录

3.3新建目录实现主要代码:

private class NewMenuAction implements ActionListener {

public void actionPerformed(ActionEvent e){

TreePath path = tree.getSelectionPath();

MutableTreeNode node =(MutableTreeNode)path

.getLastPathComponent();

DefaultTreeModel model =(DefaultTreeModel)tree.getModel();

if(node.getAllowsChildren()){

String Name = JOptionPane.showInputDialog(null, ”创建目录名称:“);

if(!Name.equals(”“)){ MutableTreeNode newNode = new

DefaultMutableTreeNode(Name);// 建立新节点

1);

+ Name);

tree.fireTreeExpanded(path);model.insertNodeInto(newNode, node, 0);String fullPath = ”“;

for(Object obj : path.getPath()){ String str = obj.toString();if(str.endsWith(”“))

str = str.substring(0, str.length()1);if(fullPath.equals(”“))

fullPath += str;else

fullPath += ”“ + str;} String FileName = JOptionPane.showInputDialog(null, ”创建文件名称:“);

if(!FileName.equals(null)){ File f = new File(fullPath + ”“ + FileName);try {

f.createNewFile();} catch(IOException e1){

e1.printStackTrace();} } else { JOptionPane.showMessageDialog(null, ”不能添加文件!“);return;

}

}

} }

新建文件如图9所示,图9 新建文件

3.5删除文件实现

删除文件主要代码:

private class DeleteAction implements ActionListener{

public void actionPerformed(ActionEvent e){

TreePath tp = tree.getSelectionPath();

DefaultMutableTreeNode node =(DefaultMutableTreeNode)tp.getLastPathComponent();

DefaultTreeModel dtm =(DefaultTreeModel)tree.getModel();

dtm.removeNodeFromParent(node);

String fullPath = ”“;

for(Object obj : tp.getPath()){

String str = obj.toString();

if(str.endsWith(”“))

str = str.substring(0, str.length()-1);

if(fullPath.equals(”“))

fullPath += str;

else

fullPath += ”“ + str;

}

File currentFile = new File(fullPath);

if(currentFile.isFile())

currentFile.delete();

else

deleteDir(currentFile);

} } public static boolean deleteDir(File dir){

if(dir.isDirectory()){

String[] subDir = dir.list();

for(String s : subDir){

deleteDir(new File(dir, s));

}

}

return dir.delete();}

删除文件如图10所示:

图10 删除文件

3.6读取文件实现

读取文件主要代码: void readFile(){

fileDialog = new JFileChooser(”F:“);

int state = fileDialog.showOpenDialog(null);

if(state == JFileChooser.APPROVE_OPTION){

try {

File dir = fileDialog.getCurrentDirectory();

String name = fileDialog.getSelectedFile().getName();File file = new File(dir, name);// 创建一新文件

fw = new FileReader(file);

br = new BufferedReader(fw);

String s = null;

this.setTitle(name);

jta.setText(” “);// 清空文本区的内容

while((s = br.readLine())!= null){

jta.append(s + ”n");

}

br.close();

} catch(Exception e1){

e1.printStackTrace();

}

} } 读取文件如图11所示:

图11 读取文件

4设计总结

对于本次操作系统课程设,由于对树状显示目录这样面的内容比较陌生,刚起步阶段花了很大时间去查阅各种资料。当完成设计时,感觉掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识。比如对树的展示有了很好的学习,对二级文件系统也有了很好的了解,熟练Java布局的使用,如何解决实现里面功能的各种问题。本次设计集树、监听器、布局、输入输出流、文件系统这几方面的知识而成,具有一定挑战性。

5参考文献

上一篇:见面会活动策划下一篇:模特走秀主持人串词