Linux学习----基础篇(用户权限及内存管理)
1、用户、组及环境变量
1.1、用户角色
- 超级用户:拥有对系统的最高管理权限,默认为root用户。需要注意的是,在Linux下的root用户拥有最高的权限而不受系统的限制,你可以使用root用户运行rm –rf /删除整个系统文件;而在Windows下的administrator用户的权限受到系统的限制,最明显的一个表现就是使用administrator用户无法删除系统文件。
- 普通用户:只能对自己目录下的文件进行访问和修改,具有登录系统的权限。
- 虚拟用户:也叫“伪”用户,这类用户最大的特点是不能登录系统,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。这类用户指向的shell为/sbin/nologin,使用该shell的用户无法登录系统。例如系统默认的bin、adm、nobody用户等。
1.2、用户和用户组
在Linux系统中,当一个用户被创建时,系统将创建一个与该用户同名的用户组,该用户为该组的唯一一个用户。
用户与组的关系有以下几种情形:
- 一对一:即一个用户可以存在一个组中,同时也是该组中的唯一成员
- 一对多:即一个用户可以存在多个用户组中,那么此用户具有多个组的共同权限
- 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限
- 多对多:多个用户可以存在多个组中,其实就是上面三个对应关系的扩展
1.3、用户和组的配置文件详解
1.3.1、/etc/passwd文件
该文件是系统的用户配置文件,是用户管理中最重要的一个文件。这个文件记录了Linux系统中每个用户的一些基本属性,并且对所有用户可读。
使用命令vipw可以打开并修改该文件。
配置文件详解:
1.3.2、/etc/shadow文件
该文件为系统用户的影子文件,用于存储经过加密后的用户密码。由于/etc/passwd文件对所有用户可读,所以为了保证系统安全,系统单独将密码从/etc/passwd文件中分离出来。该文件只有root用户拥有读取权限。
配置文件详解:
文件中字段的主要含义为:用户名:加密后的密码:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
一些字段详解:
密码字段:
- 如果为空,则对应用户没有密码,登录时不需要密码
- 星号和感叹号表示账户被锁定,无法登录
-
$6$
开头的,表明是用SHA-512加密 $1$
表明是用MD5加密$2$
是用Blowfish加密$5$
是用 SHA-256加密
最后一次修改时间:表示从某个时刻起,到用户最后一次修改密码的天数。不同的系统时间起点不同。
最小时间间隔:两次修改密码之间的最小天数。
最大时间间隔:密码保持有效的最大天数。
警告时间:从系统开始警告用户到用户密码正式失效之间的天数。
不活动时间:用户没有登录活动但账号仍能保持有效的天数。
失效时间:一个绝对天数,如果使用了该字段,那么账户就有个生存期,到期后该账户就不是一个合法账户,无法登录系统。
1.3.3、/etc/group文件
该文件为系统用户组的配置文件,系统中所以用户组的信息都存放在该文件中。
配置文件详解:
1.3.4、/etc/login.defs文件
该文件用来定义创建一个用户时的默认设置,比如指定用户的UID和GID的范围,用户的过期时间、是否需要创建用户主目录等等。
1.3.5、/etc/default/useradd文件
该文件定义了新建用户的一些默认属性,比如用户的主目录、使用的shell等等,通过更改此文件,可以改变创建新用户的默认属性值。
1.3.6、/etc/skel目录
该目录下的文件定义了新建用户在主目录下默认的配置文件,更改/etc/skel目录下的内容就可以改变新建用户默认主目录的配置文件信息。
1.3.7、查看用户信息及用户所属组命令
查看用户UID、GID及用户所属的组
id 用户名
查看用户所属的组
groups [用户名] # 指定用户名时为查看该用户所属的组,不指定用户名时查看当前登录用户所属的组
1.4、创建、删除、切换用户组命令
1.4.1、创建用户组
groupadd [选项] 组名
常用选项:
- -f:如果组或GID已存在则退出
- -g:指定组的GID
- -k:不适用/etc/login.defs中的默认值
- -o:允许创建有重复GID的组
- -r:创建一个系统账户
- -p:为组设置密码
1.4.2、删除用户组
groupdel 组名
1.4.3、切换用户所属的组
newgrp 用户 组名
1.5、创建、删除、修改用户命令
1.5.1、创建用户
useradd [选项] 用户名
常用选项:
- -u:指定用户的UID
- -o:允许使用重复的UID
- -g:指定用户所属的默认组(主组),该组必须已经存在
- -G:指定用户的附加组,该组必须已经存在
- -d:指定用户的主目录,如果不指定,则读取/etc/default/useradd文件中的配置
- -s:指定用户使用的shell,如果不指定,则读取/etc/default/yseradd文件中的配置
1.5.2、删除用户
userdel [选项] 用户
常用选项:
- -r:删除用户的同时删除该用户的主目录及目录下的所有文件
1.5.3、修改用户
usermod [选项] 用户
常用选项:
- -u/o/g/G/d/s:同useradd命令
- -L:锁定用户密码,使密码无效
- -U:解除密码锁定
1.6、sudo命令
该命令用于普通用户临时执行需要root权限的命令,使用sudo时只需要输入当前普通用户的密码即可。当普通用户需要执行只有root才有权限执行的命令时,如果使用su命令切换到root用户,则该用户必须知道root的密码,而使用sudo则不需要知道root的密码。命令语法如下:
sudo [选项] 执行的命令
sudo的配置文件为/etc/sudoers,该文件遵循who(谁) where(从哪里) whom(什么身份)command(执行的命令),即哪个用户在什么地方以什么身份运行什么命令。以下为该文件的主要配置部分:
我们以root用户的配置为例分析该文件的语法:
root ALL=(ALL) ALL
- root:root用户
- ALL:从任何地方
- =(ALL):可以使用任何用户的身份
- ALL:可以执行任何命令
一些例子:
www 192.168.10.0/24=(root) /usr/sbin/useradd # www用户使用sudo命令时只能从192.168.10.0/24网段上登录并以root身份执行useradd命令 www ALL=(root) NOPASSWD:ALL,!/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,!/bin/su #允许www用户不需要输入密码执行所有命令,除了passwd后加任意字符、passwd root和su这三类操作
注意:当对一个用户进行配置时,如若该用户同时属于一个用户组,那么该用户将继承该组对于sudo命令的使用配置,单独对该用户进行配置不起作用。例如,www用户输入wheel组,该组的配置为
%wheel ALL=(ALL) ALL
则此时对www用户单独配置
www ALL=(root) /usr/sbin/groupadd
此时该配置将不起作用,www用户照样可以使用除groupadd之外的命令。
注意:修改/etc/sudoers文件时,建议使用visudo工具而不使用vi/vim,该工具在修改保存时会检查该文件的语法,如果有语法错误将会进行提示,避免因为语法错误照成该文件失效。
1.7、环境变量
常见的系统环境变量有:PATH、PWD、BASH、LANG、USER、HOSTNAME、HOME、SHELL。
注意:环境变量均为大写。
使用以下命令可以查看环境变量的值:
echo $变量名
使用以下命令列出已经定义的环境变量:
env
使用以下命令定义环境变量:
变量名=变量值
export 变量名
# 先为变量赋值,然后使用export声明该变量
注意:在命令行中设置的环境变量将在用户注销时失效。
使用以下命令清除环境变量:
unset 变量名
环境变量配置文件:
全局环境变量配置文件为/etc/profile;用户环境变量配置文件位于用户根目录下,为.bash_profile、.bashrc。当用户登录时,shell会首先执行系统全局配置文件/etc/profile,然后执行.bash_profile文件,额u过.bash_profile不存在则读取.bashrc文件。
系统初始化环境变量顺序如下:
一个例子,为Python3.7添加环境变量:
CentOS 7.5自带的Python版本为2.7,这里通过源码编译的方式安装了Python 3.7版本,安装路径为/opt/python37,可执行文件python3.7位于/opt/python37/bin目录下,通过修改环境变量实现在任何目录下输入python3.7即可运行3.7版本的Python:
临时修改环境变量:
[root@localhost ~]# export PYTHON37=/opt/python37/bin
[root@localhost ~]# export PATH=$PATH:$PYTHON37
为当前用户配置环境变量:
[root@localhost ~]# vim ~/.base_profile # 修改 PATH=$PATH:$HOME/bin:/opt/python37/bin # 使配置文件马上生效
[root@localhost ~]# source ~/.bash_profile
为全局修改环境变量:
[root@localhost ~]# vim /etc/profile # 修改,在行export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL下添加 export PATH=$PATH:opt/python37/bin #使配置文件马上生效
[root@localhost ~]# source /etc/profile
2、文档属性及权限
2.1、文档属性信息
使用ls –al或ll命令可以查看目录或文件的详细属性信息。
其中,“.”代表当前目录,“..”代表上级目录,而文件或目录前带“.”的表示隐藏文件。
以下为属性信息的详细解读:
类型:常见的文件类型有以下七种
- -:普通文件
- d:目录
- c:字符设备文件
- b:块设备文件
- s:套接字文件
- p:管道
- l:符号链接文件
属主权限:该文档所属用户的权限,r为可读,w为可写,x为可执行
属组权限:该文档所属用户组的权限
其他用户权限:其他用户对于该文档的权限
硬链接数量:该文件有多少个硬链接
属主:该文档所属的用户
属组:该文档所属的用户组
大小:该文档的大小,默认单位bytes。对于目录,通常只显示文件系统默认block的大小
最后修改时间:文档最后一次的修改日期,通常以月、日、时、分的方式显示,如果文档修改时间距离现在已经很远了,会使用月、日、年的方式显示
2.2、设备文件分类
在/dev目录下有大量的设备文件。根据设备文件的不同,可以分为字符设备文件和块设备文件。
字符设备文件的存取是以字符流的方式来进行,一次传送一个字符。常见的有打印机、终端(TTY)、绘图仪和磁带设备等,字符设备文件有时也被称为raw设备文件。
块设备文件是以数据块的方式来存取数据的,最常见的设备就是磁盘。系统通过块设备文件存取数据时,先从内存中的buffer读写数据,而不是直接从物理磁盘读写数据,这种方式有效的提高了磁盘的I/O性能。
2.3、修改文档的属主和属组
使用chown命令可以改变文档的属主和属组,该命令语法如下
chown [选项] 用户名[:组名] 文档
常用选项:
- -R:递归更改目录下所有文档及子目录的权限
2.4、修改文档的权限
使用chmod命令可以修改文档的权限,该命令有两种用法:一是包含字母和操作符表达式的字符设定法;二是包含数字的数字设定法。
字符设定法:
语法如下:
chmod [操作对象][+|-|=][权限] 文档
操作对象:可以是以下字母的任意一个或它们的组合
- u:属主user
- g:属组group
- o:其他用户others
- a:所有用户all
操作符号:
- +:添加某个权限
- -:取消某个权限
- =:赋予某个权限,同时取消原有的权限
权限:使用r可读、w可写、x可执行
数字设定法:
语法如下:
chmod 属主权限数字组合属组权限数字组合其他用户权限数字组合 文档
使用数字指定权限:
- 0:没有任何权限
- 4:可读r
- 2:可写w
- 1:可执行x
一些例子:
为当前目录下的a.txt文件设置权限为属主可读可写可执行,属组可读可写,其他用户可读,根据权限代表的数字可计算出属主权限为4+2+1=7,属组权限为4+2=6,其他用户权限为4,命令如下
[root@localhost ~]# chmod 764 a.txt
3、内存管理
3.1、物理内存与虚拟内存
物理内存即硬件内存条提供的内存空间,是真正的内存。虚拟内存是在磁盘上虚拟出来的一块逻辑内存空间,用于解决物理内存不足的情况。在Linux下虚拟内存被称为交换空间(Swap Space)。
Linux的内存管理采用的是分页存取机制,为了保证物理内存得到充分利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而经常使用的数据则保留在物理内存中。系统会不时的进行页面交换操作,以保证尽可能多的空闲物理内存;交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会马上被交换回交换空间,如此一来,交换空间中可能没有足够的空间来存储这些页面,最终将会导致系统出现假死机、服务异常等问题。
3.2、使用free命令监控内存
free命令用于查看物理内存和虚拟内存的使用情况,在CentOS 6.x版本中和CentOS 7.x版本中显示的内容不同。
以下分别在CentOS 6.9和CentOS 7.5中执行命令:
[root@localhost ~]# free -h
CentOS 6.9下的显示:
CentOS 7.5下的显示:
对于系统来说,内存的free值=total-used。但对于应用程序,内存的free值=Mem的free+(buffers+cached)。因为buffers/cached的存在是为了提高文件的读取性能的,当应用程序需要使用内存时,buffres/cached会很快被回收。
所以,在CentOS 6.x下查看内存使用状况时,重点查看-/+ buffers/cache行的free值。而在CentOS 7.x下已不再详细区分buffers和cache,系统提供了available栏来显示可用内存情况。
buffers/cached异同:
buffres与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,当操作系统需要读取文件时,首先在buffers与cached中查找。如果找到,则直接读出;如果没有找到,则从磁盘进行读取。这就是操作系统的缓存机制,通过缓存大大提高了系统性能。
buffers与cached中的内容不同。buffers存储块设备以及文件系统元数据(metadata)所占用的缓存页(page cache);cached存储普通文件所占用的缓存页(page cache)。
手动释放缓存:
释放buffers:
echo 1 > /proc/sys/vm/drop_caches
释放文cached:
echo 2 > /proc/sys/vm/drop_caches
释放所有缓存:
echo 3 > /proc/sys/vm/drop_caches
在手动释放缓存前,需要使用sync命令将所有未写入的缓存写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。
3.3、swap的创建和优化
3.3.1、创建swap
swap可以在安装系统时创建。如果空间不足,可以在系统中手动创建swap。swap所需的交换文件其实是一个普通的文件,但创建该文件与创建普通文件不同,需要使用dd命令进行创建,该命令语法如下:
dd if=输入的文件或设备 of=输出的文件或设备 ibs|obs|bs=x count=x
命令详解:
- if=:输入的文件或设备
- of=:输出的文件或设备
- ibs=:一次读一个多大的块,默认单位bytes
- obs=:一次写一个多大的块,默认单位bytes
- bs=:一次读写多大的块,默认单位bytes
- count=:拷贝多少个块
使该文件成为交换文件:
mkswap 交换文件
激活swap:
swapon 交换文件
当该swap分区不使用时,使用以下命令停止它:
swapoff 交换文件
接下来就可以使用rm命令删除该文件了。
一个例子:
为系统添加1G的swap,交换文件设置在/data目录下,命名为swapfile
# 首先通过dd命令在/data目录下创建一个名为swapfile的1G大小的文件 [root@localhost ~]# dd if=/dev/zero of=/data/swapfile bs=1G count=1 # 额外的:/dev/zero是一个特殊的文件,当你读取它的时候,它会提供无限的空字符。该文件通常用于覆盖信息,或者是产生一个特定大小的空白文件。 # 使/data/swapfile成为一个交换文件 [root@localhost ~]# mkswap /data/swapfile # 激活该部分空间 [root@localhost ~]# swapon /data/swapfile # 此时,通过free -h命令即可看到交换分区增加了1GB # 不使用该swap时,停止它 [root@localhost ~]# swapoff /data/swapfile # 删除/data/swapfile [root@localhost ~]# rm -f /data/swapfile
3.3.2、swap的优化
swappiness的值决定系统如何使用swap。swappiness=0时最大限度使用物理内存,然后才是swap;swappiness=100时积极使用swap分区,并把内存上的数据及时搬运到swap里。Linux的默认设置为60。使用以下命令查看swappiness值:
cat /proc/sys/vm/swappiness
swappiness=60的意思为,当物理内存使用量为100-60=40%时,就开始使用swap。
swappiness值可以使用以下命令临时调整:
sysctl vm.swappiness=x
如果需要永久修改swappiness值,则需修改/etc/sysclt.conf文件,添加:
vm.swappiness=x