|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 thinkfunny 于 2019-12-9 13:34 编辑 $ Q0 n1 y! ~; r1 X a" ?7 X
$ W$ V. v/ P9 d) ]7 p3 x; g1 R& {" L0 i: x, W) [9 `
文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识。# f0 ]* `/ @& X2 M
9 ^% c+ O: M) m3 F/ C0 {1 e 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录、挂载基本原理、文件存储结构、软链接硬链接、和常见目录的介绍。相信有了这些知识对于深入的学习linux会有一定的帮助。文章例子主要是基于ubuntu发行版。
7 S+ d C) l: G# P' V2 \. `: F4 @3 w4 E4 m
如有不对之处请大家多多指出。
! T# C V$ l+ ^9 U9 W8 b, W# G& f5 d) V0 v, g" L
1.Linux磁盘分区和目录) Q" w, ] V; [4 A# u
$ Q4 S. K V0 F; Y2 Q Linux发行版本之间的差别很少,差别主要表现在系统管理的特色工具以及软件包管理方式的不同。目录结构基本上都是一样的。Windows的文件结构是多个并列的树状结构,最顶部的是不同的磁盘(分区),如:C,D,E,F等。
4 N0 Q; c3 W: n! r
8 ^( v, E0 ]+ ?. g7 g5 K# GLinux的文件结构是单个的树状结构.可以用tree进行展示。 在Ubuntu下安装tree(sudo apt-get install tree),并可通过命令来查看。% S2 r) m, d! V* p& h1 c
2 i/ q# Y n8 f' e& x( Y [
每次安装系统的时候我们都会进行分区,Linux下磁盘分区和目录的关系如下:
* C- P% y* ?* M* |! s: ^8 V
/ l/ s* C- x2 W' f- o# H% T– 任何一个分区都必须挂载到某个目录上。
B+ t$ c. Q) ~3 }: x9 U. @/ q' ?& a% X, w& a0 S3 V+ T+ g7 i" x
– 目录是逻辑上的区分。分区是物理上的区分。" U- e4 V q9 S, x% [7 J* ?: i
6 ]$ D7 l) [- y2 j# `2 W– 磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。0 T) s6 V9 z/ ~: p9 D
& T" |" X" [. ~3 ^ |
– 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。
' x V2 P+ Q: s h$ ~5 I9 m, I2 ~+ U) O9 p2 n B* K" ?
以下是我们可能存在的一种目录和分区关系:
* h0 u3 K6 }1 d# {; T3 v0 H- {$ z
5 A& }; q8 C5 D% }+ n/ U. G; J6 q' J
6 y) P( p# S9 r
$ e2 v7 w- x6 v k- t; H
图1:目录和分区关系' S) ~4 o* l/ q# _, o9 x& D' U
. o" F6 D9 u) G8 l. h4 ~ D' G
Q:如何查看分区和目录及使用情况?
, J3 u, u0 _- _2 e6 P1 O% [0 \
" m/ j) B" r# N3 F5 A8 t– fdisk查看硬盘分区表% W' T( H" w5 d) @# o8 H
. l. g/ k9 j4 H5 e1 ^– df:查看分区使用情况
+ q" @& C% g: G% @* B$ P0 h3 l1 v0 T) B5 u! f7 v
– du: 查看文件占用空间情况( B" u P0 \8 M- t
. x4 a3 [3 X( W" z: V; OQ: 为什么要分区,如何分区?
2 D& M5 R/ C$ k7 a0 |8 B
+ V# ?9 `3 o2 H- v" Q6 ~– 可以把不同资料,分别放入不同分区中管理,降低风险。5 K; g! T! J& ?+ I* Z4 e9 g: |
1 [" u$ `6 r3 M. P, ^; g9 ~1 d– 大硬盘搜索范围大,效率低- m( H& v1 ?' T B4 M( }
+ p/ \" p( D+ V+ {) M* L4 X– 磁盘配合只能对分区做设定
1 P8 ~/ p* r2 O* g0 C3 R6 y) L2 p" S
– /home /var /usr/local经常是单独分区,因为经常会操作,容易产生碎片/ U7 ~( g, I/ s" C' Z
9 C+ H) W9 s! d
1 b5 j& p& e" u1 W" B, R1 O" P& ^: Y# s0 L
2.Mount挂载和NFS简介
' l4 q% g- c! U$ a8 f7 E2 c6 L+ E2 N# L% U
挂载的概念 :当要使用某个设备时,例如要读取硬盘中的一个格式化好的分区、光盘或软件等设备时,必须先把这些设备对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才可以读取这些设备,而这些对应的动作就是“挂载”。 将物理分区细节屏蔽掉。用户只有统一的逻辑概念。所有的东西都是文件。Mount命令可以实现挂载:, \9 M- E% w1 W
' Y3 q( q+ k, H3 {8 A9 x+ A
mount [-fnrsvw] [-t vfstype] [-o options] device dir# i& ^4 \3 g0 ~$ e: `$ z! A: \
+ B" Y( `$ Z* x+ V/ N$ i
Q:所有的磁盘分区都必须被挂载上才能使用,那么我们机器上的硬盘分区是如何被挂载的?
; a1 g7 m$ W1 b I& U' j4 a
( |" c, W( `4 N( v' {A:这主要是它利用了/etc/fstab文件。每次内核加载它知道从这里开始mount文件系统。每次系统启动会根据该文件定义自动挂载。若没有被自动挂载,分区将不能使用。 如下是我的/etc/fstab的定义,主要是根据装机的分区来的:- J" w; S, m% C
) H, z5 B1 I4 r, Y# <file system> <mount point> <type> <options> <dump> <pass>. s F( k2 o0 g1 j* n
/ X" q4 X* t# X4 G) U
proc /proc proc defaults 0 02 X/ M k; k) x! b1 c# p5 m
9 r5 V. O1 [. r7 S9 e& B#/dev/sda1被自动挂载到 /! d3 c/ x$ G* J; e
7 G! w' r" C5 V* C) o' E
UUID=cb1934d0-4b72-4bbf-9fad-885d2a8eeeb1 / ext3 relatime,errors=remount-ro 0 1
- Q0 t/ Q3 t7 ]$ C8 t
' ?6 L. E" n# H! B# V# /dev/sda5 被自动挂载到分区/home
- H) Y5 E' u5 C1 _, K, h6 ^ |. }$ e1 T% `
UUID=c40f813b-bb0e-463e-aa85-5092a17c9b94 /home ext3 relatime 0 2
* w0 L7 W( `6 }2 j5 A+ z
0 g4 H5 W0 n* m* m4 |& Y3 b1 j" V#/dev/sda7 被自动挂载到/work+ i' D. R" J9 W% n" \
9 X0 U4 E* V9 A/ x( K& n( ~UUID=0f918e7e-721a-41c6-af82-f92352a568af /work ext3 relatime 0 2
; P4 ~1 W( F& T# \6 M" I: G: S3 l3 T# m+ {" v: P
#分区 /dev/sda6被自动挂载到swap2 Q G- O6 n) P5 t& G( c$ W
; j/ z1 P. u9 @7 W+ q; z
UUID=2f8bdd05-6f8e-4a6b-b166-12bb52591a1f none swap sw 0 0! V6 ]' D( S p# v& R# Q
8 n2 k8 `( a+ P C % R# x) C- r; G; }
. f8 P" g- f, k* M& NQ:移动硬盘如何挂载?如何挂载一个新的分区?* x- o3 H. h; J4 x6 c: \" d
) V; i& h7 n$ ]3 {! M1 S
移动硬盘有驱动模块会自动挂载,如果有个新硬盘,要先进行分区,并通过mount命令挂载到某个文件夹。如果要自动挂载则可以修改/etc/fstab文件.
% |2 M' c5 {" p' `/ ^. Q8 N. @. n, q# o( A4 L* C3 E1 i
NFS简介:NFS相信在很多地方都有广泛使用,是一个非常好的文件共享方式。我们公司所使用的上传服务就是把文件上传到某台网络服务器上,中间就是通过NFS实现。/ v/ U, r4 J3 o; z' Z5 A8 k1 b
( s2 Y/ W2 a: F$ V i
使用NFS客户端可以透明的地访问服务器端的文件。NFS也是通过mount来实现,底层是通过NFS通信协议实现。基本原理:
$ T4 t8 G' A( K' t( ^8 f2 e5 [2 D* ?% x
( P i2 o- m# b6 V
+ v' y' j0 r( q0 ]' k3 M: C图2:NFS基本原理
7 @- b0 V5 k' @6 i# o' u( @* L f4 u r& U1 ]( w
, V% ?0 ?8 a: \! ^
$ @' K {" j0 l1 MUbuntu下面Ubuntu下的例子
; I3 U" B$ \7 E+ V, [; W6 B% }5 d7 N/ x" G7 z0 Z
服务端:/ a& s& ]: I- a4 q2 ~+ X3 k& b
7 {3 t2 t" b3 Z( i! ?3 g( P& L) q$apt-get install nfs-kernel-server
% Q/ V( S% O( ^; S/ J, u9 E+ w: D% k+ C# m5 {
vi /etc/exports 添加nfs目录: /personal/nfs_share
* g2 C7 p4 D/ L) N5 N1 }& R, M- j8 o. _0 ?3 A
10.1.60.34(rw,sync,no_root_squash)
2 e' g7 k) m5 ^! P% L, d3 s
: W; ~+ j* [- n- z$sudo exportfs -r
4 t- \8 m, y/ a3 a* H" A3 r+ z" @2 I" k# R
$sudo /etc/init.d/portmap start
% b c; k& n9 b- `0 o
/ }+ @. ` U1 U2 J+ u- m7 K, R9 _$sudo /etc/init.d/nfs-kernel-server start
) F" G% k3 ?: v! B- V$ K% Y# O) N0 K: e; t5 A7 |1 a
客户端:5 w& d- z" ^- D( j1 T! k( `' Z- F7 Z$ J
3 l% z2 _6 z- M s2 a, p$sudo apt-get install nfs-common
1 E X" H) B0 v5 }- {6 p- O0 q9 `) D/ F& Y' @. Q( g' j
$sudo mount 10.19.34.76:/personal/nfs_share ~/nfsshare例子:- p# k5 Y6 a: g6 b/ y
: f0 e$ `8 G$ O) \; F$ W4 ^
" K9 {) `& Q/ w% S1 [
) l7 m* U1 Z. v3.文件类型
5 G2 \9 _: {3 R" g5 r9 v- e; V, M" ?
Linux下面的文件类型主要有: U1 R2 J# \; |% w2 o0 L* B- v
k( j; t0 x4 V0 W7 C$ x0 D: q
a) 普通文件:C语言元代码、SHELL脚本、二进制的可执行文件等。分为纯文本和二进制。/ v- Z$ F' S, i `
! D# [ Q7 `7 s+ }2 ^6 S. d
b) 目录文件:目录,存储文件的唯一地方。
1 W1 W! y4 c0 ?" ^3 ]/ V0 x5 M3 s. V% _/ O+ m- G8 I
c) 链接文件:指向同一个文件或目录的的文件。
8 U" {' T& M! |( n; \) ~4 Z7 b( Q
3 l5 d& r" U! n1 e3 {% c, V: ^d) 特殊文件:与系统外设相关的,通常在/dev下面。分为块设备和字符设备。0 F8 A8 }* L% x0 H
3 f$ C$ j6 Y: y. w
可以通过ls –l, file, stat几个命令来查看文件的类型等相关信息。
8 H" B8 m! l1 E( u' o/ h6 M: ]7 ^# E) ?+ @8 |" { N ~
' H" }3 D# @3 X( u0 O4.文件存储结构% @; j! z# Z8 ~
. V( z/ I- b' F" U$ x& Q
Linux正统的文件系统(如ext2、ext3)一个文件由目录项、inode和数据块组成。
) g1 m3 N& }* a+ s8 k' W4 r
4 q+ O. }9 r) E目录项:包括文件名和inode节点号。
* W5 Y7 ]1 E$ E: H2 @3 @5 k
# z9 c: b7 [% X5 fInode:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。8 f# E# S, q& l0 I: Q7 k$ U
& M! Z; ^& v& T; B( R3 J数据块:文件的具体内容存放地。
6 k( x/ d0 t8 _! S1 R+ H8 g9 H, g! }3 X: q/ D
2 f' R$ \. `4 L: Y3 V, L' t6 \
Linux正统的文件系统(如ext2、3等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。
4 C' R+ \1 n- I. w% J; x1 u) s' Z; d6 O3 H. }
站在2w英尺视图,文件存储结构大概如下:9 b; o7 U# e" K& P6 ^: [. j# N" l' Q
& P% f' y( G1 {5 k" d. c$ c
F8 v' x8 O! p+ |' k0 x8 ^
9 v' `% K6 y" Z2 l% X+ x5 G图3:文件存储结构2w英尺视图3 w. V8 Q( i+ U! @9 P8 \; J9 i
3 x$ r) ^0 ^* f
( a* f$ ?- O! Q% \+ d3 J0 z& b
其中目录项的结构如下(每个文件的目录项存储在改文件所属目录的文件内容里):$ Y' I) t- ~ Z9 E6 A3 w/ `
' a! z) P: F; y) h. ?( ]$ F" X0 _3 P
* N, v c0 ]9 s+ X" o4 G% N
7 F) s9 }' s1 Y; u/ j6 |# K 图4:目录项结构 , S" d6 \8 V; W* h; ?
/ F8 o" [* u+ t
; e" [3 y9 r- \
其中文件的inode结构如下(inode里所包含的文件信息可以通过stat filename查看得到):0 @3 f9 d9 Z6 }7 u2 Z+ o* g* v
& ?1 r# y6 M; k. x! b( v
, r, `4 n6 F% L* _* w
5 X' V$ N$ r+ L图5:inode结构
+ N; c5 w1 s$ R
4 V r d# {, j% ]9 z! O4 g7 P& @( t5 g
以上只反映大体的结构,linux文件系统本身在不断发展。但是以上概念基本是不变的。且如ext2、ext3、ext4文件系统也存在很大差别,如果要了解可以查看专门的文件系统介绍。
0 u1 a, {' q8 r+ g. I( @
$ u; d" R5 ]- J$ E, G# z/ n5.软连接、硬链接, |8 e5 ~2 s2 a! n
' P, S+ u* @, ~0 T
软链接和硬链接是我们常见的两种概念:
8 V1 x( p) i. `( @' C3 Z& R" ^- H
硬连接:是给文件一个副本,同时建立两者之间的连接关系。修改其中一个,与其连接的文件同时被修改。如果删除其中任意一个其余的文件将不受影响。' y! J3 a* n* F' }% f2 M
. d; J) s- p ~ O3 @
软连接:也叫符号连接,他只是对源文件在新的位置建立一个“快捷(借用一下wondows常用词)”,所以,当源文件删除时,符号连接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。
/ z3 j( {: G2 S' v! m
- S+ X, t4 q: N/ ]) J7 ?" [具体关系可以看下图:. ]6 S8 z$ _/ }
: ?& X: I+ d! g+ U, B
6 K% J' [( s" m5 i% x
6 K, z) i; S+ M图5:软链接和硬链接
% m; w/ I, y1 x' b7 g2 P5 p7 \ G/ N+ n! @: B, o) `$ p: l) Y& v
/ {3 v, q# c4 M: ]
从图上可以看出硬链接和软链接的区别:
5 M1 y a' }4 ~0 m9 l" C4 C' C( n7 ]
+ y$ K( W/ b9 C" L0 E3 ]1:硬链接原文件和新文件的inode编号一致。而软链接不一样。
# w7 @7 B0 `# z
+ H; [* L) {4 k2:对原文件删除,会导致软链接不可用,而硬链接不受影响。, D7 K, z% |, w& z- f9 s4 l2 v
- W3 D4 I& g* g
3:对原文件的修改,软、硬链接文件内容也一样的修改,因为都是指向同一个文件内容的。
8 J" Z$ ^- N4 z* ?; W) J$ r
, O) l9 k D" m! j2 L- U ) f- o' F7 ~! k0 B1 D
3 V! h2 Q& E& O1 T6.文件目录管理命令
! J) B3 f6 r/ {
6 @. l9 J, p* Q' z6 c$ Q0 Z- d) [磁盘和文件空间& B: _2 B$ M2 U0 l( T: o
. Z: \7 A' k, `* A
fdisk df du
; M$ s( H8 Y3 @$ ^5 @( Y
/ Z! h3 ?' u- e/ l2 @% }5 Q; E2 B文件目录与管理' Z. v4 @5 a# u- l: n* P8 m7 k
# [6 P1 Y/ j% [$ M' @' C' fcd pwd mkdir rmdir ls cp rm mv
+ u- H( l8 m! w9 @0 ?; D$ y" X; p0 c: ^6 M# p
查看文件内容
0 d# x, U- G1 g& H4 R- Y1 f/ ]; L+ `3 }; a" h7 Q
cat:
+ T$ x/ E z; k" K) fcat [file]2 }' C9 A; g0 {- B$ w! v: l6 C* q' a
查看文件的内容。全程式concatenate的意思,将文件内容连续输出到屏幕上。第一行到最后一行显示。
' z3 T/ R& e' G1 P9 N5 T) Htac:9 _0 ]. o) P0 g" U$ N7 N: g" V! }4 b
tac [file]
2 c* b/ D1 }8 {& K/ ~和cat刚好相反 是从最后一行到第一行的方式查看。
2 V& Z" y8 C) c2 I2 v% c9 J# G9 P. h/ e
cat有个比较不好的地方时当文件比较大时候没办法看清楚,这个时候可以用more或者Less命令。
, j3 B4 z. G* ^. Z
6 Z+ y# n* {8 b5 ]more:3 U2 [8 t2 t M9 g3 a
more [file]! B4 I. L" B% z4 q8 ^: H
如果使用grep或者find等命令时,可以配合使用more一页一页的查看。如果看到一半想退出,则敲入’q’即可退出。
2 M6 l% }) z) f/ q# oless:0 c! ]- ^! ^9 U. k$ j/ e
less [file]+ b: G8 u; L8 \0 @6 ~
less比more更有弹性,可以上下翻页。
0 r0 A/ G3 `* p% t( Z$ C L! s
3 c* X$ e+ R) ? J6 \如果只想读取文件的头几行或者文件的末尾几行,可以用head或tail.
1 y! ^- f6 K( U: i/ s& dhead –n [file]:读取文件的前n行。5 Y7 B8 C3 l* Z: e
tail –n [file]:读取文件末尾n行。
7 S2 }9 D9 E6 d6 {0 J- v, [& c
|* H x2 `. G以上命令都是用于查看字符文件,二进制文件出来的都是乱码,要看二进制文件的内容,可以用od命令,如查看一个MP3文件里面的内容:9 Y; c1 S2 a o6 n( L4 l
od shijiemori.mp35 I" o8 E4 v& L; ~
% i. h5 d' Z1 o( i n g" O% u2 I0 o; A; d9 {" Z& x Y
文件目录与权限
9 w" A9 ?5 H: F' s1 e! H. _- B( N/ F- k
chmod chown chgrp umask/ j" j" F5 X- i
6 \ e; p0 k. o5 x/ K+ G文件查找& N# Z, E6 q8 B. G
4 U3 x5 f* k- ~) D% b5 m
which:* n! d# I. r/ w$ ^* K8 {7 |
which [filename]
2 j* B( B5 x1 J. l该命令用于查询通过PATH路径到该路径内查找可执行文件。/ U' S' [, v1 ~. ], n4 L) @
如:Which passwd:查找可执行文件passwd9 o# i9 h" \4 l* Q! s) o
whereis:9 l+ ?2 S/ r5 r$ n4 J F* T
whereis [-bmsu] [keyword]
( Y% t$ S s7 y1 V' ~" u! ]该命令用于把相关字的文件和目录都列出来。(Linux 会将文件都记录在一个文件数据库里面,该命令式从数据库去查询,所以速度比较快,Linux每天会更新该数据库)
5 }- v: ^ k% c; u) S
s ^/ {9 Z, a( B$ j( ] h) T' S" |locate:6 ?3 N8 o& C: I, E. p& O
locate [filename]
8 }! O/ Q* \$ }* i* e+ G该命令用于把相关字的文件和目录都列出来。查找数据特别快,也是通过数据库方式来查询。但是数据库一周更新一次,所以可能有些存在数据查不到。可以去修改配置文件。6 n. P" w+ k9 S& n W) T
& l: G! L, V* y' _/ [find:
# [: E2 W# D0 J) Zfind [path] [参数] [keyword]- p+ X% F' n$ x, S
该命令用于在指定路径下查找文件。不是通过数据来查询,所以速度会比较慢。 4 X- Q2 M- c0 k' X
" W/ Y( s) v2 e+ m3 L
7.常见目录解释
# C2 @0 J: `5 o. |0 r: t
6 l* D) [' Y: w$ y" \- ?" JLinux各种发行版的目录结构基本一致,各个目录简单介绍如下:. }. S6 M3 [6 l+ o- F- y
( f! r- V3 A" A) ^ 6 c$ Z7 s# ?, y7 m# t
目录 | 描述 | / | 根目录 | /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 | 该目录存放一些服务启动之后需要提取的数据 |
0 v) |& _/ H4 ]3 Y% g5 N( p4 H8 W$ W& A' s' b& l7 S, H4 B: T
* I3 E) l8 x, T" C
; |8 ^0 C$ j2 K& r: Z
' H" `" A9 j- j0 J- _
. M' r% ] Y6 ?2 Y
$ i0 M& D l9 ^! i; k1 U3 L$ l6 P: i, o! j/ Q
|
|