Linux文件系统
简介
在Linux中一切被操作系统管理的资源,比如网络接口,磁盘驱动,打印机,输入输出设备,普通文件等,都被视为文件,Linux中的一个重要概念就是“一切都是文件”。
inode(索引节点)
inode是Linux/Unix文件系统的基础,它记录的并非是文件的具体数据,它记录的是文件的属性信息,它具备如下特性:
- inode是一种固定大小的数据结构,其大小在文件系统创建时已确定,并且在生命周期内保持不变
- inode访问速度非常快,因为系统可以直接通过inode号码定位到文件的元数据信息,不需要遍历文件系统
- inode的数量是有限的,每个文件系统只能包含固定的inode,这意味着文件系统inode用完后,即使磁盘仍有空间也无法再创建新的文件或者目录
inode与block的区别
block也就是块,硬盘的最小存储单位是扇区,而block是由多个扇区组成的,常见大小为4kb,约8个扇区组成。简而言之我们的文件数据时存储在block中的,它是硬盘的一部分存储空间。
inode则是一个存储文件元信息的空间,比如:某个文件被分成几块,每一块的地址,文件拥有者,创建时间,权限,大小等元信息。
硬链接与软链接
文件链接是一种特殊的文件类型,可以在文件系统中指向另外一个文件,常见的有两种:硬链接和软链接
硬链接
- Linux/Unix系统中,每个文件或者目录都有一个唯一的索引节点inode号,用来标识该文件或目录,硬链接就是通过inode号建立一个链接,硬链接与源文件共享同一个inode号。源文件和硬链接在文件系统中是平等的,删除其中一个对另外一个没有影响,所以为了防止重要文件被误删可以为其建立硬链接
- 只有删除源文件以及所有硬链接之后,该文件才会被真正的删除,inode中有一个变量count,进行引用计数,在引用等于0时才表示完全删除
- 硬链接具有一些限制,不能对目录以及不存在的文件创建硬链接,并且硬链接也不能直接跨越文件系统
# 没有-s选项即是建立硬链接
ln 要链接的文件 链接名
软链接
- 软链接和源文件的inode节点号不同,而是指向一个文件路径,类似于window的快捷方式
- 源文件被删除后,软链接依然存在,只不过指向的是无效的文件路径
- 不同于硬链接,可以对目录或者不存在的文件建立软链接,并且软链接可以跨越文件系统
- 通过
ln -s命令用于创建软链接
示例:
# 建立软链接
ln -s 要链接的文件 链接名
# unlink链接文件名,也可以使用rm删除但建议最好是使用unlink解除链接
unlink 链接名
注意:在rm删除被链接的文件后,重新创建一个同名文件可以使链接恢复;
软链接与inode无关,只与文件的文件名有关,绑定的是该路径下的文件名
Linux目录树
常见目录说明:
- /bin: 存放二进制可执行文件(ls、cat、mkdir 等),常用命令一般都在这里;
- /etc: 存放系统管理和配置文件;
- /home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户 user 的主目录就是/home/user,可以用~user 表示;
- /usr : 用于存放系统应用程序;
- /opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把 tomcat 等都安装到这里;
- /proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
- /root: 超级用户(系统管理员)的主目录(特权阶级^o^);
- /sbin: 存放二进制可执行文件,只有 root 才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如 ifconfig 等;
- /dev: 用于存放设备文件;
- /mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
- /boot: 存放用于系统引导时使用的各种文件;
- /lib 和/lib64 : 存放着和系统运行相关的库文件 ;
- /tmp: 用于存放各种临时文件,是公用的临时文件存储点;
- /var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;
- /lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows 下叫什么.chk)就在这里。
文件描述符
在Linux中,文件描述符是内核为了高效的管理已经被打开的文件所创建的索引 ,它是一个非负整数,用于指代被打开的文件,所有执行I/O操作的系统调用都是通过文件描述符完成的。其有以下特点:
- 每当一个进程打开一个文件、创建一个套接字或进行其他类似的操作时,内核都会为该进程分配一个新的文件描述符。
- 文件描述符是进程级的,不同的进程可以有各自的文件描述符表,互不影响。
在Linux中,进程是通过文件描述符 (file descriptors 简称fd)来访问文件的,文件描述符实际上是一个整数。 在程序刚启动的时候,默认有三个文件描述符,分别是:0 (代表标准输入),1 (代表标准输出),2 (代表标准错误)。 我们可以通过open函数得到一个指定文件的文件描述符,如果出现错误则返回-1
open函数如下所示:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
flag参数如下所示:
- O_RDONLY: 只读模式
- O_WRONLY: 只写模式
- O_RDWR : 读写模式
- O_NONBLOCK: 非阻塞模式
- O_APPEND: 追加模式
- O_CREAT: 创建并打开一个新文件
- O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
- O_EXCL: 如果指定的文件存在,返回错误
open文件流程
- 当我们打开一个文件时,操作系统会为该进程分配一个文件描述符(file descriptor),并将其存储在该进程的文件描述符表(file descriptor table)中。
- 操作系统会在打开文件表(open file table)中创建一个新的条目,并将该条目与该文件描述符相关联。
- 此外,操作系统还会在目录项(directory entry)和索引表(inode table)中查找该文件,并将其加载到内存中。
- 最后,操作系统会返回该文件描述符给应用程序,以便应用程序可以使用该文件描述符来访问该文件。
32位系统通常只有1024个,64位系统只有2048个,可以通过修改file_size然后重新编译内核去修改,但一般来讲不建议如此操作。
常用命令
目录切换
- cd usr:切换到该目录下 usr 目录
- cd ..(或cd../):切换到上一层目录
- cd /:切换到系统根目录
- cd ~:切换到用户主目录
- cd -: 切换到上一个操作所在目录
目录操作
- ls
显示目录中的文件和子目录的列表。例如:ls /home,显示 /home 目录下的文件和子目录列表。
- ll
ll 是 ls -l 的别名,ll 命令可以看到该目录下的所有目录和文件的详细信息
- mkdir [选项] 目录名
创建新目录(增)。例如:mkdir -m 755 my_directory,创建一个名为 my_directory 的新目录,并将其权限设置为 755,即所有用户对该目录有读、写和执行的权限。
- find [路径] [表达式]
在指定目录及其子目录中搜索文件或目录(查),非常强大灵活。例如:① 列出当前目录及子目录下所有文件和文件夹: find .;② 在/home目录下查找以 .txt 结尾的文件名:find /home -name "*.txt" ,忽略大小写: find /home -i name "*.txt" ;③ 当前目录及子目录下查找所有以 .txt 和 .pdf 结尾的文件:find . ( -name "*.txt" -o -name "*.pdf" )或find . -name "*.txt" -o -name "*.pdf"。
- pwd
显示当前工作目录的路径。
- rmdir [选项] 目录名
删除空目录(删)。例如:rmdir -p my_directory,删除名为 my_directory 的空目录,并且会递归删除my_directory的空父目录,直到遇到非空目录或根目录。
- rm [选项] 文件或目录名
删除文件/目录(删)。例如:rm -r my_directory,删除名为 my_directory 的目录,-r(recursive,递归) 表示会递归删除指定目录及其所有子目录和文件。
- cp [选项] 源文件/目录 目标文件/目录
复制文件或目录(移)。例如:cp file.txt /home/file.txt,将 file.txt 文件复制到 /home 目录下,并重命名为 file.txt。cp -r source destination,将 source 目录及其下的所有子目录和文件复制到 destination 目录下,并保留源文件的属性和目录结构。
- mv [选项] 源文件/目录 目标文件/目录
移动文件或目录(移),也可以用于重命名文件或目录。例如:mv file.txt /home/file.txt,将 file.txt 文件移动到 /home 目录下,并重命名为 file.txt。mv 与 cp 的结果不同,mv 好像文件“搬家”,文件个数并未增加。而 cp 对文件进行复制,文件个数增加了。
文件权限
Linux的文件权限一般分为读,写,执行,权限对应用户又分为属主用户权限,属组权限和其他用户权限,如下图所示:
Linux 中权限分为以下几种:
- r:代表权限是可读,r 也可以用数字 4 表示
- w:代表权限是可写,w 也可以用数字 2 表示
- x:代表权限是可执行,x 也可以用数字 1 表示
修改权限命令为 chmod,如下示例:
# 修改成读写执行权限,属组权限为读写
chmod u=rwx,g=rw,o=r aaa.txt
chmod 764 aaa.txt
文件操作
- touch [选项] 文件名..
创建新文件或更新已存在文件(增)。例如:touch file1.txt file2.txt file3.txt ,创建 3 个文件。
- ln [选项] <源文件> <硬链接/软链接文件>
创建硬链接/软链接。例如:ln -s file.txt file_link,创建名为 file_link 的软链接,指向 file.txt 文件。-s 选项代表的就是创建软链接,s 即 symbolic(软链接又名符号链接) 。
- cat/more/less/tail 文件名
文件的查看(查) 。命令 tail -f 文件 可以对某个文件进行动态监控,例如 Tomcat 的日志文件, 会随着程序的运行,日志会变化,可以使用 tail -f catalina-2016-11-11.log 监控 文 件的变化 。
- vim 文件名
修改文件的内容(改)。vim 编辑器是 Linux 中的强大组件,是 vi 编辑器的加强版,vim 编辑器的命令和快捷方式有很多,但此处不一一阐述,大家也无需研究的很透彻,使用 vim 编辑修改文件的方式基本会使用就可以了。在实际开发中,使用 vim 编辑器主要作用就是修改配置文件,下面是一般步骤:vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输入:wq/q! (输入 wq 代表写入内容并退出,即保存;输入 q!代表强制退出不保存)。
文件压缩
打包并压缩文件
命令tar -zcvf 压缩后文件名 要打包的文件,其中
- z:表示用gzip压缩
- c:打包文件
- v:显示运行过程
- f:指定文件名
示例:
## 将/test目录下文件解压且打包成文件test.tar.gz
tar -zcvf test.tar.gz aaa.txt bbb.txt ccc.txt
tar -zcvf test.tar.gz /test/
解压文件
命令tar -xvf 压缩文件,其中x就表示解压
示例:
tar -xvf test.tar.gz // 将/test目录下的test.tar.gz解压到当前目录下
Kill命令
杀死一个进程可以使用kill命令
示例:
[kino@hadoop102 bin]$ kill -1 19773
kill存在很多选项,如下所示:
| 信号编号 | 信号名 | 含义 |
|---|---|---|
| 0 | EXIT | 程序退出时收到该信息。 |
| 1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2 | INT | 表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号。 |
| 3 | QUIT | 退出。 |
| 9 | KILL | 杀死进程,即强制结束进程。 |
| 11 | SEGV | 段错误。 |
| 15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
系统状态
- top[选项]
用于实时查看系统的 CPU 使用率、内存使用率、进程信息等
- htop [选项]
类似于 top,但提供了更加交互式和友好的界面,可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。
- uptime [选项]
用于查看系统总共运行了多长时间、系统的平均负载等信息。
- vmstat [间隔时间] [重复次数]
vmstat (Virtual Memory Statistics) 的含义为显示虚拟内存状态,但是它可以报告关于进程、内存、I/O 等系统整体运行状态。
- free [选项]
用于查看系统的内存使用情况,包括已用内存、可用内存、缓冲区和缓存等。
- df [选项] [文件系统]
用于查看系统的磁盘空间使用情况,包括磁盘空间的总量、已使用量和可用量等,可以指定文件系统上。例如:df -a,查看全部文件系统。
- du [选项] [文件]
用于查看指定目录或文件的磁盘空间使用情况,可以指定不同的选项来控制输出格式和单位。
- sar [选项] [时间间隔] [重复次数]
用于收集、报告和分析系统的性能统计信息,包括系统的 CPU 使用、内存使用、磁盘 I/O、网络活动等详细信息。它的特点是可以连续对系统取样,获得大量的取样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。
- ps [选项]
用于查看系统中的进程信息,包括进程的 ID、状态、资源使用情况等。ps -ef/ps -aux:这两个命令都是查看当前系统正在运行进程,两者的区别是展示格式不同。如果想要查看特定的进程可以使用这样的格式:ps aux|grep redis (查看包括 redis 字符串的进程),也可使用 pgrep redis -a。
- systemctl [命令] [服务名称]
用于管理系统的服务和单元,可以查看系统服务的状态、启动、停止、重启等。
top详解
top的使用方式 top [-d number] | top [-bnp]
-d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。
-b:以批次的方式执行top。
-n:与-b配合使用,表示需要进行几次top命令的输出结果。
-p:指定特定的pid进程号进行观察。
在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的):
- ?:显示在top当中可以输入的命令
- P:以CPU的使用资源排序显示
- M:以内存的使用资源排序显示
- N:以pid排序显示
- T:由进程使用的时间累计排序显示
- k:给某一个pid一个信号。可以用来杀死进程
- r:给某个pid重新定制一个nice值(即优先级)
- q:退出top(用ctrl+c也可以退出top)
执行top 命令后如下所示,分为前5行统计信息和进程信息
进程信息
网络通信
- ping [选项] 目标主机
测试与目标主机的网络连接。
- ifconfig 或 ip
用于查看系统的网络接口信息,包括网络接口的 IP 地址、MAC 地址、状态等。
- netstat [选项]
用于查看系统的网络连接状态和网络统计信息,可以查看当前的网络连接情况、监听端口、网络协议等。
- ss [选项]
比 netstat 更好用,提供了更快速、更详细的网络连接信息。
Linux环境变量
按照作用域来分,环境变量可以简单的分成:
- 用户级别环境变量 :
/.bashrc、/.bash_profile。 - 系统级别环境变量 : /etc/bashrc、/etc/environment、/etc/profile、/etc/profile.d。
建议用户级别环境变量在 ~/.bash_profile中配置,系统级别环境变量在 /etc/profile.d 中配置。
按照生命周期来分,环境变量可以简单的分成:
- 永久的:需要用户修改相关的配置文件,变量永久生效。
- 临时的:用户利用 export 命令,在当前终端下声明环境变量,关闭 shell 终端失效。
读取环境变量
通过 export 命令可以输出当前系统定义的所有环境变量。
# 列出当前的环境变量值
export -p
除了 export 命令之外, env 命令也可以列出所有环境变量。
echo 命令可以输出指定环境变量的值。
# 输出当前的PATH环境变量的值
echo $PATH
# 输出当前的HOME环境变量的值
echo $HOME
环境变量修改
通过 export命令可以修改指定的环境变量。不过,这种方式修改环境变量仅仅对当前 shell 终端生效,关闭 shell 终端就会失效。修改完成之后,立即生效。
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
通过 vim 命令修改环境变量配置文件。这种方式修改环境变量永久有效。
vim ~/.bash_profile
如果修改的是系统级别环境变量则对所有用户生效,如果修改的是用户级别环境变量则仅对当前用户生效。
修改完成之后,需要 source 命令让其生效或者关闭 shell 终端重新登录。
source /etc/profile