|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 thinkfunny 于 2019-12-9 13:34 编辑
+ f, v5 z; C. {+ h+ `! y6 \; K& v) |& N- S
; g7 I' c1 n$ [. E3 E* K
文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识。" e9 A9 q! x0 t9 R
2 B! Q; e h9 f: X9 [, W
本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录、挂载基本原理、文件存储结构、软链接硬链接、和常见目录的介绍。相信有了这些知识对于深入的学习linux会有一定的帮助。文章例子主要是基于ubuntu发行版。
1 ?* c# O/ E5 E+ g6 t
0 O; L; Q6 \! d 如有不对之处请大家多多指出。
. D! w: ^, X+ {, `; C& p% z+ Z' q2 T( T: I
1.Linux磁盘分区和目录; l1 j w9 N, J0 ]1 a a% c
# ]+ j! }; y7 |8 z Linux发行版本之间的差别很少,差别主要表现在系统管理的特色工具以及软件包管理方式的不同。目录结构基本上都是一样的。Windows的文件结构是多个并列的树状结构,最顶部的是不同的磁盘(分区),如:C,D,E,F等。6 i' E4 E# ]# i) ?1 x& \9 j9 E
4 K. A, v2 e7 J$ `( b8 \* N5 {Linux的文件结构是单个的树状结构.可以用tree进行展示。 在Ubuntu下安装tree(sudo apt-get install tree),并可通过命令来查看。
6 G! |" x# Z$ |
9 _" P/ Y' t# J1 A每次安装系统的时候我们都会进行分区,Linux下磁盘分区和目录的关系如下:: w2 M4 d9 |2 ~9 _. N" \5 m
; N* M, s5 J. R$ P S* e' L
– 任何一个分区都必须挂载到某个目录上。
/ g3 Y: W, C: h2 m* Y! P/ ^/ L* o' g4 h- `3 I+ C
– 目录是逻辑上的区分。分区是物理上的区分。
3 _% \* d1 D. |- o+ x8 g. `: g
5 y3 k9 f( F6 E6 o7 P- g– 磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。( ?5 Z' f4 E% P2 a
[% G; x3 n3 K5 [% n9 t" x$ D
– 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。 s. R7 T M# Y
! {: ~% x. o5 m2 g1 Q以下是我们可能存在的一种目录和分区关系:& h& Y6 O) M! x! D# W
; T" v1 N2 a2 t, Q
3 l# G t' `8 _8 [
5 l8 T" R0 L* D
图1:目录和分区关系' q$ V4 K) Q ~ N1 L9 Y$ T
1 @2 x2 v- T* C- J' K! n7 eQ:如何查看分区和目录及使用情况?
7 Q6 a' I& [, f m
6 {( e, y7 e4 H– fdisk查看硬盘分区表
) Z6 _, l6 S, c4 g( T- _0 @$ i! P( v0 t+ a: H
– df:查看分区使用情况
8 H- p( w5 o: p6 E& d' A- n0 a K: @" c' k' W6 g- {+ K$ ^, {
– du: 查看文件占用空间情况# X2 s* @0 E& M, s( b# R
# L; ]% y' h; f* e1 C
Q: 为什么要分区,如何分区?
' _- h" ~2 P. s
4 M3 F+ L- K( z# n1 m" ^– 可以把不同资料,分别放入不同分区中管理,降低风险。1 M+ n7 d7 I/ n' b
4 O4 l% g# ?* L' g, d
– 大硬盘搜索范围大,效率低2 y. E& V7 w* W6 W; Q
) f7 P9 u( G$ M7 ^6 d3 ]" ?– 磁盘配合只能对分区做设定
% a% P% T% M; @2 i
1 q2 a! V- \1 O– /home /var /usr/local经常是单独分区,因为经常会操作,容易产生碎片
+ q4 d3 ^1 H' @* x
. y' V% I; r0 i% |( |7 _ " u S% e/ f3 @9 R* p p
' F& k1 E8 }4 } L% L+ S1 E1 Z
2.Mount挂载和NFS简介5 D2 Y9 _# S Z6 D8 H
9 c% h; U$ W3 x" }( c- \7 F3 Q
挂载的概念 :当要使用某个设备时,例如要读取硬盘中的一个格式化好的分区、光盘或软件等设备时,必须先把这些设备对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才可以读取这些设备,而这些对应的动作就是“挂载”。 将物理分区细节屏蔽掉。用户只有统一的逻辑概念。所有的东西都是文件。Mount命令可以实现挂载:
9 O: i' W( r1 t2 ^" G2 l6 Y' l2 T* F$ R9 n
mount [-fnrsvw] [-t vfstype] [-o options] device dir' X0 c8 O0 D& a# M0 [/ W2 \0 [
3 V8 C6 y5 a6 m% m6 Y" } m qQ:所有的磁盘分区都必须被挂载上才能使用,那么我们机器上的硬盘分区是如何被挂载的?
5 w9 h! Y/ ^1 b" T# e. y5 r* E% v: {9 K& g* l. f1 R
A:这主要是它利用了/etc/fstab文件。每次内核加载它知道从这里开始mount文件系统。每次系统启动会根据该文件定义自动挂载。若没有被自动挂载,分区将不能使用。 如下是我的/etc/fstab的定义,主要是根据装机的分区来的:4 U" ~. C( w, M/ s, I& L6 ]
! ]: G; z/ n. c$ O/ R
# <file system> <mount point> <type> <options> <dump> <pass>8 d- `; C ~" w
9 V, ]$ a: G% j4 r/ D- c4 sproc /proc proc defaults 0 0
! m7 K2 p7 E2 `
2 `1 |0 \# B5 X0 j#/dev/sda1被自动挂载到 /! @: ? i! ]/ F! P( g
& w) B/ u1 u) X1 F$ @UUID=cb1934d0-4b72-4bbf-9fad-885d2a8eeeb1 / ext3 relatime,errors=remount-ro 0 1
& }! s8 f2 y8 R6 l: s! M1 L& u9 c/ \. E' D
# /dev/sda5 被自动挂载到分区/home% m) j; J r1 {1 p$ g/ P
: G* t5 R$ i2 G+ d. SUUID=c40f813b-bb0e-463e-aa85-5092a17c9b94 /home ext3 relatime 0 2
; K( C' s" V$ C
* I& ^. Q, U9 R$ c#/dev/sda7 被自动挂载到/work8 L( Y& ~2 ]$ j# n
, q% J% _& |+ s }
UUID=0f918e7e-721a-41c6-af82-f92352a568af /work ext3 relatime 0 2
( B) z7 @1 d3 L1 K! Y1 j7 j! _0 {; k/ j* I% L1 u) J% [
#分区 /dev/sda6被自动挂载到swap" T o1 m( k: n. {% E' d5 D: S
( n) d( E( p+ Y( G8 Z4 e
UUID=2f8bdd05-6f8e-4a6b-b166-12bb52591a1f none swap sw 0 09 v5 L5 b* k X4 u3 R7 x
* K" [6 S, z; p, K" i0 _
6 o: _5 A2 V9 h( Y$ W+ k2 L3 [, A; t/ r0 u2 D4 L8 n
Q:移动硬盘如何挂载?如何挂载一个新的分区?
+ b! E2 L' @ \: t# y$ {1 I) v+ B! a$ p: U/ ?
移动硬盘有驱动模块会自动挂载,如果有个新硬盘,要先进行分区,并通过mount命令挂载到某个文件夹。如果要自动挂载则可以修改/etc/fstab文件.* }" Q/ h; _: E6 U& w+ b
& a: R N# U+ u4 M* y
NFS简介:NFS相信在很多地方都有广泛使用,是一个非常好的文件共享方式。我们公司所使用的上传服务就是把文件上传到某台网络服务器上,中间就是通过NFS实现。
) k1 J8 \8 j/ F1 L. {% K
; ~2 k' \: E4 N2 i$ N1 d使用NFS客户端可以透明的地访问服务器端的文件。NFS也是通过mount来实现,底层是通过NFS通信协议实现。基本原理:: s A' C) X7 Z. R7 K0 d# D$ w4 _1 H
! R3 _( k8 q8 m' t
6 d9 C$ g0 m; `2 ?
8 ~8 Y% q, q! B) \1 z* N
图2:NFS基本原理
3 l$ K; y* N/ H( y- O, B+ `7 B( J7 f' W& V. b. ^# d$ F: {
) B7 I9 l. E3 U! n& e' \, |1 X2 a& U/ Y: p+ t; L: J4 z. P& Y1 |
Ubuntu下面Ubuntu下的例子
! L( X! ]& Z! G- S7 N0 n, c
( [$ r) a, x0 U2 \8 m# m) |服务端:& M& p& e0 `! I2 v% v
M' j- Q: c' t$apt-get install nfs-kernel-server
; q) B6 @6 R$ B& K( c3 T
( h- r5 Z* H/ N; w0 Hvi /etc/exports 添加nfs目录: /personal/nfs_share
, w4 h% X8 v+ D" z
1 H& X' s7 f6 s10.1.60.34(rw,sync,no_root_squash)
5 w" R5 g% r: K. D7 V2 R6 |9 O; `% j* c5 ^: s. D
$sudo exportfs -r/ E1 @& @2 V$ S0 S! Q& ^1 o, @
; _( l$ b* ~) g; O1 I" D1 p$sudo /etc/init.d/portmap start
! H3 K# ^ g! v l& d& Q! [' H- c
$sudo /etc/init.d/nfs-kernel-server start% {7 g, T; Y# I8 |' X
- Z& I- U) j: R- Z
客户端:
Z9 H* m3 h& s+ m) f0 {1 U/ d5 @4 L; K4 K1 V: R' U
$sudo apt-get install nfs-common6 g3 `, [& z1 H4 F5 u
) U( p& k! b' U# h+ |: N
$sudo mount 10.19.34.76:/personal/nfs_share ~/nfsshare例子:
! m& O% T. D; G9 c& m# G V7 w3 P, P
7 O- y% H" m( ^& n
( W( H! ?8 K1 G1 j$ S% r2 f
3.文件类型8 Y2 `/ D$ b8 e2 u
9 `0 h P. w! f- k0 \( H
Linux下面的文件类型主要有:
+ ]- f+ ?* Y1 v* F) ~& ?! h+ a% |! b; L7 l: a p) l
a) 普通文件:C语言元代码、SHELL脚本、二进制的可执行文件等。分为纯文本和二进制。
7 Q& x: [6 R5 ?2 ]
$ R2 O) Z( B# M( H( H1 u$ I+ Vb) 目录文件:目录,存储文件的唯一地方。
9 o! n7 l' ^" m, @6 K9 Q( p c5 S7 h5 C) Y
c) 链接文件:指向同一个文件或目录的的文件。, k! d& [7 O) }1 A) ~5 F
3 L5 P/ _1 H" {9 l( r' o% B$ i- _& r
d) 特殊文件:与系统外设相关的,通常在/dev下面。分为块设备和字符设备。- c7 O& L1 _4 o5 t O2 A
d" \3 t( h/ }2 i可以通过ls –l, file, stat几个命令来查看文件的类型等相关信息。* o: [+ m& Q S2 }- I3 ~. |
7 O7 a& F1 G3 g0 e( B1 Q' G f5 v# n
4.文件存储结构# X5 J; D1 F6 V) c/ L5 [% ?+ S
/ ], o3 w3 X1 [- A7 c' s* \Linux正统的文件系统(如ext2、ext3)一个文件由目录项、inode和数据块组成。
5 U G0 O' ~7 o8 q. ^3 m8 p2 t& x
! ?/ r/ V2 w3 W; J/ d7 q5 `目录项:包括文件名和inode节点号。
$ ^& _. A" g8 q9 o- E2 ^' V& H- K0 i% a9 L/ ^
Inode:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。9 d* D$ o6 S. @; ^% b% W% |$ A: i8 @
) i' q1 V8 L; q数据块:文件的具体内容存放地。
% e' @' W7 w; n# E" t0 J6 B
; a: z6 m2 J, e' q5 T$ m6 z% N- d8 t% c+ a B$ G& s. O
Linux正统的文件系统(如ext2、3等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。) E3 ^& @) Y( W# `6 B2 Q
7 R! f5 H+ x+ }. w; I站在2w英尺视图,文件存储结构大概如下:
$ o2 U2 {/ k5 J! G
7 Q% ?# u! D8 Y8 z
' X$ g5 B+ q# @! X! ~
+ e; @2 ?5 l" Z# |1 I; N, F图3:文件存储结构2w英尺视图
3 N7 d- g: k/ G' U. ]6 f8 \6 l
3 s* [4 `6 ^* ~+ b$ A% |+ n+ e7 P7 g/ T5 z: G3 k/ i0 g
其中目录项的结构如下(每个文件的目录项存储在改文件所属目录的文件内容里):
( @6 V; h: A$ ^3 p4 y9 e1 ], \8 ]0 |) O7 V
* A2 l% `( k( t0 t6 P( C, S
6 m- e* J" g7 Z! Z9 | 图4:目录项结构 ( U- s9 e) I+ c& Z
: H/ v3 e, k7 S. J; Q. ^) @: L' c A# o9 @# w$ N3 K: [
其中文件的inode结构如下(inode里所包含的文件信息可以通过stat filename查看得到):
. U3 L$ S W, _8 v/ ~0 ?5 Q# x
+ S; G U" ]4 S+ _
" v9 a) o8 d8 o* p, B9 N- g& J' ~' i# d, [2 t7 N
图5:inode结构* b' g' ?( d! m) k4 n* E& P
8 Q* f0 H0 Z0 T+ B: \# w, P4 Q6 k2 ~! o M/ Y6 K# _* Q
以上只反映大体的结构,linux文件系统本身在不断发展。但是以上概念基本是不变的。且如ext2、ext3、ext4文件系统也存在很大差别,如果要了解可以查看专门的文件系统介绍。
. z" S* U* \6 ?1 Z8 y
h* S+ K6 l2 R- z5.软连接、硬链接
0 ^- v5 S0 ]' {% R5 [# m* q8 L: j$ W
软链接和硬链接是我们常见的两种概念:
( ], I: |7 R+ @8 ?8 r
: O8 W8 J' ~; d$ R) w% l硬连接:是给文件一个副本,同时建立两者之间的连接关系。修改其中一个,与其连接的文件同时被修改。如果删除其中任意一个其余的文件将不受影响。
: y5 D# _7 M. V" m, V
* j& f6 S6 b: U' k: [/ u软连接:也叫符号连接,他只是对源文件在新的位置建立一个“快捷(借用一下wondows常用词)”,所以,当源文件删除时,符号连接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。
4 O" b3 ?# ^, o; `2 V; l1 G: ]; }- j" R1 ]: w9 u1 `
具体关系可以看下图:9 p7 Z. c/ v7 s2 [* @5 k, B8 l2 e
( ~( O- |4 V1 o
4 G! k2 K4 m0 q* H) X! \3 M, c. ]7 F$ O/ ^* Q" O- ~8 X
图5:软链接和硬链接
( k: O+ I; j" w4 ^/ y
3 ` o! M0 v1 j; U' b% T( I6 L" `9 V) c4 J. k, z
从图上可以看出硬链接和软链接的区别:
# n( T% H6 {6 D& h
& ]& ]5 M* r7 l1:硬链接原文件和新文件的inode编号一致。而软链接不一样。
$ ]* A! T4 m+ R6 p- U6 Z! ]- W% ?( z. P
2:对原文件删除,会导致软链接不可用,而硬链接不受影响。
* F+ \1 W+ S# }- {4 Y Q7 \6 }# i+ R0 ]
3:对原文件的修改,软、硬链接文件内容也一样的修改,因为都是指向同一个文件内容的。) H) x4 E8 A& V/ ~* I. L: B
+ ?1 G' \" k) D' C" Z: D
! \# R* s4 q! A+ g" X; t
9 d1 T `" y/ D9 y6 s) k3 k$ d4 \6.文件目录管理命令/ W( F$ R/ Y# z) {, v' D8 [
0 m) c( T7 s, f$ S; u磁盘和文件空间
* v/ \/ f/ E) j B+ Y
* B* L( F. ?7 c0 M/ W/ hfdisk df du, P' u: t6 \% b5 G( ]
/ C4 s4 m# t; S文件目录与管理1 ?5 K( A& X! z2 e
$ S: T) [8 |& v5 \
cd pwd mkdir rmdir ls cp rm mv; ~4 a! n8 Q1 L6 D
' J/ O1 ~! |, G) f( m
查看文件内容8 L! r" y+ c) `
3 I* ]4 }3 P& A4 Q
cat:
: m2 t5 ~$ R! n% j% ]& }cat [file]: ]9 x) h5 `0 B) H1 ~6 G7 U
查看文件的内容。全程式concatenate的意思,将文件内容连续输出到屏幕上。第一行到最后一行显示。2 c1 a- b! V" U8 y* v
tac:
6 R( r7 W8 `" v+ t [* R4 g& e# |2 atac [file]# v2 D) d$ G. Z+ U
和cat刚好相反 是从最后一行到第一行的方式查看。0 Q6 S$ U1 Q5 \$ s- A% N
+ S1 ?5 M5 B9 ^9 H% Q+ }cat有个比较不好的地方时当文件比较大时候没办法看清楚,这个时候可以用more或者Less命令。
9 Y9 V& C; T6 D+ j' S* X' x
1 p5 R9 @2 P% N. Nmore:; e V; e" P( C6 r* k
more [file]4 a h. n* n* ?+ `7 F
如果使用grep或者find等命令时,可以配合使用more一页一页的查看。如果看到一半想退出,则敲入’q’即可退出。% \0 `/ C9 d1 q8 }6 _
less:
$ ~+ ]# S; M' K9 ]1 Q2 u7 G7 q( N% @less [file]
6 x9 q$ d( S! G" s7 `9 P6 d+ ^3 iless比more更有弹性,可以上下翻页。3 u |/ ]5 a. f7 R
# m9 ^$ j2 I; e/ E! \7 I
如果只想读取文件的头几行或者文件的末尾几行,可以用head或tail.3 |- W) G3 |$ ^( _6 I
head –n [file]:读取文件的前n行。( _# k. [/ ~* C i
tail –n [file]:读取文件末尾n行。" w6 J2 R8 k4 E
- d3 n: G6 m/ z5 a1 R
以上命令都是用于查看字符文件,二进制文件出来的都是乱码,要看二进制文件的内容,可以用od命令,如查看一个MP3文件里面的内容:& Y# L% s7 E0 s6 F8 E
od shijiemori.mp3
, W; @6 \) x& ]! E$ J* [2 c- g* h* M* k7 x
8 O/ b" K1 B2 M2 t! k文件目录与权限! @7 ?8 j; [4 E7 ` |
* I2 v) W3 Y* A3 {$ A& l7 {. I1 [! m
chmod chown chgrp umask
4 L( L7 x& b8 P! m' P, i. \% |: q4 n- o
文件查找
( n4 j$ R' J: L' L' ]8 S* k5 [5 {; r, |) v6 B O- @
which:& I5 r- j$ [4 P
which [filename]$ x5 c6 w0 a3 ^ F; K- I
该命令用于查询通过PATH路径到该路径内查找可执行文件。9 W8 F+ V3 ~3 x$ |
如:Which passwd:查找可执行文件passwd
9 e$ u6 Z% _0 V4 W" P; j) Ewhereis:9 w2 d) u. |1 z2 K
whereis [-bmsu] [keyword]
2 O. m# b; H' \+ ~2 ~该命令用于把相关字的文件和目录都列出来。(Linux 会将文件都记录在一个文件数据库里面,该命令式从数据库去查询,所以速度比较快,Linux每天会更新该数据库)
9 B, r& U5 R2 R o" C
" v; ~: x2 I h# W# H0 e( k. g$ Blocate:
$ h: q3 ~/ h6 ~( Blocate [filename]/ Z* ~ ~4 ?$ V' G: d! ^
该命令用于把相关字的文件和目录都列出来。查找数据特别快,也是通过数据库方式来查询。但是数据库一周更新一次,所以可能有些存在数据查不到。可以去修改配置文件。
* ~' c% h8 S5 }- M! v. H9 _9 i) r* u+ k
find:
6 g" T0 s; L! f( [0 k( Ifind [path] [参数] [keyword]4 ~! @6 g2 Y5 k4 E, V
该命令用于在指定路径下查找文件。不是通过数据来查询,所以速度会比较慢。
! D9 F6 S$ ?& Q0 Z. T. s& `2 |. h P. \ H7 f( `. B9 k5 M" E K
7.常见目录解释
- p) \ s6 f+ {4 \1 U; r$ D2 A: h Z- F
Linux各种发行版的目录结构基本一致,各个目录简单介绍如下:
$ c0 V4 Z. I% @' D D. A" D5 c
! u1 p! l, z" i9 p1 _6 ^ 5 |1 }( K* L6 c
目录 | 描述 | / | 根目录 | /bin | 做为基础系统所需要的最基础的命令就是放在这里。比如 ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。 | /boot | Linux的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;启动装载文件存放位置,如kernels,initrd,grub。一般是一个独立的分区。 | /dev | 一些必要的设备,声卡、磁盘等。还有如 /dev/null. /dev/console /dev/zero /dev/full 等。 | /etc | 系统的配置文件存放地. 一些服务器的配置文件也在这里;比如用户帐号及密码配置文件; /etc/opt:/opt对应的配置文件 /etc/X11:Xwindows系统配置文件 /etc/xml:XML配置文件 …… | /home | 用户工作目录,和个人配置文件,如个人环境变量等,所有的账号分配一个工作目录。一般是一个独立的分区。 | /lib | 库文件存放地。bin和sbin需要的库文件。类似windows的DLL。 | /media | 可拆卸的媒介挂载点,如CD-ROMs、移动硬盘、U盘,系统默认会挂载到这里来。 | /mnt | 临时挂载文件系统。这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom 等目录。可以参看/etc/fstab的定义。 | /opt | 可选的应用程序包。 | /proc | 操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统,它的定义可以参见 /etc/fstab 。 | /root | Root用户的工作目录 | /sbin | 和bin类似,是一些可执行文件,不过不是所有用户都需要的,一般是系统管理所需要使用得到的。 | /tmp | 系统的临时文件,一般系统重启不会被保存。 | /usr | 包含了系统用户工具和程序。 /usr/bin:非必须的普通用户可执行命令 /usr/include:标准头文件 /usr/lib:/usr/bin/ 和 /usr/sbin/的库文件 /usr/sbin:非必须的可执行文件 /usr/src:内核源码 /usr/X11R6:X Window System, Version 11, Release 6. | /srv | 该目录存放一些服务启动之后需要提取的数据 | ' Q2 o9 [3 U: @8 z2 X
0 R/ U2 c, Z, Q; S- k
2 `. z& X+ B+ K4 J , f3 T: l z$ E# B
% p8 Y2 ~+ ?* t6 H( x$ w
; |/ }* o5 E. K! ]- |# T# [' q5 d: g- w7 H
1 f1 s* ^0 J6 A% t/ x2 e' k1 i
|
|