title: Linux文件系统
date: 2018-12-15 11:14:54
tags:
- 基础
categories:
- Linux
💠
💠 2024-06-18 15:17:36
对于一次Network IO (这里我们以read举例),它会涉及到两个系统对象:
当一次 read 操作发生时,它会经历两个阶段:
等待数据准备
(Waiting for the data to be ready)将数据从内核缓存中拷贝到用户缓存(用户进程)中
(Copying the data from the kernel to the process)记住这两点很重要,因为这些 IO Model 的区别就是在两个阶段上各有不同的情况。对于常见的网络通信场景:网卡复制到内核空间再复制到用户空间
同步和异步的概念描述的是用户线程与内核的交互方式
阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式
用户态IO mmap + write sendfile sendfile + DMA gather copy splice 写时复制 缓冲区共享
拷贝方式 | CPU拷贝 | DMA拷贝 | 系统调用 | 上下文切换 |
---|---|---|---|---|
传统方式(read + write) | 2 | 2 | read / write | 4 |
内存映射(mmap + write) | 1 | 2 | mmap / write | 4 |
sendfile | 1 | 2 | sendfile | 2 |
sendfile + DMA gather copy | 0 | 2 | sendfile | 2 |
splice | 0 | 2 | splice | 2 |
Linux中认为万物皆文件
cd -
跳转到上一个目录cd !$
把上个命令的参数作为cd参数使用。用文件头标识判断文件类型
而不是Windows那样默认以文件后缀来判断
silversearcher-ag
快速搜索文件的内容
find . -name "*.txt"
查找当前目录的txt后缀的文件
sudo find / -name a.java
全盘查找
find -type f -name README.md
默认当前目录查找
exec 嵌入一个命令
find . -name "*.pdf" -exec mv {} /home/test \;
find . -type f -exec mv {} /opt/shell \;
find . -type f | xargs -I '{}' mv {} /opt/shell
find . -name "*.zip" -exec unzip {} \;
实践
find . -name "*.run" | xargs rm -f
find -name "*.log" | xargs grep ERROR
find etc/ |xargs grep -i java
fzf
locate
预先建立数据库,依此查询 速度较快,但是有时效问题
Anything
图形化 搜索文件 工具,也是预先建立数据库
Synapse
搜索文件 启动应用等功能
stat filename
参数
i
详情a
全部包含隐藏文件 <> A
不显示当前目录和上级目录 .
..
l
使用较长格式列出信息 详细信息h
人类可阅读F
标明文件夹,文件,可执行文件w
100 限制输出每行的字符长度 0 则是无限制 和 l 共用就则无视该限制R
递归显示所有子文件夹r
逆序B
不列出以〜结尾的隐含条目t
按修改时间从顶至下,一般不单用,和 g|l 结合一起用c
按ctime(创建时间)一般是文件夹,文件则是修改时间排列
ls -clt
同上的排列顺序S
按文件大小逆序展示执行ls -l 命令后的输出
拥有者,所属用户组 其他用户
代表的rwx权限chmod 700 文件
就是只设置拥有者具有读写权限chmod go-rw 文件
g group
o others
u user
+- 增减权限
ls -lFh
列出所有文件的详细信息, 并且文件大小是人类可阅读的
改进版
wc [-lmw]
参数说明: -l :多少行-m:多少字符 -w:多少字带行号输出 cat -n file
或者 nl file
但是空行不会编号, 除非这样: nl -b a file
改进版
该命令的导航是和Vi体系一样的, 建议打开大文件使用less或者more 如果用vim,文件全加载到内存了
诸多软件使用到了分页, 怀疑就是借助less实现的, 因为快捷键一模一样, 例如 man命令, 各个软件的-h, git的log 等等..优点很多
h 查看帮助文档 z/b 上下翻页 g/G 文件首/尾
F 监听文件
当打开多个文件时 :n
和:p
表示 next pre 也就是 下一个,上一个文件
# sh 在不同的系统 路径和名字都有可能不一样
export LESSOPEN="| /usr/bin/source-highlight-esc.sh %s"
export LESS=' -R'
tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。 来自: http://man.linuxde.net/tail
--retry
:即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。此选项需要与选项“——follow=name”连用;
-c或——bytes=
:输出文件尾部的N(N为整数)个字节内容;
-f或;--follow
:显示文件最新追加的内容。“name”表示以文件名的方式监视文件的变化。“-f”与“-fdescriptor”等效;
-F
:与选项“-follow=name”和“--retry"连用时功能相同;
-n或——line=
:输出文件的尾部N(N位数字)行内容。
--pid=<进程号>
:与“-f”选项连用,当指定的进程号的进程终止后,自动退出tail命令;
-q或——quiet或——silent
:当有多个文件参数时,不输出各个文件名;
-s<秒数>或——sleep-interal=<秒数>
:与“-f”选项连用,指定监视文件变化时间隔的秒数;
-v或——verbose
:当有多个文件参数时,总是输出各个文件名;
tail file (显示文件file的最后10行)
tail +20 file (显示文件file的内容,从第20行至文件末尾)
tail -c 10 file (显示文件file的最后10个字符)
查看二进制执行文件依赖的动态库
diff a b
输出的 < 表示a转为b文件时要删除的行 > 表示要增加的行
可用于 git svn 查看差异
选两个或三个文件去查看差异,完成patch补入
kdiff3 vimdiff
rename命令的使用(基于perl)
rename "s/.html/.php/" *
//把.html 后缀的改成 .php后缀rename "s/$/.txt/" *
//把所有的文件名都以txt结尾rename "s/.txt//" *
//把所有以.txt结尾的文件名的.txt删掉rename "s/AA/aa/" *
//把文件名中的AA替换成aarename "s/ - 副本/_bak/" *
将文件-副本
结尾改成_bak
结尾chown [-R] 账号名称 文件或目录
chown [-R] 账号名称:用户组名称 文件或目录
chgrp group file
ln path path
默认创建硬链接ln -s 源文件或目录 目标绝对路径
生成软链接(快捷方式)硬链接: 只能链接文件,原始路径下文件删除后,能通过硬链接访问到原文件 即文件没有真正删除,只是引用数减一
软链接: 相当于快捷方式,原始文件或目录删除后,软链接也会失效
cp -ri 目录或正则 目录
目录所有文件复制过去
rm -rf 目录
不提示性删除
特别注意 rm -rf link 文件时, 如果只是想删除link文件 那么就不要在link文件后加上 / 例如:
rm -rf linkDir/
这个命令是将 link到的目录下的文件全部删除而不是 删除link文件本身
mv 目录或正则 目录
移动
分割
split -l 300 log.txt newfile
split -b 500m log.txt newfile
合并
cat file1 file2 > result
原理是通过监听文件变更时发出的 signal
借助 inotify-tool 包更容易使用
持续监听某目录变更 inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib /home/kcp/test/git-test
查看当前编码 locale 或者 echo $LANG
/etc/profile
LC_ALL="zh_CN.UTF-8"
export LANG="zh_CN.UTF-8"
虚拟内存文件系统 wiki
手动创建挂载tmp文件系统: mount -t tmpfs -o size=100m tmpfs /mnt/tmp
安装系统时,如果没有将/tmp指定独立的分区,将会在/分区下建立 tmp 目录,此时会有一个隐患 当系统段时间大量创建tmp文件时可能导致 / 分区满掉,从而导致整个系统hang住。
例如Java中使用EasyExcel大量导出Excel时需要临时文件落盘避免内存占用过大的问题, 当并发大量文件导出时容易引起tmp目录占满。
systemd 方式来定期清理tmp Configuration of Temporary Files with systemd-tmpfiles
例如:解决上述Excel临时文件的问题,最好是随用随删,该机制可作为兜底策略
/etc/tmpfiles.d/excel-tmp.conf
d /tmp/dir_clean 0755 baeldung baeldung 10s
sudo systemd-tmpfiles --clean
将删除最后修改时间超过当前时间10s的文件 可以加入cron
check and repair a Linux filesystem
当系统突然断电而导致文件系统不一致时, 可使用该命令进行修复, 例如:fsck.ext4 -vy /dev/sdaXX
sudo mkfs.ext4 virtual.img
ls -l /lib/modules/$(uname -r)/kernel/fs
格式化分区
mkfs -t ext4 /dev/sdc1
dd if=/dev/zero of=/testfile bs=1024k count=4096
dd if=/dev/zero bs=1M count=1024 | md5sum
创建一个 5G 全0文件 truncate -s 5G test.file
mount [options] [source] [directory]
mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
查看已挂载信息 mount
挂载这个镜像到 /mnt :mount -o loop -t ext4 virtual.img /mnt
只读方式挂载 mount -o loop --ro virtual.img /mnt
卸载挂载的磁盘 sudo umount /mnt
设置自动挂载某分区 (root身份运行命令)
blkid
查看设备详情, 找到要挂载的硬盘的 UUID 以及 文件系统类型vim /etc/fstab
在文件中添加, 记得要 先创建该目录 /media/kcp/Data1
UUID=42168DE83BC5EDAD /media/kcp/Data1 ntfs defaults 0 1
类似配置mount -a
切记要先用该命令测试下该文件是否正确, 如果有错误, 系统关机后就开不了机了(但是可以使用U盘进系统 修改该文件)一个分区挂载到多个目录
sudo fdisk -l
报告文件系统磁盘空间使用情况
改进版
du -sh 目录
查看磁盘占用总大小 h 自动搭配单位(human read )
du --max-depth
一级子目录使用情况
du -sm * | sort -n
统计当前目录大小 并按大小(mib)排序 -sk
则是换算成kib
du -m | cut -d "/" -f 2
看第二个/
字符前的文字
案例: 获取当前目录最大的6个目录或文件 du -hsx * | sort -rfh | head -6
改进版
基本都在
/var/log
下
通常使用 journalctl 查询 Systemd 的日志
查看日志
journalctl -xe
journalctl -u systemd-modules-load.service
-r
滚动到最后的日志-b -1
查看相对启动次日志 0标识当前--since "2015-01-10"
--until "2015-01-11 03:00"
清理日志
journalctl --vacuum-time=1w
只保留1周日志
[global]
workgroup = WORKGROUP
#所要加入的工作组或者域
netbios name = Manjaro
#用于在 Windows 网上邻居上显示的主机名
security = user
#定义安全级别
map to guest = bad user
#将所有samba系统主机所不能正确识别的用户都映射成guest用户
dns proxy = no
#是否开启dns代理服务
[share]
#共享显示的目录名 注意每级目录samba用户都要有权限 最简单就放最高层级的目录上
path = /share
#实际共享路径
browsable = yes
#共享的目录是否让所有人可见
writable = yes
#是否可写
guest ok = yes
#是否允许匿名(guest)访问,等同于public
create mask = 0777
#客户端上传文件的默认权限
directory mask = 0777
#客户端创建目录的默认权限
#注意共享文件在系统本地的权限不能低于以上设置的共享权限。
true > a.txt
sudo apt install lrzsz
cat ~/.ssh/id_rsa.pub | xsel -b
将文件复制到剪贴板注意加载顺序 /etc/profile -> ~/.*shrc
各种sh的rc文件
bash zsh ash
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
~/.bashrc
添加这段,然后在 .bash_aliases
文件中设置别名
alias Kg.notes='cd ~/Documents/Notes/Code_Notes/'
source ~/.bashrc
不执行命令就重启终端即可注意_ 你会发现 当前用户 下 Kg.notes 是正常运行的, 但是 sudo Kg.note 就会报错说找不到命令
神奇的是 配置一个别名alias sudo='sudo '
就可以解决这个问题了 stackoverflow 官方说明如下_
The first word of each simple command, if unquoted, is checked to see if it has an alias. If so, that word is replaced by the text of the alias.
The characters ‘/’, ‘$’, ‘`’, ‘=’ and any of the shell metacharacters or quoting characters listed above may not appear in an alias name.
The replacement text may contain any valid shell input, including shell metacharacters. The first word of the replacement text is tested for aliases,
but a word that is identical to an alias being expanded is not expanded a second time. This means that one may alias ls to "ls -F", for instance,
and Bash does not try to recursively expand the replacement text. If the last character of the alias value is a space or tab character,
then the next command word following the alias is also checked for alias expansion.
将配置文件分类放
ln -s
pwd/.bash_aliases ~/.bash_aliases
[Desktop Entry] #每个desktop文件都以这个标签开始,说明这是一个Desktop Entry文件
Version = 1.0 #标明Desktop Entry的版本(可选)
Name = Firefox #程序名称(必须),这里以创建一个Firefox的快捷方式为例
GenericName = Web Browser #程序通用名称(可选)
Comment = A Web Browser #程序描述(可选)
Exec = firefox %u #程序的启动命令(必选),可以带参数运行,当下面的Type为Application,此项有效
Icon = firefox #设置快捷方式的图标 svg(更好) png
Terminal = false #是否在终端中运行(可选),当Type为Application,此项有效
Type = Application #desktop的类型(必选),常见值有“Application”和“Link”
Categories = GNOME;Application;Network; #注明在菜单栏中显示的类别(可选)
/usr/share/applications/
目录下即可
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。