文件系统
磁盘由许多盘片和一组磁头组成,盘片被划分出同心圆磁道,多个盘片的同磁道构成柱面,磁道上每512字节划分为扇区,数据存储在扇区上。
文件系统格式
FIle System Hierarchy:linux文件系统
目录 | 说明 |
---|---|
/ | 根目录 |
/boot | 启动相关文件 |
/bin | 二进制命令 |
/sbin | 系统二进制命令 |
/etc | 系统配置 |
/lib | 共享库、内核模块 |
/usr | 用户数据 |
/usr/local | 第三方软件 |
/usr/bin | 用户的命令 |
/usr/sbin | 用户的命令 |
/root | root用户家目录 |
/home | 普通用户家目录 |
/opt | 第三方软件和配置 |
/tmp | 临时文件 |
/var | 可变文件 |
/var/run | 运行时文件 |
/var/log | 日志 |
/dev | 设备目录 |
/mnt | 文件系统挂载点 |
/media | 可移动设备挂载点 |
在windows下,需要把分区映射称为逻辑驱动器(就是盘符),每个盘符都有自己的根。win系统可以使用\表示根,路径分隔符默认是\。但windows也可以识别/。
Linux必须把所有分区挂载mount到文件系统的根目录上,其实就是分区和目录建立映射。
软件安装
早期,软件分发都是源代码,需要使用者针对不同平台自行在当前操作系统上编译。
但是编译不是一件容易的事,能不能提供直接编译好的可执行文件呢?这就是二进制分发版。这种二进制分发版,往往只需解压后,稍作配置就可使用。但需要下载针对当前平台的分发版。
后来软件越来越多,越来越大,红帽推出了RPM,即RedHat Package Manager,目前已经成为Linux工业标准。它提供打包,安装,查询,升级,卸载、数据库管理等功能。但它没有解决软件依赖问题,很可能出现软件安装时报错。
rpm -ivh xxx.rpm
rpm -ql xxx
-i 安装
-v 详情
-h #显示进度
-q 查询包是否安装
-ql 列出安装的包的文件列表
-qa 列出已经安装的包
YUM
YUM(Yellow Dog UPdater, Modified),在RPM包管理之上增强的包管理器,能自动查询下载包 ,并自动处理依赖关系。YUM使用Python2.x编写。YUM必须配置源,要从源服务器下载包。
配置
主配置文件/etc/yum.conf
自定义配置文件必须扩展名为repo,并放在/etc/yum.repos.d目录下
连接阿里云镜像,使用网络的yum源。
centos 7源
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
epel源
# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# yum repolist
# yum install -y vim
命令
-
内部命令:随shell启动,常驻内存
-
外部命令:需要找到文件加载进程,查找路径就是$PATH
- hash,外部命令路径可以保存在一个hash表中
-
# type cd cd is a shell builtion # type cat cat is hashed(/usr/bin/cat) # type vim vim is /usr/bin/vim # type -t cd builtin # type -t vim file # type -t cat file
命令格式
命令本身可以接受选项和参数,而选项可以有自己的参数
- 短选项:-h 使用-加一个字母,短选项可以合并,但是短选项需要提供参数,必须放后面。短选项往往都是最常用的选项,为了简化而提供
- 长选项:–all 使用–加单词,长选项不可以合并写
- Ctrl + c 可以结束正在运行的命令
- \命令续行符
- ;一行多个命令使用分号分隔
- 使用tab键补全,tab 2次可以提示补全的候选
命令扩展
bash具有的功能
$ echo a/b/x a/c/x a/d/e/x 可以写成 $ echo a/{b,c,d/e}/x
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo {a..z..2}
a c e g i k m o q s u w y
$ echo {1..20..2}
1 3 5 7 9 11 13 15 17 19
$ echo {a,b}{1,2}
a1 a2 b1 b2
常用命令
-
查帮助
- help 内部命令
- man 查看Man文档
- 命令-h 或 命令–help
-
命令
-
type 命令类型
-
hostname 主机名
-
who 登录信息,who am i 或 whoami,w
-
whatis 命令有什么功能
-
which 命令在哪里
-
whereis 命令进程二进制文件、man文档
-
uname -a 查看操作系统信息,比如内核版本-r
-
alias 别名
-
echo 回显
- -n 取消自动符加最后的换行符
- -e 使用解释功能,$ echo -e 'a/tb/nc’使用转义符
-
date日期
-
date + ‘%Y%m%d %H:%M:%S’
-
date [MMDDhhmm[[CC]YY][.ss]]修改时间
-
-
-
开关机
- halt,poweroff
- reboot重启
- shutdown[option]…TIME
- -r 重启
- -h 关机
- TIME:now立即关机;+3 几分钟后执行;hh:mm几点几分开始执行
- -c 未执行前,还可以取消
-
网络
- ping -c 20 -w 5 www.baidu.com
- ip a
- ss -tanlp
绝对路径和相对路径
-
相对路径,不以/开始的路径
-
绝对路径,以/开始的路径
-
因为常常当前工作路径会变化,有时候从当前路径为参照,找其他路径中的文件会出错,往往就从根开始写绝对路径,减少路径错误
-
相对路径用在相对于当前路径的某个文件,相对关系不变的情况
-
basename基名和dirname目录名
-
# dirname /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts # basename /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33
文件类型
- -或f 普通文件
- d 目录directory
- l 符号链接或软链接symbolic link,相当于快捷方式
- b 块设备block device,随机访问,磁盘
- c 字符设备character device,线性访问,键盘
- p 管道 pipe
- s socket文件1
权限
属主:文件的拥有者
属组:文件的分组,组内用户对该文件由一定的权限
如果有该权限,则显示对应字母;如果没有该权限,则显示-。注意,root用户不受权限限制。
rwx是3个字符,如果看作二进制就是3位,每一位都可以用0或1表示,由此可以用一个8进制数表示。例如rw-rw----用8进制表示就是660
通配符wildcard
-
*匹配0个或多个字符
-
?匹配一个字符
-
[a-z]、[A-Z]、[0-9]、[acdf]匹配一个字符;[^a-z]匹配a-z之外的任意一个字符
-
[:space]空白字符;[digit:]表示0-9;[:lower:]小写;[:upper:]大写;[:alpha:]字母;[:alnum:]字母和数字等。
- 当一个字符用,所以test[[:alnum:]]
文件系统命令
-
ls 列出目录内容
- -a 显示所有文件,包括隐藏文件,即以.开头的文件
- -l 长格式显示。别名ll即ls -l。显示了stat的部分内容
- -h,–human-readable 配合-l,人可以阅读的,size显示为K,M,G等
- -R 递归目录
- -i 显示inode号
-
stat 显示文件的信息(元数据metadata)
- access time,atime,读取文件内容则设置
- modify time,mtime,改变文件自身内容则设置。ls -l 显示的时间就是mtime
- change time,ctime,元数据发生变化则设置
-
cd 切换目录change directory
- cd 或cd ~ 回家
- cd - 最后两次目录切换
-
pwd 显示当前工作路径;basename基名,路径中最后一部分;dirname目录名
-
file 显示文件格式
-
cat 读取文件或stdin到stdout;tac每个文件倒着读取行
-
more,less比more功能更强
- 回车向后一行,y向前一行
- 空格向后一页,b向前一页
- d向后半页,u向前半页
- g首行,G末行
- u向前
- /或?搜索
- q退出
-
head -n 20 /etc/passwd
-
tail -n10 /etc/passwd;tail -f /var/log/messages
-
touch 没有文件创建空文件,如果文件存在,改变时间戳
- -a 改变atime、ctime
- -m 改变mtime、ctime
- -c 如果文件不存在,则不创建
-
mkdir 创建目录
- -p 创建父目录
- -v 详情
-
tree 递归显示目录树(需安装tree命令)
- -d 只显示目录
- -L n 显示的 最大层数
-
rmdir 删除空目录
-
rm 慎用!!!
- -i 交互式提醒;-f强制不提醒
- -r 递归删除
- rm -rf / (cent os7 不可以删根,但可以递归删根下的目录)
-
ln 创建链接文件
- -s 创建符号链接
- -v 详情
-
cp 复制目录或文件,从源复制到目标。默认不递归
- 如果源是文件
- 目标是文件,目标不存在,直接创建指定名称文件。如果目标存在,覆盖
- 目标是路径,复制到指定的路径下,不存在新建,存在则覆盖
- 如果源是目录
- 目标是文件,不可以
- 目标是目录
- 如果目标目录存在,就在该目标目录下复制源目录内容
- 如果不存在,创建目标目录,复制源的内容
- 如果有多个源,目标只能是目录了,且目标必须存在
- -i 交互式提醒,-f 强制覆盖不提示
- -R -r 递归复制
- –perserv 保留指定的元数据信息,all保留所有即包含权限、属主、属组等
- -d 表示–no-dereference --preserv=links 不复制源文件,只复制链接名
- -a 归档,相当于-dR --preserv-all,递归复制所有文件包括软连接,但不跟踪软连接
- 如果源是文件
-
mv 移动或重命名
- 和cp很像
-
find [指定目录][指定条件][指定动作] find /-name *.py
inode
格式化后的文件系统中留有区域存放元数据,这个区域称为inode table
每一个文件包括目录,都有一个唯一的inode号
目录也是文件,在目录文件本身的数据上存储着其下的文件名到inode的映射信息
block bitmap记录着那些block空闲或已使用
inode bitmap记录着哪些inode空闲空闲或已使用
inode不跨分区
查看inode使用 ls -l
硬链接:如果两个文件没有跨分区,且2个文件指向同一个inode,这就是硬链接,即文件的引用计数。ln test test1 来创建文件test1,硬链接数加1。如果硬链接数为0,则文件才被清除了。
文件描述符
一切皆文件,每一个打开的文件分配一个文件描述符(File Descriptor),非负整数。
文件描述符 | 名称 | 常用缩写 | 默认值 |
---|---|---|---|
0 | 标准输入 | stdin | 键盘 |
1 | 标准输出 | stdout | 屏幕 |
2 | 标准错误输出 | stderr | 屏幕 |
管道
使用|,上一个程序的标准输出通过管道送给下一个命令的标准输入。
重定向
重定向就是改变程序的输入或输出。
> 输出重定向
>> 追加输出重定向
< 输入重定向
<< Here Document
输出重定向和输出追加重定向
# echo abc > test
# cat test
abc
# echo 123 >> test
# cat test
abc
123
# echo xyz > /dev/null
# ls > $2
# ls -l > files 2 > $1
# id aabb
# id aabb > files
# cat files
# id aabb > files 2 > $1
# cat files
# id aabb 2 > $1 > files
# cat files
----------------------------
> files 2 > $1 表示1先指向文件,2指向1,也就指向该文件
2 > $1 files 表示2指向1即stdout,然后1重新指向一个文件
输入重定向
# ll | wc -l
# ll > files
# wc -l files
# wc -l < files
Here Document
# cat > newtxt << EOF
> line1
> line2
> EOF
# cat newtxt
用户权限系统
用户和组
*nix是多用户系统
- 用户
- 管理员
- root用户是必须有的管理员账户,特权用户,无所不能。慎用
- uid为0
- 家目录在/root
- 系统用户
- 普通授权用户,不用登陆,一般不需要家目录
- uid 1-499,Cent OS7 1-999
- 普通用户
- 普通授权用户,交互式登录,需要家目录在
/home/<username>
- uid 500+, Cent OS7 1000+
- 普通授权用户,交互式登录,需要家目录在
- 用户id为2字节无符号整数,0是root,其他用户使用1-65535
- 管理员
- 组
- 用户属于不同的组
- 管理员组
- 名为root,gid为0
- 系统组
- 系统组,gid为1-499,Cent OS7 1-999
- 普通组
- 普通组,gid为5000+,Cent OS 1000+
- 用户的组
- 主要组、基本组primary group
- 每一个用户都仅能属于一个组,这个组称为主组,创建用户时指定
- 附加组supplementary group
- 一个用户可以属于零个或多个附加组
- 主要组、基本组primary group
主要配置文件
- /etc/passwd 保存用户及id、主组id等属性信息
- 登录名:密码(shadow中):uid:gid主组:注释:家目录:shell
- /etc/shadow 保存用户密码及相关属性
- /etc/group 组及属性信息
- 组名:组密码(gshadow中):gid:以当前组为附加组的用户列表逗号分隔
用户和组命令
-
用户、组
-
id
- id 当前用户
- id xxx 指定用户信息
- -u 用户id;-g 主组;-G 附加组;-n 使用名字
-
useradd
- -r 创建系统用户,默认没有家目录
- -u UID 指定uid
- -g GID 指定主组,如果没有指定,则创建于用户名相同的同名主组
- -m 系统用户默认不创建家目录,使用该选项创建家目录
- -M 非系统用户默认创建家目录,使用该选项不创建
- -d 指定家目录
- -s 指定shell,查看/etc/shells
- -G g1[,g2,…] 指定用户的附加组,附加组必须存在
-
su 切换用户
- su -xxx 常用,登录式切换,读取该用户的配置文件,并切换到该用户的家目录
- su xxx 用的少,非登陆式切换,不读取用户配置文件,也不改变当前工作目录
su xxx -c "id"
常用,只是为了使用xxx用户启动一个程序,没必要登录
- 当前式root用户,su切换时,无序密码,其他用户切换需要密码
-
passwd
-
passwd 当前用户修改密码
-
# echo xxx | passwd xxx --stdin
为xxx用户设置密码 -
密码应该足够强,或有过期
-
-d 删除密码;-l 锁定用户;-u 解锁用户
-
-x maxdays 密码最大使用期限,超过宽限期后用户将不能自己修改密码
-
-w warndays 提前多少天警告密码要到期了;-i inactivedays 超期后修改密码的宽限期
-
usermod修改用户、userdel删除用户
groupadd增加组、groupmod修改组、groupdel删除组
-
进程的安全上下文
每一个进程启动起来,都有一个用户身份,这个身份决定着进程能访问什么资源
文件的元数据中定义了权限mode,三部分为属主,属组,其它
[外链图片转存失败(img-TDMmZG8P-1567914553577)(C:\Users\cxy01\AppData\Roaming\Typora\typora-user-images\1567860449551.png)]
当一个进程访问一个资源时,首先进行属主权限匹配,未匹配再进行属组、附加组权限匹配
如果都没匹配上,那么就是other其他用户,就匹配mode中的最后部分
文件权限含义
mode | 文件 | 目录 |
---|---|---|
r | 查看文件内容 | ls列目录内容 |
w | 修改文件内容 | 目录中增删文件 |
x | 执行该文件启动一个进程 | ls -l列目录内容,cd进入该目录 |
权限命令
-
chmod
- -R 目录递归设置,不推荐
- chmod [OPTION]… OCTAL-MODE FILE… 使用3位八进制数修改文件mode
- chmod [OPTION]… MODE[,MODE]… FILE…
- 修改某一组3位权限u、g、o、a
- u=、g=、o=、a=、ug=、uo=、go=
- 修改组内3位中的某一位
- u+、g+、o+、a+、+
- u-、g-、o-、a-、-
- 修改某一组3位权限u、g、o、a
-
umask
- 目录一般有x才能cd进入,文件一般不要随便给x权限
- 默认情况下,管理员umask是022,普通用户是022
- 文件666-022=644
- 目录为777-022=755
- umask 022修改掩码,非永久有效
# touch t.txt # ll t.txt -rw-r--r-- 1 root root 0 sep 7 07:18 t.txt # chmod 777 t.txt # ll t.txt -rwxrwxrwx 1 root root 0 sep 7 07:18 t.txt # chmod u=rw t.txt # ll t.txt -rw-rwxrwx 1 root root 0 sep 7 07:18 t.txt # chmod u=rw,g=r t.txt # ll t.txt -rw-r--r-- 1 root root 0 Sep 8 04:39 t.txt # chmod ug=rw t.txt # ll t.txt -rw-rw-r-- 1 root root 0 Sep 8 04:39 t.txt # chmod a=rw t.txt # ll t.txt -rw-rw-rw- 1 root root 0 Sep 8 04:39 t.txt # chmod u+x t.txt # ll t.txt -rwxrw-rw- 1 root root 0 Sep 8 04:39 t.txt # chmod ug+x t.txt # ll t.txt -rwxrwxrw- 1 root root 0 Sep 8 04:39 t.txt # chmod a-x t.txt # ll t.txt -rw-rw-rw- 1 root root 0 Sep 8 04:39 t.txt # chmod +x t.txt # ll t.txt -rwxrwxrwx 1 root root 0 Sep 8 04:39 t.txt 测试+x,-x,+w,-w,+r,-r
-
chown
- -R 目录递归修改
chown [OPTION]...[OWNER][:[GROUP]] FILE...
改文件的属主、属组
# chown user1 t.txt # ll t.txt -rwxrwxrwx 1 user1 root 0 sep 7 07:44 t.txt # chown :user3 t.txt # ll t.txt -rwxrwxrwx 1 user1 user3 0 sep 7 07:44 t.txt # chown user1.user1 t.txt # ll t.txt -rwxrwxrwx 1 user1 user1 0 sep 7 07:44 t.txt # chown -R user1:user1 /tmp/test/
39 t.txt
chmod a-x t.txt
ll t.txt
-rw-rw-rw- 1 root root 0 Sep 8 04:39 t.txt
chmod +x t.txt
ll t.txt
-rwxrwxrwx 1 root root 0 Sep 8 04:39 t.txt
测试+x,-x,+w,-w,+r,-r
* chown
* -R 目录递归修改
* `chown [OPTION]...[OWNER][:[GROUP]] FILE...`改文件的属主、属组
```python
# chown user1 t.txt
# ll t.txt
-rwxrwxrwx 1 user1 root 0 sep 7 07:44 t.txt
# chown :user3 t.txt
# ll t.txt
-rwxrwxrwx 1 user1 user3 0 sep 7 07:44 t.txt
# chown user1.user1 t.txt
# ll t.txt
-rwxrwxrwx 1 user1 user1 0 sep 7 07:44 t.txt
# chown -R user1:user1 /tmp/test/