Linux(持续更新)

简介

Multics(大而全)项目失败,吸取教训启动Unix(小而精),Linus Benedict Torvalds受Unix启发开发初始版本Linux内核,Git也由其开发,目的是为了更好的管理Linux内核开发。Unix是商业软件,Linux是开源软件。

Linux Logo,企鹅

请添加图片描述

Linux的发行版本可以分为两类,一类是商业公司维护的发行版本,以Red Hat Enterprise Linux为代表,一类是社区组织维护的发行版本,以Debian为代表,两者最大的区别是包管理方式。社区中常用的是CentOS和Ubuntu,CentOS为RHEL的社区版本,Ubuntu基于Debian发展而来。

Windows与Linux的区别
文件名、目录名、命令
Windows不区分大小写dir和DIR都行
Linux区分大小写,cd和CD中只有cd行
Linux中硬件被抽象为设备文件,在/dev下
Windows中使用设备管理器管理硬件;

Linux的用户界面不与内核绑定,服务器通常会使用无图形环境的操作系统镜像,Windows用户界面与内核绑定。

UNIX/Linux可以粗糙的分为三层,基础是硬件,第一层是内核,第二层是Shell,第三层是应用层。

安装LInux

虚拟机软件VMware安装linux

VMware网络适配器支持五种网络连接

  1. 桥接模式,虚拟机网卡和宿主机网卡均连接到虚拟机软件提供的VMnet0虚拟交换机上,虚拟机和宿主机地位平等。虚拟机与宿主机处于同一局域网,可以相互ssh登录,虚拟机可连接互联网,可连接路由器下所有机器构成的局域网(举例,路由器A,宿主机B,宿主机C,在宿主机B上创建虚拟机D、E且均使用桥接模式,在宿主机C上创建F、G且均使用桥接模式,则B、C、D、E、F、G地位相等,可互相ssh)

  2. NAT模式,虚拟机网卡和宿主机的虚拟网卡VMnet8连接到虚拟机软件所提供的VMnet8虚拟交换机上,VMware为虚拟机提供了一个虚拟NAT服务器和一个虚拟DHCP服务器,可以相互ssh登录,虚拟机可连接互联网,可连接宿主机与使用NAT模式的所有虚拟机构成局域网

  3. 仅主机模式,虚拟机和宿主机使用VMware的VMnet1虚拟网卡进行通信,无NAT服务,虚拟机仅可连接主机,不可连接局域网和互联网

  4. 自定义,手动选择虚拟网卡,VMnet1即为仅主机模式,VMnet8为NAT模式

  5. LAN区段,可划分不同虚拟网络

U盘安装Linux

分区

格式化,格式化的目的是写入文件系统,而非清空数据

文件系统类型:ext3、ext4(兼容ext3)、fat32(Windows上一代文件系统)、NTFS(Windows新一代文件系统)

分区和格式化后,Windows中分配一个盘符即可使用,Linux需要将该分区挂载到某个目录,另外,Linux中硬件被抽象为文件,分区自然被抽象为文件

IDE硬盘 /dev/hd[a-d]

SCSI/SATA/USB 硬盘 /dev/sd[a-p]

软盘 /dev/fd[0-1]

光驱 /dev/cdrom或/dev/sr0

打印机(25针)/dev/lp[0-2]

打印机(USB)/dev/usb/lp[0-15]

鼠标 /dev/mouse

无人值守安装

大批量服务器(如万台大集群)操作系统安装,搭建一台操作系统安装服务器,将其他所有未安装的服务器作为客户端,客户端修改启动方式为网络启动,从安装服务器下载所需的软件,并安装至客户端

Linux使用建议

Linux使用建议

  1. 将文件放在合适的Linux目录结构中

  2. 不在服务器高负载时运行高负载命令,如执行大范围搜索命令

  3. 远程配置防火墙或者ssh时不要将自己踢出服务器,在机房本地配置或者写个定时任务,每五分钟清空防火墙规则,等测试完了关掉定时任务

  4. 指定合理的密码并定时更新,合理保存密码

  5. 合理分配权限

  6. 定期备份重要数据和日志(重要)

Linux目录

以下是对这些目录的解释:

  • /bin
    bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。

  • /boot:
    这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。

  • /dev :
    dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

  • /etc:
    etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

  • /home
    用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。

  • /lib
    lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

  • /lost+found
    这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

  • /media
    linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。

  • /mnt
    系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。

  • /opt
    opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

  • /proc
    proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
    这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
    
  • /root
    该目录为系统管理员,也称作超级权限者的用户主目录。

  • /sbin
    s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

  • /selinux
    这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

  • /srv
    该目录存放一些服务启动之后需要提取的数据。

  • /sys

    这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。

    sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。

    该文件系统是内核设备树的一个直观反映。

    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp
    tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。

  • /usr
    usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

  • /usr/bin:
    系统用户使用的应用程序。

  • /usr/sbin:
    超级用户使用的比较高级的管理程序和系统守护程序。

  • /usr/src:
    内核源代码默认的放置目录。

  • /var
    var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

  • /run
    是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。

/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。

值得提出的是 /bin/usr/bin 是给系统用户使用的指令(除 root 外的通用用户),而/sbin, /usr/sbin 则是给 root 使用的指令。

/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。

其实安装软件程序并不是非要在指定的目录下完成,安装java、tomcat等也可以安装在opt目录下,但是安装程序的扩展性和管理性来说,方便使用才是最好的。

/usr/local 一般是你安装软件的目录,相当于 Windows 下的 Programefiles 目录。

/opt 这个目录是一些大型软件的安装目录,或者是一些服务程序的安装目录 。

opt 有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接 rm -rf掉即可。在硬盘容量不够时,也可将 /opt 单独挂载到其他磁盘上使用。

环境变量

环境变量的分类

  1. 按生效的范围分类。

系统环境变量:公共的,对全部的用户都生效。/etc/profile、/etc/profile.d、/etc/bashrc

用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。用户的.bash_profile、用户的.bashrc

  1. 按生存周期分类。

永久环境变量:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。

临时环境变量:使用时在Shell中临时定义,退出Shell后失效。

环境变量脚本文件的执行顺序如下:

/etc/profile->/etc/profile.d->/etc/bashrc->用户的.bash_profile->用户的.bashrc

同名的环境变量,如果在多个脚本中有配置,以最后执行的脚本中的配置为准。

还有一个问题需要注意,在/etc/profile中执行了/etc/profile.d的脚本,代码如下:

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

所以,/etc/profile.d和/etc/profile的执行顺序还要看代码怎么写。

设置环境变量

1)在Shell下,用export设置的环境变量对当前Shell立即生效,Shell退出后失效。

# 设置环境变量
export b=a
显示环境变量
export -p
# 取消环境变量
unset 变量名

2)在脚本文件中设置的环境变量不会立即生效,退出Shell后重新登录时才生效,或者用source命令让它立即生效。

实际配置:

虽然设置环境变量的方法有多种,但是建议系统环境变量建议在/etc/profile.d目录中配置,用户环境变量在用户的.bash_profile中配置,不建议在其它脚本文件中配置环境变,会增加运维的麻烦,容易出错。

系统环境变量对全部的用户生效,设置系统环境变量有三种方法。

1)在/etc/profile文件中设置。

用户登录时执行/etc/profile文件中设置系统的环境变量。但是,Linux不建议在/etc/profile文件中设置系统环境变量。

2)在/etc/profile.d目录中增加环境变量脚本文件,这是Linux推荐的方法。

/etc/profile在每次启动时会执行/etc/profile.d下全部的脚本文件。/etc/profile.d比/etc/profile好维护,不想要什么变量直接删除/etc/profile.d下对应的 shell 脚本即可。

3)在/etc/bashrc文件中设置环境变量。

该文件配置的环境变量将会影响全部用户使用的bash shell。但是,Linux也不建议在/etc/bashrc文件中设置系统环境变量。

用户环境变量只对当前用户生效,设置用户环境变量也有多种方法。

1).bash_profile(推荐首选)

当用户登录时执行,每个用户都可以使用该文件来配置专属于自己的环境变量。

2).bashrc

当用户登录时以及每次打开新的Shell时该文件都将被读取,不推荐在里面配置用户专用的环境变量,因为每开一个Shell,该文件都会被读取一次,效率肯定受影响。

3).bash_logout

当每次退出系统(退出bash shell)时执行该文件。

4).bash_history

保存了当前用户使用过的历史命令。

环境变量

PATH

可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。

1)PATH环境变量存放的是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录。

export PATH=目录1:目录2:目录3:......目录n:.

2)PATH缺省包含了Linux系统命令所在的目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。

LANG

Linux系统的语言、地区、字符集

它不需要系统管理员手工设置,/etc/profile会调用/etc/profile.d/lang.sh脚本完成对PATH的设置。

CentOS6.x 字符集配置文件在/etc/syscconfig/i18n文件中。

CentOS7.x 字符集配置文件在/etc/locale.conf文件中

HOSTNAME

服务器的主机名

SHELL

用户当前使用的Shell解析器

HOME

当前登录用户的主目录

PWD

当前工作目录## 命令
命令格式

命令 [选项] [参数]

命令用于执行一系列动作,选项用于调整命令的功能,参数用于指定命令的操作对象。选项可以分为ls -all形式的长选项或者ls -l形式的短选项,通常短选项是长选项的缩写形式,但并非所有长选项和短选项一一对应。

命令提示符,Linux用这个符号标识登录的用户权限等级。若为超级用户,提示符就是#,若为普通用户,提示符就是$

目录相关命令

ls

list

# 显示所有文件,Linux中以.开头的文件均为隐藏文件,如.bachrc、.ssh
ls -a

# 仅显示所有目录
ls -d

# 以长格式显示
ls -l

# 查看文件inode属性
ls -i

# 以人类可读性高的方式显示文件大小
ls -h

cd

change directory

# 更改当前目录到/home/centos
cd /home/centos

# 更改当前目录到本目录
cd .

# 更改当前目录到上一级目录
cd ..

# 更改当前目录到当前用户家目录
cd ~

# 更改当前目录到移动到本目录之前上次cd到的目录
cd -

mkdir

make directory

# 创建若干目录
make a
make a b
make a a/b

# 递归创建目录
make -p a/b

rmdir

remove empty directories

删除若干空目录

rmdir a b c
rmdir 

tree

查看树型目录结构

tree

文件相关命令

dir

linux可以使用l看是不是文件夹,正确方法使用dir

scp

rsync

touch

修改文件访问时间和数据修改时间

Linux中每个文件都有三个时间相关属性,数据访问时间(Access Time)、数据修改时间(Modify Time)、属性改变时间(Change Time),没有文件创建时间

数据访问时间在文件被访问时更新,如cat命令读取文件内容,数据修改时间在文件内容被修改时更新,如echo “something” >> file,属性改变时间在文件属性改变时更新,如文件名、文件内容、文件权限、文件拥有者、文件所属组、文件数据访问时间、文件数据修改时间等属性变化均会更新

注:touch修改数据访问时间和数据修改时间,而数据访问时间和数据修改时间的修改会引起属性改变时间的更新

# 修改数据访问时间和数据修改时间,文件不存在时创建
touch .bashrc

# 仅修改数据访问时间,文件不存在时创建
touch -a .bashrc

# 仅修改数据修改时间,文件不存在时创建
touch -m .bashrc

# 修改数据访问时间和数据修改时间,但文件不存在时不创建
touch -c .bashrc

stat

查看文件或文件系统的统计信息

# 查看文件.bashrc文件的信息
stat .bashrc
# 查看文件.bashrc文件所在文件系统的信息
stat -f .bashrc

cat

concatenate

一次性输出文件内容

cat file

head

显示文件前n行信息,默认为前10行

head .bashrc
head -n 20 .bashrc

tail

显示文件后n行信息,默认为10行

# 显示文件后20行信息
tail -n 20 .bashrc
# 追踪日志文件后30行
tail -n 30 -f user-service-2024-01-18.log

more

less

ln

make link

创建链接文件

ln xxx hard-file

●不论是修改源文件(test文件),还是修改硬链接文件(test-hard文件),另一个文件中的数据都会发生改变。

●不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode号是262147的文件)都可以被访问。

●硬链接不会建立新的inode信息,也不会更改inode的总数。

●硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode号是重新计算的。

●硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的Linux来讲过于复杂。

ln -s xxx soft-file
  • 软链接的源文件必须写绝对路径,否则建立的软链接文件就会报错,无法正常使用。

  • 比如软链接可以链接目录,也可以跨分区来建立软链接。

  • 软链接和源文件的inode号是不一致的

文件和目录都能操作的命令

rm

rm file
rm -i file
rm -f file

# 删除文件或者目录
rm -r file dir

# 强制删除文件或目录
rm -rf file dir

cp

cp a b

# 若源文件a为软连接,则目标文件b为软连接,对硬链接无效
cp -d a b
# 交互式复制,若目标文件b已存在,询问是否覆盖
cp -i a b
# 指定目标文件b为源文件a的硬链接文件
cp -l a b
# 指定目标文件b为源文件a的软链接文件
cp -s a b
# 复制后目标文件保留源文件的属性,如所有者、所属组、权限、时间
cp -p a b
# 递归复制
cp -r a b
# 等价于 cp -rpd
cp -a a b

mv

mv a b
# 交互式移动或重命名,若目标文件b已存在,询问是否覆盖
mv -i a b
# 强制移动或重命名文件,若目标文件b已存在则覆盖
mv -f a b
# 不强制移动或重命名文件,若目标文件b已存在则不覆盖
mv -n a b
# 移动文件并显示移动信息
mv -v a b

权限相关命令

权限简介

安装完操作系统后绝大多数文件的所有者为root,所属组也为root

dr-xr-xr-x.   5 root root 4096 Jan 12 23:15 boot
d 文件类型,Linux中判断文件类型取决于该标志而非后缀名
- 普通文件
b 块设备文件,例如/dev/sda1
b	块设备,是一些提供系统存取数据的接口设备,例如硬盘。 c	字符设备,是一些串行端口的接口设备,例如键盘、鼠标、打印机、tty终端。 d	目录,类似于Windows的文件夹。 l	链接文件,类似于Windows的快捷方式。 s	套接字文件(socket),用于进程之间的通信。
- 文件,分纯文本文件(ASCII)和二进制文件(binary)。


c 字符设备文件
d 目录文件
l 软连接
p 管道符文件
s 套接字文件

r-x 文件所有者权限
r-x 文件所属组权限
r-x 其他人权限

r 读权限
w 写权限
x 执行权限
- 无权限

.表示该文件受SELinux安全规则管理

chmod

超级用户可以修改任意文件的权限,普通用户只能修改所有者为该用户的文件

u表示所有者 user
g表示所属组 group
o表示其他人 other
a表示所有人 all

chmod u+x file
chmod g+x, o-x file
chmod a=rwx
chmod -R 777 dir

数字权限 r4 w2 x1
chmod 755 file
644 一般文件基本权限
755 可执行文件基本权限、目录基本权限
777 最高权限

一般文件r权限表示可以读取文件数据,如使用cat、more、less、head、less等命令查看文件

一般文件w权限表示可以修改文件数据,如使用vi、vim、echo等命令修改文件

一般文件x权限表示可以执行文件

目录r权限表示可以查看目录下内容,如使用ls命令查看目录下子文件和子文件夹

目录w权限表示可以在该目录下新建、删除、复制文件,如使用touch、rm、cp、mv

目录x权限表示可以切换当前目录到该目录,如使用cd切换工作目录

注意:文件w权限不能删除文件,文件名保存在所在目录的block中,删除文件需要修改所在目录的block即修改目录,需要文件所在目录的w权限

root用户为超级用户,即使root对某文件无任何权限,依然可以操作该文件

# 例如/home/centos,仅允许centos操作,但root用户可以删除centos下的文件
drwx------. 2 centos centos 62 Jan 16 08:25 centos

chown

change file owner and group

当希望将一个所有者为root的文件能让普通用户拥有最高权限时,应当修改该文件所有者为普通用户(root依然能访问),而非修改其他人权限为最高权限(会影响其他普通用户)

chown a-user a-file
chown a-user:user-group a-file

chgrp

change group

chgrp a-group a-file

umask

umask默认权限是Linux权限的一种,主要用于让Linux中新建文件和目录拥有默认权限

Windows中通过继承上级目录权限赋予文件和目录初始权限

umask,权限掩码

/etc/profile

# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002  # 普通用户 UID > 199,普通用户权限为 rwxrwxrwx中去掉 -------w-,即rwxrwxr-x
else
    umask 022  # 超级用户 UID <= 199,超级用户权限为 rwxrwxrwx中去掉 rwxr-xr-x
umask -p  # 第一位代表特殊权限 Set-UID SetGID Sticky BIT
umask 0002
umask -S  # 
u=rwx,g=rwx,o=rx

特殊权限相关命令

若在有目录/home/teacher/class,其所属人为教师teacher,所属组为class,class组中除teacher外还有student1、student2、student3三个用户,此时/home/teacher/class权限为rwxrwx—,即表示所属组为class的用户才可参与该目录操作。
若此时用户旁听生bystander需要具有该目录读r-x权限,则基本权限无法满足该需求。首先更改/home/teacher/class目录所属人权限没用,将用户bystander加入class组然后更改所属组权限为r-x会导致student1、student2、student3无法正常写操作耽误交作业,更改其他人权限为r-x则会导致其他所有人都可以读取该目录。此时通常会使用ACL机制设置权限。
ACL,Access Control List,访问控制列表

users.txt

teacher
student1
student2
student3
bystander
#!/bin/bash
# chmod 700 useradd.sh
# ./usersadd.sh
while IFS=: read -r username
do
    # Check if the user already exists
    if id "$username" &>/dev/null; then
        echo "User $username already exists. Skipping."
    else
        # Add user
        useradd "$username"
        echo "123456" | passwd --stdin $username
        # 强制第一次登录修改密码
        chage -d 0 $username
        echo "User $username added successfully."
    fi
done < users.txt
# root用户创建用户和用户组
./usersadd.sh
groupadd class
# 为teacher添加附加组class,为student1、student2、student3添加附加组class
usermod -G class teacher
usermod -G class student1
usermod -G class student2
usermod -G class student3
# 创建目录class
mkdir //class/
chmod 770 //class/
chown teacher:class //class/

# 为bystander授权
setfacl -m u:bystander:rx /class
# -m 设定ACL,用户u、用户组g、默认ACLd
# -x 删除指定ACL
# -b 删除所有ACL
# -d 设定默认ACL
# -k 删除默认ACL
# -R 递归设置ACL

# 添加acl权限后会有一个+标记
# drwxrwx---+   2 teacher class    6 Jan 26 12:16 class

# 查看acl权限
getfacl class
# file: class       文件名
# owner: teacher    属主
# group: class      属组
user::rwx           属主权限(用户名未特指)
user:bystander:r-x  bystander权限
group::rwx          属组权限(组名未特指)
mask::rwx           ACL权限掩码
other::---          其他人权限(用户名未特指)



为用户组设置ACL
setfacl -m g:class:rwx


# 为目录设置ACL权限掩码
setfacl -m m:rx /class


# 当为目录设置ACL时,通常希望该目录下已有文件和目录具有相同ACL,即递归设置ACL
setfacl -m u:bystander:rx -R /class

# 若在对某目录递归设置ACL后,又在该目录下新建文件或文件夹,新建文件和新建目录的ACL会采用父目录的默认ACL而非父目录的ACL,只有目录可以设置默认ACL
setfacl -m d:u:bystander:rx /class
# 等价
setfacl -d -m u:bystander:rx /class

getfacl class
# file: class
# owner: teacher
# group: class
user::rwx
user:bystander:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:bystander:r-x
default:group::rwx
default:mask::rwx
default:other::---


# 删除文件ACL中指定用户或用户组的权限
setfacl -x u:bystander /class

# 删除文件ACL中所有权限
setfacl -b /class

sudo

EUID, 用于系统决定用户对系统资源的访问权限,通常情况下等于UID。

帮助相关命令

man

https://www.man7.org/linux/man-pages/index.html

man ls
man -f ls  # 等价whatis
man -k ls  # 等价apropos,根据关键字搜索man
man useradd
1 普通用户可以执行的系统命令和可执行文件的帮助
2 内核可以调用的函数和工具的帮助
3 C语言函数的帮助
4 设备和特殊文件的帮助
5 配置文件的帮助
6 游戏的帮助(个人版Linux中有游戏)
7 杂项的帮助
8 内核的帮助

info

info ls

help

help命令只能获取Shell内置命令的帮助,help本身就是一个内置命令,但man和info不是

help help

注:绝大多数命令会有-h或–help参数用以查看该命令的帮助信息

man -h
info -h

用户相关命令

useradd user
passwd user

Windows中新建用户都属于users用户组
Linux中新建用户会同时建立一个与用户名同名的用户组作为该用户用户组

网络相关命令

查看DNS

cat /etc/resolv.conf

ifconfig

ip

# 查看ip地址
ip address

ifdown

禁用网卡

ifdown eth0

ifup

启用网卡

ifup eth0

ping

通过ICMP协议进行网络探测,测试网络中主机的通信情况。

# 默认一直探测
ping baidu.com
# 指定探测10次
ping -c 10 baidu.com

mail

write

wall

netstat

yum install -y net-tools

查看网络连接、路由表

# 显示使用tcp协议端口的连接状况
netstat -t
# 显示使用udp协议端口的连接状况
netstat -u
# 查看路由表
netstat -r
# 仅显示State为Listing的连接
netstat -l
# 显示PID和程序名
netstat -p
# 使用IP地址和端口号显示,不使用域名与服务名
netstat -n
# 列出所有网络状态,包括socket
netstat -a
# 指定每隔几秒刷新一次网络状态
netstat -c 1

通常会使用netstat -tuln查看网络状态

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
udp        0      0 127.0.0.1:323           0.0.0.0:*                          
udp        0      0 0.0.0.0:68              0.0.0.0:*                          
udp6       0      0 ::1:323                 :::*                               

Proto,网络连接协议,TCP或UDP
Recv-Q,接收到的数据,已经在本地缓冲区,还没有被进程取走
Send-Q,表示从本机发送,对方还没有收到的数据,依然在本地的缓冲区
Local Address,本机IP地址和端口号
Foreign Address,远程主机的IP地址和端口号
State,连接状态

  • LISTEN,监听状态
  • ESTABLISHED,连接已建立状态
  • SYN_SENT,主动发起连接
  • SYN_RECV,接收到主动连接的数据包
  • FIN_WAIT1,主动中断连接,但未接收到被动方确认
  • FIN_WAIT2,主动中断连接,且接收到被动方确认
  • TIME_WAIT,主动方等待被动方关闭连接
  • CLOSED,连接关闭

关机和重启相关命令

sync

应用向磁盘写入数据,会首先将数据写入内存缓冲区,缓冲区写满会写入磁盘,如果缓冲区未满时机器宕机,则会丢失该部分数据,sync命令用于主动将内存中的数据写入磁盘,该命令在关机时会自动执行。

sync

shutdown

# 立即重启
shutdown -r now
# 18:00重启
shutdown -r 18:00
# 10分钟后重启
shutdown -r +10
# 立即关机
shutdown -h now
# 18:00关机
shutdown -h 18:00 

reboot

reboot

halt

关机

halt

poweroff

关机

poweroff

init

# 关机
init 0
# 重启
init 6

压缩和解压缩相关命令

zip

压缩.zip文件

# 压缩文件a、b、b为xxx.zip
zip xxx.zip a b c
# 压缩当前目录中所有文件和文件夹为current_dir.zip
zip -r current_dir.zip .

unzip

解压缩.zip文件

unzip xxx.zip

gzip

压缩.gz文件

# 压缩xxx.log文件,不保留原始文件
gzip xxx.log
# 压缩xxx.log文件,保留原始文件
gzip -c xxx.log
# 压缩xxx目录中所有文件,若xxx目录中有a、b、c三个文件,则压缩结果并非xxx.gz而是xxx/a.gz、xxx/b.gz、xxx/c.gz三个压缩文件
# Linux中打包和压缩分开处理,gzip命令仅压缩
gzip -r xxx
# 解压缩文件
gzip -d a.gz

gunzip

# 解压缩
gunzip xxx.gz
# 解压缩目录下的压缩文件
gunzip -r xxx

zcat

若压缩的文件为文本文件,则可直接通过.gz文件查看内容

zcat xxx.gz

bzip2

压缩.bz2文件

# 压缩文件,不保留源文件
bzip2 xxx.log
# 压缩文件,保留源文件
bzip2 -k xxx.log
# 解压缩文件
bzip2 -d xxx.bz2

# 注:bzip2命令不能压缩文件夹

bunzip2

解压缩.bz2文件

bunzip2 xxx.bz2

bzcat

若压缩的文件为文本文件,则可直接通过.bz2查看内容

bzcat log.bz2

Linux中打包和压缩是两个步骤,通常会先将若干文件打包为.tar文件,然后再压缩为.gz文件,最终结果为.tar.gz文件

tar

.tar.gz或*.tgz

# -c 打包 -f 指定打包文件名 -v 显示打包内容
tar -cfv xxx.tar main.java controller/ service/

# -x 解包 -C 指定解包位置
tar -xfv xxx.tar -C ./

# tar打包完成后使用gzip或bzip2进行压缩,获取.tar.gz或者.tar.bz2文件,tar可以一步完成打包和压缩
# -z 压缩和解压缩.tar.gz格式
tar -zcfv xxx.tar.gz main.java controller/ service/
tar -zxfv xxx.tar.gc -C ./
# -j 压缩和解压缩.tar.bz2格式
tar -jcfv xxx.tar.bz2 main.java controller/ service/
tar -jxfv xxx.tar.bz2 -C ./

常用.tar.gz格式

搜索相关命令

type

对命令名称进行解释

[centos@yc-cn-centos-abc ~]$ help type
type: type [-afptP] name [name ...]
    Display information about command type.
    
    For each NAME, indicate how it would be interpreted if used as a
    command name.
    
    Options:
      -a        display all locations containing an executable named NAME;
        includes aliases, builtins, and functions, if and only if
        the `-p' option is not also used
      -f        suppress shell function lookup
      -P        force a PATH search for each NAME, even if it is an alias,
        builtin, or function, and returns the name of the disk file
        that would be executed
      -p        returns either the name of the disk file that would be executed,
        or nothing if `type -t NAME' would not return `file'.
      -t        output a single word which is one of `alias', `keyword',
        `function', `builtin', `file' or `', if NAME is an alias, shell
        reserved word, shell function, shell builtin, disk file, or not
        found, respectively
    
    Arguments:
      NAME      Command name to be interpreted.
    
    Exit Status:
    Returns success if all of the NAMEs are found; fails if any are not found.
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.
    
    Obsolete.  See `help declare'.

shell关键字
[centos@yc-cn-centos-abc ~]$ type if
if is a shell keyword

内置shell命令
[centos@yc-cn-centos-abc ~]$ type type
type is a shell builtin
[centos@yc-cn-centos-abc ~]$ type echo
echo is a shell builtin

外部命令有则定位
[centos@yc-cn-centos-abc ~]$ type tmux
-bash: type: tmux: not found

别名
[centos@yc-cn-centos-abc ~]$ type ls
ls is aliased to `ls --color=auto'
[centos@yc-cn-centos-abc ~]$ type ll
ll is aliased to `ls -l --color=auto'

可以查看多个,外部命令定位
[centos@yc-cn-centos-abc ~]$ type wget netstat
wget is /usr/bin/wget
netstat is /usr/bin/netstat



[centos@yc-cn-centos-abc ~]$ type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
[centos@yc-cn-centos-abc ~]$ type -a ls*  # 支持正则
-bash: type: ls*: not found

whereis

搜索系统命令及其帮助手册

whereis ls

# 仅搜索二进制命令
whereis -b ls
# 仅搜索帮助手册
whereis -m ls

which

搜索二进制命令,若该命令为别名则展示别名细节,并指出实际命令

# cd就是一个二进制命令
which cd

# ls本身是一个二进制命令,位于/usr/bin/ls,但通常系统会设置别名ls='ls --color=auto'从而覆盖原始ls命令
# 执行ls实质执行的是ls='ls --color=auto'
which ls
# alias ls='ls --color=auto'
#         /usr/bin/ls
# 同理,ll命令也是一个别名,这种使用whereis是搜索不到的,使用which ll
# alias ll='ls -l --color=auto'
#        /usr/bin/ls

locate

yum install locate

locate用于搜索文件,系统命令就是二进制文件,locate仅根据文件名进行搜索,无法进行复杂搜索。locate并非直接搜索磁盘,而是将文件路径存储到locate数据库中,直接在数据库中进行搜索,相比于其他搜索命令,locate搜索快速资源占用小,但数据库并非实时更新,新建文件会搜索不到。

# 查找.bashrc文件
locate .bashrc
# 忽略大小写并查找.bashrc文件
locate -i .bashrc

# 初次安装locate或者新建文件在locate的数据库中是查找不到该文件的
# 该数据库会在用户退出或者重新启动后自动更新,数据库数据存储于/var/lib/mlocate/mlocate.db,若要手动更新
updatedb

locate数据库的配置文件为/etc/updatedb.conf,

# 是否启用搜索限制
PRUNE_BIND_MOUNTS = "yes"
# 禁止搜索的文件系统类型
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs fuse.glusterfs ceph fuse.ceph"
# 禁止搜索文件名中包含.git等的,.gitxxx也不会搜索到
PRUNENAMES = ".git .hg .svn"
# 禁止搜索如下路径下的文件
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"

find

# 文件名
# 按照名称搜索
find / -name .bashrc
# 忽略大小写并按照名称搜素
find / -iname .bashrc

# 文件大小
# 搜索大于10M的文件,k小写、M大写
find / -size +10M
# 搜索小于10M的文件
find / -size -10M

# 时间
# -atime 访问时间 -mtime 数据修改时间 -ctime 状态修改时间
# 查找往前数(不包括今天)第5天访问过的文件,若今天是2024.01.10,则会查找2024.01.05当天访问过的文件
find / -atime 5
# 查找往前数(不包括今天)第5天到现在(不包括第五天)访问过的文件,就是出今天外往前4个完整1天
find / -atime -5
# 查找往前数(不包括今天)第5天过去(不包括第五天)访问过的文件
find / -atime +5
# 总结就是以今天为0天,5表示过去第五天,-5表示(5, 0],+5表示(oo, 5)

# 权限
# 查询指定权限的文件,要求文件权限与给定权限完全一致
find / -perm 666
# 查询具有任意一个身份任意一个权限的文件,要求所有者、所属组和其他人任意一个身份中读写任意一个权限具有就会被查出来
find / -perm +666
# 查询具有三个身份指定的所有权限的文件,如777权限文件完全包含666,会被查出
find / -perm -666
# +表示或 -表示且

# 所有者、所属组
# -uid 用户ID -gid 组ID -user 用户名 -group 组名 -nouser 没有所有者
# 查找所属人为管理员的文件,0是root的uid
find / -uid 0

# 文件类型
# 查找目录
find / -type d
# 查找普通文件
find / -type f
# 查找软链接文件
find / -type l

# 复合逻辑
# -a 与 -o 或 -not 非
# 查询/目录下 文件大小大于2kb的普通文件
find / -size +2k -a -type f

用户相关命令

Linux中由用户和用户组实现用户管理。
用户和用户组信息都存储于文件中,其中/etc/passwd存储用户信息,/etc/shadow中存储用户密码信息,/etc/group中存储用户组信息,/etc/gshadow中存储用户组密码信息,另外,每个用户都会有一个自用户模板目录生成的家目录和一个存储在用户邮件目录中的邮箱文件。
修改上述文件即修改用户相关信息,如添加和删除用户即可直接修改文件以实现目的,通常并不会直接修改文件而是通过用户相关命令简介操作文件实现用户管理的目的。

/etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
centos:x:1000:1000:centos:/home/centos:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
centos:x:1000:1000:centos:/home/centos:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
# 每行代表一个用户,包含该用户各种信息,以:分隔,共7个字段
# 用户名称:密码占位:UID:GID:用户说明:家目录:登录之后的shell
# 用户名称,Linux中通过UID区分用户,shell脚本中通常使用的是UID,用户名称用于方便管理员识别用户身份,用户名称与UID之间的映射关系即由/etc/passwd记录
# 密码占位,x,早期UNIX中此处为加密后的密码,由于/etc/passwd文件权限为644,用户均可读取且有暴力破解密码的风险,故Linux将加密后的密码保存在/etc/shadow中,/etc/passwd仅保留密码占位,/etc/shadow权限为000,仅root用户可操作
# UID,用户ID,唯一标识,Linux是通过UID区分用户和分配用户权限的,0是超级用户,在LInux中将普通用户升级为超级用户,将其UID改为0
# GID,组ID,此处为初始组ID,初始组,即新建用户时指定的用户组,通常新建用户时同时会创建与用户名同名的用户组并且建立归属关系作为初始组,随后该用户还可加入其他用户组,此时对于该用户而言其他用户组为该用户的附加组,初始组有且仅有一个,附加组可以有若干个
# 用户说明,对该用户的简要描述信息,可省略
# 家目录,该用户的家目录,root用户为/root,一般用户的家目录为/home下的用户名同名目录,如cnetos用户家目录为/home/centos
# 登录之后执行的shell命令,/bin/bash表示登录之后执行/bin/bash,/sbin/nologin表示拒绝登录

在Linux中,若忘记密码,可以启动进入单用户模式,删除/etc/passwd中密码占位符即可从本地登录

/etc/shadow

root:$6$C2IBLMpAj8PoUsKh$2C10RhLe6HNQpOCpkEw0MM4O7dfoOSxqZKjbLYNlRD4Y1..dE4xWPbiVaeHXqo4CQjscMjhoSuhuDKebLJzrF/::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
sync:*:18353:0:99999:7:::
shutdown:*:19747:0:99999:7:::
halt:*:18353:0:99999:7:::
mail:*:18353:0:99999:7:::
operator:*:18353:0:99999:7:::
games:*:18353:0:99999:7:::
ftp:*:18353:0:99999:7:::
nobody:*:18353:0:99999:7:::
systemd-network:!!:19735::::::
dbus:!!:19735::::::
polkitd:!!:19735::::::
sshd:!!:19735::::::
postfix:!!:19735::::::
chrony:!!:19735::::::
centos:$6$paSiT/m9R7eftnCR$csFvCAXmr5Emf19.xhs0TD/DFMmB.aT1ADtWBsyAT9sioJ9TgBNoZpR8BvtPk/534.yubgdOMK7Rq7HwCgSej1::0:99999:7:::
用户名称:加密后的密码:密码最后一次修改日期:密码两次修改间隔时间:密码有效期:密码到期前的警告天数:密码过期后的宽限天数:账号失效时间:预留字段
十个字段
用户名称,与/etc/passwd中用户名称一致
加密后的密码,通常是SHA512方式加密的密码,系统用户此处值为*或者!!,表示不设定密码但是登录要求密码,故该用户无法登录
密码最后一次修改日期,整数值,表示1970.01.01以来的第n天
密码两次修改间隔时间,整数值,要求两次修改密码的时间间隔大于等于该值
密码有效期,整数值,密码更新后有n天有效期,默认值为99999,表示99999天有效期
密码到期前的警告天数,整数值,密码有效期最后n天会进行警告
密码过期后的宽限天数,整数值,密码过期后,在n天内依然可以登录系统,0表示密码失效后不宽限时间,-1表示密码失效后永久宽限
账号失效时间,整数值,表示1970.01.01以来的第n天后该账号失效,此时无论密码是否过期均不可登录

/etc/group

用户组文件

root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
utmp:x:22:
utempter:x:35:
input:x:999:
systemd-journal:x:190:
systemd-network:x:192:
dbus:x:81:
polkitd:x:998:
ssh_keys:x:997:
sshd:x:74:
postdrop:x:90:
postfix:x:89:
chrony:x:996:
centos:x:1000:centos
slocate:x:21:
用户组组名:用户组密码占位:GID:该用户组下用户

/etc/gshadow

root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::
cdrom:::
mail:::postfix
man:::
dialout:::
floppy:::
games:::
tape:::
video:::
ftp:::
lock:::
audio:::
nobody:::
users:::
utmp:!::
utempter:!::
input:!::
systemd-journal:!::
systemd-network:!::
dbus:!::
polkitd:!::
ssh_keys:!::
sshd:!::
postdrop:!::
postfix:!::
chrony:!::
centos:!!::centos
slocate:!::
用户组组名:用户组密码:用户组管理员用户名:该用户组下用户
通常用户组由root用户管理,Linux允许通过用户组密码给某个用户组指定用户组管理员,由用户组管理员负责该用户组的管理

用户家目录

Linux中每个用户都会有一个家目录,root用户的家目录为/root,权限为550,普通用户的家目录通常为/home目录下的与用户名同名的目录,权限为700

dr-xr-x---. 2 root root  135 Jan 17 18:21 root
drwx------. 4 centos centos 116 Jan 25 11:28 centos

家目录用~表示

用户邮箱目录

在建立用户时,系统会给每个用户建立一个邮箱,邮箱位于/var/spool/mail目录下,centos用户的邮箱为/var/spool/mail/centos,邮箱是一个普通文件

-rw-rw----. 1 centos mail    0 Jan 12 23:11 centos
-rw-------. 1 root   mail 1.5K Jan 25 11:35 root

用户模板目录

创建用户时,每个用户家目录下都会有一些默认文件,这些文件由/etc/skel/目录下文件为模板生成。若希望新建用户时用户家目录下有某个默认文件,只需将其放置于模板目录下即可

[centos@yc-cn-centos-abc skel]$ ls -a
.  ..  .bash_logout  .bash_profile  .bashrc

useradd

useradd test
# 新建test用户,该命令使用默认配置完成了如下内容:
# 1. 在/etc/passwd中添加,test:x:1001:1001::/home/test:/bin/bash
# 2. 在/etc/shadow中添加,test:!!:19748:0:99999:7:::
# 3. 在/etc/group中添加,test:x:1001:
# 4. 在/etc/gshadow中添加,test:!::
# 5. 建立用户家目录,drwx------. 2 test   test    62 Jan 26 06:52 test
# 6. 建立用户邮箱文件,-rw-rw----. 1 test   mail    0 Jan 26 06:52 test

useradd命令默认配置文件

/etc/default/useradd

# useradd defaults file
# 初始组ID,通常该选项不会生效,Linux中初始组有两种机制,一是公有用户组机制,使用GID为100的用户组作为新建用户的初始组,二是私有用户组机制,新建用户名同名的用户组作为初始组,通常采用私有用户组机制
GROUP=100
# 用户家目录默认位置
HOME=/home
# 密码过期后宽限天数,即/etc/shadow中第7个字段,默认为-1,表示新建用户的用户密码无期限宽限
INACTIVE=-1
# 密码失效时间,即/etc/shadow中第8个字段,默认为空,表示密码永不过期
EXPIRE=
# 用户默认shell,默认为/bin/bash,/bin/bash是Linux标准shell
SHELL=/bin/bash
# 用户家目录的模板目录
SKEL=/etc/skel
# 是否为新建用户创建邮箱
CREATE_MAIL_SPOOL=yes

/etc/login.defs

#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#

# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR      Maildir
# 新建用户的默认邮箱文件所在目录
MAIL_DIR        /var/spool/mail
#MAIL_FILE      .mail

# Password aging controls:
#
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
# 密码有效期,即/etc/shadow中第5个字段,表示99999天后必须修改密码
PASS_MAX_DAYS   99999
# 密码两次修改的最小时间间隔
PASS_MIN_DAYS   0
# 密码的最小长度
PASS_MIN_LEN    5
# 密码到期前的警告天数
PASS_WARN_AGE   7

# useradd自动生成UID的最大最小值
# 普通用户UID从1000到60000
UID_MIN                  1000
UID_MAX                 60000
# 系统用户UID从201到999
SYS_UID_MIN               201
SYS_UID_MAX               999

#
# groupadd自动生成GID的最大最小值
#  普通用户UID从1000到60000
GID_MIN                  1000
GID_MAX                 60000
# 系统用户GID从201到999
SYS_GID_MIN               201
SYS_GID_MAX               999

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME     yes

# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK           077

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes

# 使用SHA512加密用户密码
ENCRYPT_METHOD SHA512
useradd -u 1002 -d /home/hadoop -c hadoop_only -g hadoop -G centos -s /bin/bash -e 2300-12-31 hadoop
# -u UID
# -d 家目录,绝对路径
# -c 用户说明,/etc/passwd第5个字段
# -g 初始组组名
# -G 附加组组名
# -s 默认shell
# -e 用户失效日期,/etc/shadow的第8个字段
# -o 允许创建的用户UID与已有用户相同,如创建一个超级管理员用户,useradd -u 0 -o  rootson

passwd

# -S 查看密码状态,即/etc/shadow中内容
# -l 临时锁定用户,该用户将不可登录
# -u 解锁用户
# --stdin 将管道符输出的数据作为用户密码,用户批量创建用户时

# root用户设定密码
passwd test

# 密码要求包含大写字母、小写字母、数字和特殊符号中的三种,root不遵循该规则也可成功设置密码

# 普通用户修改密码,不允许指定用户,默认即为当前用户
passwd

echo "123456" | passwd --stdin test
# 使用包含明文密码的命令设置密码可以通过history命令查到历史记录,有安全隐患,一是需要手动清理历史命令,二是需要强制用户第一次登录时修改密码

usermod

修改用户信息

-u UID
-d 家目录
-c 用户描述信息
-g 初始组组名
-G 附加组组名
-s shell
-e 用户失效日期
-L 锁定用户,在用户加密后的密码前添加!
-U 解锁用户,将用户加密后的密码前的!去掉

chage

修改用户密码状态
/etc/shadow中第3个字段到第8个字段

-l 列出详细密码状态
-d 密码最后一次修改日期,第三个字段
-m 密码两次修改时间间隔,第四个字段
-M 密码有效期,第五个字段
-W 密码修改到期前的警告天数,第六个字段
-I 密码过期后的宽限天数,第七个字段
-E 账号失效时间,第八个字段


chage -l test

# 置密码最后一次修改时间为0,强制修改密码
chage -d 0 test

userdel

删除用户

# 删除用户,此时家目录会变成没有归属用户和归属组的目录
userdel test
# 原来归属 test test,删除后test用户和test组均被删除,空留1001 1001
drwx------. 2   1001   1001  62 Jan 26 06:52 test

#删除用户及其家目录
userdel -r test

id

查看UID、初始组ID以及所属组ID(包括初始组和附加组)信息

id root
# uid=0(root) gid=0(root) groups=0(root)

su

用户身份切换

# 切换用户到root,但环境变量使用当前用户的
# 即使是root身份,但没有root环境变量也无法直接执行某些命令,如/sbin、/usr/sbin下的命令
su root

# 切换到root,且环境变量也使用root的
su - root

# 以root用户执行一条命令且最终回到当前用户
su - root -c "useradd test"

groupadd

创建用户组

group test
groupadd -g 1001 test

groupmod

修改用户组
通常并不会直接修改用户组组名,而是新建新的用户组,然后将旧用户组删除

# 将用户组test的GID改为1003
groupmod -g 1003 test
# 将用户组test更名为testrename
groupmod -n testrename test

groupdel

删除用户组

groupdel test

gpasswd

usermod可以修改用户的用户组,但该操作推荐使用gpasswd命令

# 将rest用户加入testgroup用户组
gpasswd -a test testgroup
# 将rest用户从testgroup用户组删除
gpasswd -d test testgroup


newgrp

改变有效组
用户在新建时会被指定一个初始组,此时初始组会作为有效组,用户在创建文件时,该文件的归属组即为该用户的有效组,若后续该用户加入若干附加组,使用附加组身份创建文件,使用newgrp即可切换有效组

# 切换当前用户的有效组为xxx
newgrp xxx

特殊权限

SetUID

ll /usr/bin/passwd 
# -rwsr-xr-x. 1 root root 27856 Mar 31  2020 /usr/bin/passwd
ll /etc/shadow
# ----------. 1 root root 1445 Jan 26 11:58 /etc/shadow

/usr/bin/passwd用户修改用户密码,其中属主权限为rws,其中s即为SetUID权限,使用passwd修改用户密码会修改/etc/shadow文件,而/etc/shadow文件无权限,仅root可操作,故从基本权限的角度而言,普通用户无法修改/etc/shadow文件也就无法修改密码。
SetUID权限表示已文件属主身份进行x操作,身份变化只存在于执行期间,开始执行时切换,执行完毕后恢复,对于passwd而言,即是以文件属主root身份执行从而修改/etc/shadow文件以实现密码修改

  • 仅针对二进制文件生效
  • SetUID权限设置在二进制文件的属主x权限位置上
  • 身份变化只存在于执行期间,开始执行时切换,执行完毕后恢复
  • 命令执行者需要对文件拥有执行权限

设置SetUID容易造成安全隐患,任何仅管理员可执行的文件设置SetUID均有风险,以及例如vim设置SetUID便可更改只有root才可更改的文件,可直接修改/etc/passwd等文件造成重大安全事故

SetGID

  • 针对文件和目录生效
  • SetGID权限设置在文件或目录的属组x权限位置上

对于文件

  • 只有可执行文件才可设置SetGID
  • 用户需要对该文件拥有x权限
  • 用户执行该命令期间,有效组切换为该文件属组
ll /usr/bin/locate
# -rwx--s--x. 1 root slocate 40520 Apr 10  2018 /usr/bin/locate
ll /var/lib/mlocate/mlocate.db
# -rw-r-----. 1 root slocate 781861 Jan 26 06:16 /var/lib/mlocate/mlocate.db

执行locate是需要访问/var/lib/mlocate/mlocate.db文件,/var/lib/mlocate/mlocate.db文件其他人无权限访问,locate命令具有SetGID权限,执行locate时普通用户有效组切换为slocate,此时可以访问/var/lib/mlocate/mlocate.db,成功执行locate。

对于目录

  • 目录均可设置SetGID
  • 用户需要对目录拥有r和x权限,w权限可选(有w权限在该目录下创建文件,文件均归属有效组)
  • 用户操作此目录时有效组切换为目录属组

Sticky BIt

粘着位

  • 只有目录才可设置Sticky Bit
  • Sticky Bit权限设置在目录的其他人x权限位置上
  • 用户需要对目录拥有w和x权限

限制其他人在目录中仅能删除自己的文件

ll -d /tmp
# drwxrwxrwt. 13 root root 4096 Jan 26 06:16 /tmp

若/tmp不设置Sticky BIt直接就是drwxrwxrwx,则student1在tmp中建立的文件可以被其他任何用户如student2删除,若使用Sticky BIt,则student1在tmp中新建的文件只能由student1删除,student2无法删除

设置特殊权限
通常,某一文件并不会具有所有特殊权限,因为每个特殊权限用于解决一个场景的问题,该文件不会应用于多个场景

# SetUID     4
# SetGID     2
# Sticky BIt 1
chmod 7777 testfile
# 第一位7表示满特殊权限,后三位表示满基础权限
# -rwsrwsrwt. 1 root root 0 Jan 26 14:16 testfile

# 特殊权限基于x权限,没有x权限而赋予特殊权限是没有意义的(小写反转变成大写,表示授予特殊权限但不生效)
chmod 7666 testfile
# -rwSrwSrwT. 1 root root 0 Jan 26 14:16 testfile

chattr

在文件系统层面修改文件属性,其限制高于rwx授权
对于root用户,不受rwx限制,但受到chattr限制
对于普通用户,chattr不允许的操作而rwx允许,无法进行该操作

# chattr [+-=] [选项] 文件或目录
# + - = 添加 删除 等于 某权限
# i 对于文件,不能删除、修改数据、添加数据以及修改文件名,对于目录,不能删除和新建文件,可以修改文件数据
# a 对于文件,不能删除文件和修改文件数据,仅能追加数据,对于目录,不能删除文件,仅能新建文件

openssl

openssl

https://www.openssl.org/source/

cd /usr/local/src
wget http://www.openssl.org/source/openssl-1.1.1v.tar.gz
tar -xzf openssl-1.1.1v.tar.gz
cd openssl-1.1.1v
./config --prefix=/usr/local/openssl
# Operating system: x86_64-whatever-linux2 You need Perl 5.
# 安装Perl5

make
make install


which openssl
# /usr/local/openssl/bin/openssl
# /usr/bin/which: no openssl in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

openssl version
# openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

找不到动态库libssl.so.1.1,在root用户下执行:
cp /usr/local/openssl/lib/libssl.so.1.1 /usr/local/lib64/
cp /usr/local/openssl/lib/libcrypto.so.1.1 /usr/local/lib64/
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

ldd /usr/local/openssl/bin/openssl
# linux-vdso.so.1 =>  (0x00007ffcce9b1000)
# libssl.so.1.1 => not found
# libcrypto.so.1.1 => not found
# libdl.so.2 => /lib64/libdl.so.2 (0x00007f600326c000)
# libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6003050000)
# libc.so.6 => /lib64/libc.so.6 (0x00007f6002c82000)
# /lib64/ld-linux-x86-64.so.2 (0x00007f6003470000)
3、尝试运行应该会出现下面的这个错误:

/usr/local/bin/openssl version/usr/local/bin/openssl: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

4、下面为相关的解决办法:

创建链接至libssl

ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/

5、创建链接至新的openssl

ln -s /usr/local/bin/openssl /usr/bin/openssl_latest

perl

Perl

cd /usr/local/src
wget https://www.cpan.org/src/5.0/perl-5.30.1.tar.gz
tar -xzf perl-5.30.1.tar.gz
cd perl-5.30.1
./Configure -des -Dprefix=$HOME/localperl
make
make test
make install

时间

https://www.cnblogs.com/williamjie/p/10768657.html

Linux系统有系统时间和硬件时间之分:

系统时间: 一般说来就是我们执行 date命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。

硬件时间:主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。

搭建一主两从的k8s集群,使用了vmware启动了三台虚拟机,因为经常涉及到虚拟机启停,发现虚拟机时间和真实时间有了一定误差,需要设置时间的自动同步。

查看时间

date

安装工具

yum install ntpdate

更新时间,立即更新时间,时间会跳变,开发环境用一用还行,生产禁用

ntpdate time.nist.gov

将该命令设置为定时任务,执行命令打开当前用户crontab任务文件

crontab -e

写入任务

*/10 * * * * /usr/sbin/ntpdate time.nist.gov  # 每十分钟同步一次时间
*/1 * * * * echo "hello world" >> /data/code.txt

保存即可生效

ntp服务地址,http://time.nist.gov

您在 /var/spool/mail/root 中有新邮件
whereis n
From root@vm-04.localdomain  Sat Jul 15 12:00:01 2023
Return-Path: <root@vm-04.localdomain>
X-Original-To: root
Delivered-To: root@vm-04.localdomain
Received: by vm-04.localdomain (Postfix, from userid 0)
	id 535E8689F8; Sat, 15 Jul 2023 12:00:01 +0800 (CST)
From: "(Cron Daemon)" <root@vm-04.localdomain>
To: root@vm-04.localdomain
Subject: Cron <root@vm-04> ntpdate time.nist.gov  # 每十分钟同步一次时间
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <XDG_SESSION_ID=89>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0>
X-Cron-Env: <LANG=zh_CN.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20230715040001.535E8689F8@vm-04.localdomain>
Date: Sat, 15 Jul 2023 12:00:01 +0800 (CST)

/bin/sh: ntpdate: 未找到命令
ntpd、ntpdate的区别
说在前面:ntp和ntpdate区别
①两个服务都是centos自带的(centos7中不自带ntp)。ntp的安装包名是ntp;ntpdate的安装包是ntpdate。他们并非由一个安装包提供。
②ntp守护进程为ntpd,配置文件是/etc/ntp.conf
③ntpdate用于客户端的时间矫正,非NTP服务器可以不启动NTP。

简介:ntp全名 network time protocol 。NTP服务器可以为其他主机提供时间校对服务。
下面是网上关于ntpd与ntpdate区别的相关资料。如下所示所示:
使用之前得弄清楚一个问题,ntpd与ntpdate在更新时间时有什么区别。ntpd不仅仅是时间同步服务器,它还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。
时钟的跃变,对于某些程序会导致很严重的问题。许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即,取得的时间是线性的,一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday(2)设置系统时间,这有几个非常明显的问题:
第一,这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。
第二,这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。
第三,这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。
NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。

注意点:
ntpdate time.ntp.org
但这样的同步,只是强制性的将系统时间设置为ntp服务器时间。如果cpu tick有问题,只是治标不治本。所以,一般配合cron命令,来进行定期同步设置。比如,在crontab中添加:
0 12 * * * * /usr/sbin/ntpdate 192.168.0.1
这样,会在每天的12点整,同步一次时间。ntp服务器为192.168.0.1。
使用ntpd服务,要好于ntpdate加cron的组合。因为,ntpdate同步时间,会造成时间的跳跃,对一些依赖时间的程序和服务会造成影响。比如sleep,timer等。而且,ntpd服务可以在修正时间的同时,修正cpu tick。理想的做法为,在开机的时候,使用ntpdate强制同步时间,在其他时候使用ntpd服务来同步时间。
要注意的是,ntpd有一个自我保护设置: 如果本机与上源时间相差太大, ntpd不运行. 所以新设置的时间服务器一定要先ntpdate从上源取得时间初值, 然后启动ntpd服务。ntpd服务运行后, 先是每64秒与上源服务器同步一次, 根据每次同步时测得的误差值经复杂计算逐步调整自己的时间, 随着误差减小, 逐步增加同步的间隔. 每次跳动, 都会重复这个调整的过程.

ntp配置

yum install ntp

crontab

crontab

crontab为Linux系统定时任务工具,由cron守护进程周期性执行任务,例如每天备份日志、定时重启服务、

# 打开当前用户的crontab文件
crontab -e

# 查看当前用户的crontab文件
crontab -l

任务配置格式为cron表达式+命令的形式

*/10 * * * * /usr/sbin/ntpdatntpdate time.nist.gov  # 每十分钟同步一次时间

crontab任务更新后无需重启服务,cron守护进程会自动更新

cron表达式

crontab的cron表达式格式为,分、时、日、月、周

分钟,0-59

小时,0-23

日,1-31

月,1-12

周,0-7,0和7都表示周日

星号(*),通配所有可能的值

逗号(,),枚举所有的值

中划线(-),闭区间指定值

斜杠(/),时间间隔

# 

cron表达式书写工具,https://crontab.guru/

网卡设置

修改网卡ip

ip a # 所有网卡

vim /etc/sysconfig/network-scripts/ifcfg-ens33
systemctl restart network # 系统服务,类似windows中的服务,Oracle服务
vi /etc/sysconfig/network-scripts/ifcfg-ens33

sed -i 's/BOOTPROTO="dhcp"/BOOTPROTO="static"/' /etc/sysconfig/network-scripts/ifcfg-ens33
echo "
IPADDR=192.168.1.103
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1
" >> /etc/sysconfig/network-scripts/ifcfg-ens33
cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="3ced2cd3-fc87-41f5-a18e-5237516ec911"
DEVICE="ens33"
ONBOOT="yes"
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="43292cad-e578-4bfd-ac7e-c996124488fb"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1

cat /etc/resolv.conf

systemctl restart network

服务管理

服务管理

systemctl start xxx.service
systemctl restart xxx.service
systemctl status xxx.service
systemctl stop xxx.service
# 启动开机自启
systemctl enable xxx.service
# 关闭开机自启
systemctl disable xxx.service
# 是否开机自启
systemctl is-enable xxx.service
# 已启动列表
systemctl list-unit-files | grep enabled
# 启动失败服务列表
systemctl --failed

防火墙

防火墙

# https://download.csdn.net/download/weixin_38543950/14048840

# 开启
systemctl start firewalld
# 状态
systemctl status firewalld
# 重启
systemctl restart firewalld
# 停止
systemctl stop firewalld
# 
systemctl disable firewalld



# 查询端口
fireall-cmd --list-ports
firewall-cmd --query-port=<port>/<tcp、udp>

# 开放端口
firewall-cmd --add-port=<port>/<tcp、udp> [--permanent]
firewall-cmd --add-port=3/tcp --permanent

firewall-cmd --help

firewall-cmd --state

# 更新防火墙规则
firewall-cmd --reload

# 

shell控制台任务

查看当前shell环境中所有running或stopped任务

任务可以是running、stopped、terminated,任务被kill后为terminated不会出现在jobs列表中

jobs
jobs -l # 显示PID

在前台执行任务,直接执行命令

sleep 3000

在后台执行任务,&执行命令

sleep 3000 &

挂起前台任务(前台任务挂起在后台,可以使用fg、bg继续执行)

<ctrl> z

结束前台任务执行

<ctrl> c

挂起后台任务(可以使用fg、bg继续执行)

在solaris中通过stop命令执行,通过jobs命令查看job号(假设为num),然后执行stop %num
在redhat中,不存在stop命令,可通过执行命令kill -stop PID,将进程挂起

结束后台任务执行

kill pid

杀掉当前某个后台任务,用 jobs 可以查看到当前任务的序号,如下图:要杀掉这个后台任务,只需要 kill 1 就行了

将任务放置到前台并执行

fg num # num默认为最后一个,即序号最大的一个

将任务放置到后台并执行

bg num # num默认为最后一个,即序号最大的一个

nohup

退出帐户/关闭终端之后继续运行相应的进程

tmux,终端复用器


ctrl+c强行中断当前程序的执行。
ctrl+d表示结束当前输入(即用户不再给当前程序发出指令),那么Linux通常将结束当前程序。
ctrl+z表示将当前前台运行的经常放在后台并挂起,如需其在后台继续运行,需用“bg 进程号”使其继续运行;再用"fg 进程号"可将后台进程前台化。
ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序。
ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程。
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。
ctrl-\ 发送 SIGQUIT 信号给前台进程组中的所有进程,终止前台进程并生成 core 文件。

watch 'date > d.log'
上述命令似乎不符合上述规律

lsattr

# 显示属性
lsattr test
# 显示所有文件和目录的属性
lsattr -a test
# 若为目录,则仅显示目录本身的属性
lsattr -d test

解决方案篇

查看日志

不推荐使用vim直接打开,vim会将整个文件加载至内存,以下工具不会

根据关键词grep直接查出内容,或者定位起始日志后在由less细查

tail  -n  10   test.log | grep "asdadds"
head   -n  10   test.log | grep "asdadds"
cat test.log | grep "sdads"

less

cat

配合流使用更加强大

cat file.txt # 显示整个文件

tail

tail file.txt # 显示文件末尾10行
tail -n 100 file.txt # 显示文件末尾100行
tail -f file.txt # 追踪文件

more

而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。

2、命令功能
more命令和cat的功能一样都是查看文件里的内容,但有所不同的是more可以按页来查看文件的内容,还支持直接跳转行等功能。

3、常用参数列表
     -num  一次显示的行数
     -d    在每屏的底部显示友好的提示信息
     -l    忽略 Ctrl+l (换页符)。如果没有给出这个选项,则more命令在显示了一个包含有 Ctrl+l 字符的行后将暂停显示,并等待接收命令。
     -f     计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
     -p     显示下一屏之前先清屏。
     -c    从顶部清屏然后显示。
     -s    文件中连续的空白行压缩成一个空白行显示。
     -u    不显示下划线
     +/    先搜索字符串,然后从字符串之后显示
     +num  从第num行开始显示

less

命令

less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
1.命令格式:
less [参数] 文件
2.命令功能:
less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。
3.命令参数:
-b <缓冲区大小> 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件

OS级别包管理工具

MacOS下的软件包管理工具

Homebrew

创建软链接并添加至/usr/bin可以全系统执行命令

  1. 平时在Linux机子上安装好一些工具之后我们就需要跑到那个源码安装的程序包里面执行启动命令,这样做比较麻烦,有没有直接在全局都通用的方法呢?也就是启动那些应用或者程序就像使用Linux自带的命令一样简单轻松而不必每次都跑到指定的源码目录中去执行。
  2. 查看需要放置在全局的应用在其源码包目录下的启动指令,并将其通过软连接的方式链接到/usr/bin/目录下,具体如下所示(下方示意的redis-server的启动命令,redis-cli或者其他类似的源码包启动指令调整为全局指令也是换汤不换药):
sudo ln -s /home/alexander/snap/redis-6.0.6/src/redis-server /usr/bin/redis-server

hostname命名规则

hostname命名,大小写字母、中划线-、点.、数字

https://blog.csdn.net/weixin_42688255/article/details/104692640

接口请求工具

ctrl

https://curl.se/

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。

它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。

不带有任何参数时,curl 就是发出 GET 请求。
curl

前端请求就是请求一个资源,指文件,但是不同客户端发起的请求响应后会进行不同程度的处理,例如浏览器、爬虫、curl都可以发起请求,但是处理的程度是不一样的,例如

 curl https://baidu.com
 
 <html>
 <head><title>301 Moved Permanently</title></head>
 <body>
 <center><h1>301 Moved Permanently</h1></center>
 <hr><center>nginx</center>
 </body>
 </html>
 curl https://www.baidu.com
 会真正返回内容
 curl -L https://baidu.com
 也会返回内容,因为允许自动重定向
telnet

telnet 命令用于登录远程主机,是基于 Telnet 协议的远程登录程序,对远程主机进行管理

它还可用于检查某些端口的可用性或通过直接从服务器发送电子邮件来检测电子邮件服务器(SMTP,端口 25)

Telnet协议是一种最早的internet应用,telnet协议提供了一种通过终端远程登录到服务器的方式,呈现一个交互式操作界面,用户可以先登录到一台主机,然后再通过telnet的方式远程登录到网络上的其他主机上,而不需要为每一台主机都连接一个硬件终端,然后对设备进行配置和管理。

linux下telnet交互命令输入错误使用ctrl+backspace组合按键可以删除

centos安装telnet

yum install telnet -y

windows安装telnet

控制面板->程序与功能->启用或关闭Windows功能->Telnet客户端

sudo

username ALL=(ALL:ALL) NOPASSWD:ALL
在这里插入图片描述

对于其他Linux系统来说,一般在安装过程就设定root密码,这样用 户就能用它登录root帐户或使用su命令转换到超级用户身份。

与之相反,Ubuntu默认安装时,并没有给root用户设置口令,也没有启用root帐 户

su切换root用户,su root不改变用户目录,非登录式切换,su -l root改变用户目录,登陆式切换

sudo指令

-功能: 以root的身分执行命令
-语法: sudo 其他指令
-用户: 被root加入『/etc/sudoers』文件中的用户

1.root的密码除了root本人知道外,不需被其他需要用到root权限用户知道,因为使用sudo时,要求输入的密码是『该位用户自己的密码』。

2.把所有可执行sudo指令的用户都规范在『/etc/sudoers』这个文件中,root可以很容易地掌控整个系统。

执行sudo su -成root的用户,和root用户的区别:

普通用户使用sudo 来执行只有root才能执行权限的命令,跟用root用户执行是不一样的,因为这时候他用的还是普通用户的环境变量。

用su -成root的用户还是有些环境变量是和root登陆是不一样的。另外,它们的uid也是不一样,只有euid是相同的。
root用户只是被用来管理和维护系统之用;比如系统日志的查看、清理,用户的添加和删除…

# 查看授权命令
sudo -l

/etc/sudoers

## sudoer允许特定用户以root用户身份执行各种命令,且无需root用户的密码
##
## 文件底部提供了相关命令,其会被授权给特定用户
##
## 本文件必须使用visudo命令编辑

## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem


## Command Aliases
## These are groups of related commands...

## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

## Services
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable

## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Delegating permissions
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

## Processes
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

#
# Refuse to run if unable to disable echo on the tty.
#
Defaults   !visiblepw

#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults    always_set_home
Defaults    match_group_by_gid

# Prior to version 1.8.15, groups listed in sudoers that were not
# found in the system group database were passed to the group
# plugin, if any. Starting with 1.8.15, only groups of the form
# %:group are resolved via the group plugin by default.
# We enable always_query_group_plugin to restore old behavior.
# Disable this option for new behavior.
Defaults    always_query_group_plugin

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults   env_keep += "HOME"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

## 某用户或某用户组可以在某机器上执行某命令(sudoers文件可以在多个系统间共享)
## 用户或用户组 机器=(身份) 逗号分隔的命令列表
## 用户或用户组:表示给指定的用户或者用户组授权,用户组前需要添加%
## 机器:用户可以用指定的命令管理指定ip地址的服务器,若设置为ALL,则表示root授权某用户管理任何主机,写本机ip,则表示root授权指定用户管理本机
## 身份:即将来源用户切换为什么身份执行,默认为任意身份ALL,通常省略该字段直接使用默认值
## 命令列表:表示将什么命令授权给该用户,默认为所有命令ALL,不使用默认值而指定具体命令


## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## 授权wheel用户组中的用户执行所有命令
%wheel  ALL=(ALL)       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## 授权users用户组中的用户以root身份对cdrom执行mount和unmount
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

# 授权users用户组中的用户关机
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

sudo的误区

  • 授权命令没有细化到命令的选项和参数
  • 认为只能授权管理员执行的命令

例子,授权用户test管理Apache服务器

  • 可以使用Apache管理脚本
  • 可以修改Apache配置文件
  • 可以更新网页内容
# visudo授权执行服务器相关命令
# test 192.138.1.156=/etc/rc.d/init.d/httpd reload, /etc/rc.d/init.d/httpd configtest

# visudo授权执行修改服务器配置命令
# test 192.138.1.156=/bin/vi /etc/httpd/conf/httpd.conf

# 将网页存放目录/var/www/html授权给test

文本操作

sed
为了保留被替换文本的"/",有两种方法

例:假如要将文件中的“oracle”替换为“/etc/oracle”

       则使用:sed -i 's/oracle//etc/oracle/g'  ,这样会报错

解决方法:

在被替换文本中使用转义符号  
sed -i 's/oracle/\/etc\/oracle/g'
使用#代替/作为sed中替换与被替换字符的分割符:
sed -i 's#oracle#/etc/oracle#g'
grep

grep

global regular expression,全局正则表达式

匹配文本,若不指定文件名或者指定文件名为-grep从标准输入设备读取数据进行正则匹配

ls | grep Documents:grep处理管道传过来的内容

grep [options] pattern [files]
或
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
-i、--ignore-case 匹配时忽略大小写
-v、--invert-match 反向匹配,匹配不满足正则表达式的文本
-n、--line-number 显示匹配文本的行号
-l、--file-with-matches 仅打印包含匹配内容文件的文件名
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-c、--count 仅打印包含匹配内容行的总数
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。

-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用
-F 或 --fixed-regexp : 将样式视为固定字符串的列表
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。

-V 或 --version : 显示版本信息。
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-q 或 --quiet或--silent : 不显示任何信息。



!
https://www.runoob.com/linux/linux-comm-grep.html
https://cloud.tencent.com/developer/article/1554542

Linux软件安装

usr,Unix Software Resource,Unix软件资源

关于软件安装

代码位置:/usr/local/[软件名]/[软件版本]/
PID位置:/usr/local/[软件名]/[软件版本]/conf/[软件名].pid 或者 /var/run/[软件名]-[版本号].pid
日志位置: /var/log/[软件名]/[软件版本]/

位置对标

/usr C:/Windows/ 系统级目录
/usr/lib C:/Windows/System32/
/usr/local C:/Progrem Files/ 用户级目录 用户编译软件默认安装目录

用户编译软件默认安装位置,即不是通过apt-get、yum(默认安装路径/usr)等安装的软件,和/usr目录具有相类似的目录结构
让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面

/opt D:/Software/ 用户级目录
/usr/src 系统级源码目录
/usr/local/src 用户级源码目录

用户可执行文件:/bin、/usr/bin、/usr/local/bin
系统可执行文件:/sbin、/usr/sbin、/usr/local/sbin

应当尽可能掌握第一级别、第二级别的可执行文件,尤其是第一级别

定时清理文件

linux tmp文件夹文件自动清理

tmpwatch

sudo yum install -y tmpwatch
# 创建定时任务,每天上午10点清空/tmp目录中15天前的文件
crontab -e
# 0 10 * * * /usr/sbin/tmpwatch 15d /tmp

查看系统信息

查看版本信息

lsb_release -a

lscpu

hostname

cat /proc/version

uname -a

watch 是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样, watch 可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。 在Linux下, watch 是周期性的执行下个程序,并全屏显示执行结果。 你可以拿他来监测你想要的一切命令的结果变化,比如 tail 一个 log 文件, ls 监测某个文件的大小变化 -n 或 --interval watch缺省每2秒运行一下程序,可以用-n或-interval来指定间隔的时间。

文本处理

/dev/null

/dev/null

cat /dev/null > messages

可以把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到

输入输出重定向

EOF,end of file,表示文本结束符

大于号:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等)

小于号:命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入

  1. >:表示输出重定向。将命令的标准输出重定向到指定文件,如果文件存在则覆盖其内容,如果文件不存在则创建新文件。示例:

    bashCopy code
    command > output.txt
    
  2. >>:也表示输出重定向,但是与>不同的是,它将命令的标准输出追加到指定文件的末尾,而不是覆盖文件内容。如果文件不存在则创建新文件。示例:

    bashCopy code
    command >> output.txt
    
  3. <:表示输入重定向。将文件的内容作为命令的标准输入。示例:

    bashCopy code
    command < input.txt
    
  4. <<:表示输入重定向,但与<不同,它用于创建文本块(here documents)。允许在脚本中直接指定多行输入。示例:

    bashCopy codecommand << EOF
    This is
    a multiline
    input
    EOF
    

cat命令用户在控制台输出内容,可以从文件也可以从标准输入

[centos@yc-cn-centos-abc ~]$ cat test.txt 
1
[centos@yc-cn-centos-abc ~]$ cat  # 第一个1是从键盘的输入,第二个1是cat的输出结果
1
1

几个示例

cat > test.txt

[centos@yc-cn-centos-abc ~]$ cat > test.txt 
1
2
3
[centos@yc-cn-centos-abc ~]$ cat test.txt 
1
2
3
# 两者在结果上没有区别
# 都是输入重定向到 << EOF,都是输出重定向到 > test.txt
cat << EOF > test.txt
cat > test.txt << EOF

# 而 << EOF为上述第四种用法,从控制台多行输入,且需要以EOF结尾,通常会使用EOF,使用其他任何字符串均可以,使用快捷键ctrl d表示结束有相同效果,但会收到警告
-bash: warning: here-document at line 114 delimited by end-of-file (wanted `EOF')
cat << test.txt > test.txt
# << test.txt 输入重定向为控制台 且以自定义字符串test.txt表示结束
# > test.txt 输出重定向到test.txt

[centos@yc-cn-centos-abc ~]$ cat << test.txt > test.txt
> 1
> 2
> 3
> test.txtt
> test.txt
[centos@yc-cn-centos-abc ~]$ cat test.txt 
1
2
3
test.txtt

grep sed awk

https://www.cnblogs.com/along21/p/10366886.html

  1. grep 命令,擅长查找文本,正向查找,反向查找,正则查找,多文件查找,递归查找
  2. sed(全称:Stream Editor),擅长修改文本,非常高效
  3. awk 更适合格式化文本,对文本进行较复杂格式处理,awk 程序对输入文件的每一行进行操作。awk 是一门解释型的编程语言。文本处理、输出格式化的文本报表、执行算数运算、执行字符串操作等等。
grep
sed

https://blog.csdn.net/L1259863243/article/details/79364094

sed替换字符串第二部分不能使用正则表达式,很简单,如果匹配到多个结果怎么办,没有实用价值和应用场景

sed中使用正则表达式进行替换的时候,一定要注意,有些特殊字符在使用时要转义:

用于分组的小括号:(),在使用时要用\进行转义,但是匹配字符串中真正的小括号时,无需转义;
表示前面的表达式出现次数的{},也要转义;
表示前面的表达式出现1次或多次的+,也要转义,在使用时,要用+
表示前面的表达式至多出现1次?,也要转义,在使用时,要用?

sed -i '$a\thank you' test.txt

其他

tee命令

文本文件统计

wc --help

we -l

文本去重

cat xx | sort | uniq

缺点是文本顺序会乱

uniq用来去除文本文件中连续的重复行,中间不能夹杂其他文本行

磁盘管理

磁盘管理

  1. 在vmware中添加更多磁盘空间

  2. 在虚拟机中对分区进行重新设定

    /dev/sda # dev中都是抽象的设备文件
    fdisk -l
    df -h
    
    一种对固定挂载点扩充的方法,如/
    dfisk /dev/sda
    删除/所挂载分区,并重新创建该分区,名称一样就不需要重新挂载,注意删除时不写入磁盘,重新创建后再写入磁盘
    
    修改保存后需要使得修改生效,postpr,有一个提示的命令
    
    随后需要在文件系统中进行扩充
    xfs_growfs /dev/sda3
    df -h
    
    第二种方法
    逻辑卷
    物理卷
    卷组
    物理卷作为实际存储
    逻辑卷负责整体管理
    使用卷组的方式进行管理
    vg,卷组命令
    pv,物理卷命令
    lv,虚拟卷命令
    
    

mkfs.ext3 /dev/sdb --格式化磁盘为ext3文件系统

partprobe

重读分区表,可以不重启系统添加新的磁盘分区

-d:不更新内核;
-s:显示摘要和分区;
-h:显示帮助信息;
-v:显示版本信息。

https://blog.csdn.net/weixin_42874602/article/details/111560293

#计算当前文件夹的总磁盘占用量, -s选项表示计算总和, -h选项表示以恰当的K/M/G单位展示
[roc@roclinux ruanjian]$ du -sh .
51M

用 --max-depth 选项控制深度

tmux

tmux
session - windows - panel

创建会话test
tmux new -s test

列出会话
tmux list-session
tmux ls

进入会话
tmux a

杀死会话
tmux kill-session -t test

pid文件

tmux快捷键

https://zhuanlan.zhihu.com/p/137715607

tmux窗口出现很多省略号导致窗口可用区域变小

由于多个连接使用了同一会话且不同连接可用区域不同,导致所有链接变成了最小的哪个,ctrl+b shift d关闭其他连接即可

文件描述符

Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件

文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误

# 1表示stdout标准输出
# 2表示stderr标准错误
echo log > /dev/null 2 > &1
# 将日志文件重定向到空设备,将标准错误重定向同1,也即空设备

文件描述符

[root@yc-cn-centos-abc ~]# pidof vi
3992
[root@yc-cn-centos-abc ~]# ll /proc/3992/f
ls: cannot access /proc/3992/f: No such file or directory
[root@yc-cn-centos-abc ~]# ll /proc/3992/fd
total 0
lrwx------. 1 root root 64 Jan 27 04:17 0 -> /dev/pts/0
lrwx------. 1 root root 64 Jan 27 04:17 1 -> /dev/pts/0
lrwx------. 1 root root 64 Jan 27 04:17 2 -> /dev/pts/0

文件描述符有着数量限制

系统限制

cat /proc/sys/fs/file-max

进程限制

ulimit -n

vim

vi 和vim 的区别
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。

vim的这些优势主要体现在以下几个方面:
1、多级撤消
我们知道在vi里,按 u只能撤消上次命令,而在vim里可以无限制的撤消。

2、易用性

vi只能运行于unix中,而vim不仅可以运行于unix,windows ,mac等多操作平台。

3、语法加亮
vim可以用不同的颜色来加亮你的代码。

4、可视化操作
就是说vim不仅可以在终端运行,也可以运行于x window、 mac os、 windows。

5、对vi的完全兼容
某些情况下,你可以把vim当成vi来使用。

vi和vim都是Linux中的编辑器,不同的是vim比较高级,可以视为vi的升级版本。vi使用于文本编辑,但是vim更适用于coding。

vi有3个模式:插入模式、命令模式、低行模式。

插入模式:在此模式下可以输入字符,按ESC将回到命令模式。
命令模式:可以移动光标、删除字符等。
低行模式:可以保存文件、退出vi、设置vi、查找等功能(低行模式也可以看作是命令模式里的)。

# vim跳转
:1 # s
:$ # 

vim清空文件所有内容

在命令模式下,首先执行

gg

这里是跳至文件首行,如果在首行了直接输入以下即可

再执行:

dG

vi设置高亮搜索

# 临时
# vim打开文档-->命令行形式输入set hlsearch

# 永久
# 在~/.vimrc中配置set hlsearch
echo "set hlsearch" >> ~/.vimrc

linux vim打开文档搜索字符串时,设置被搜索到字符串高亮显示。
有两种方法:
1、临时设置:vim打开文档–>命令行形式输入set hlsearch。
缺点:关闭文档后,下次打开,又需要重新设置一遍。

2、永久设置(推荐):在~/.vimrc中配制
vim ~/.vimrc
在文件中加上set hlsearch
然后保存退出便可。
优点:一次设置,永久生效。

# 命令模式下 gg		
# 跳至文件首行 dG		
# 删除光标所在行到末尾行内容,d删除,G跳转到文件末尾行

其他

Linux下的SELinux

通过setenforce 0命令禁用SELinux,来减少产生的权限问题,但是这并不是一个良好的习惯。

Linux下默认的接入控制是DAC,其特点是资源的拥有者可以对他进行任何操作(读、写、执行)。当一个进程准备操作资源时,Linux内核会比较进程和资源的UID和GID,如果权限允许,就可以进行相应的操作。此种方式往往会带来一些问题,如果一个进程是以root的身份运行,也就意味着他能够对系统的任何资源进行操作,而且不被限制。 假如我们的软件存在漏洞呢?这个往往是一个灾难性的问题。因此,就引出了另外的一种安全接入控制机制MAC,Linux下的一种现实是SELinux,也就是我们将要讨论的内容。

SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。

磁盘管理

Linux中将一块新硬盘安装到机器上后需要经过分区、格式化、指定设备文件名以及挂载四个步骤才能用于文件存储等应有功能。

分区

分区的目的是将一个硬盘分成不同区域。每个区域用于不同用途。
主分区、扩展分区、逻辑分区

格式化

格式化的目的是写入文件系统,写入文件系统后才可以存储文件。

指定设备文件名

Linux中一切皆文件,硬件也被抽象为文件。

挂载

为格式化后的分区分配一个名称以组织和访问文件,或者说将格式化后的分区挂载到某个位置,该名称或该位置称之为挂载点。
Windows中在新硬盘上新建卷时,默认会分配盘符,如C、D等字母,也可以指定分配到某个目录下。Linux中没有盘符,直接分配到目录。
Linux中必须的两个分区,根分区/和虚拟内存分区/swap。
并非所有目录都可单独挂载分区,/etc、/bin、/dev、/lib、/sbin必须在根分区中。

逻辑卷管理LVM、磁盘阵列RAID

超级块中记录包括inode和data block在内的文件系统信息,inode中记录文件的权限、属主、属组、大小等属性,数据块中记录文件实质内容。

  • super block(超级块):记录整个文件系统的信息,包括block与inode的总量、已经使用的inode和block的数量、未使用的inode和block的数量、block与inode的大小、文件系统的挂载时间、最近一次的写入时间、最近一次的磁盘检验时间等。

  • data block(数据块):用来实际保存数据,block的大小(1KB、2KB或4KB)和数量在格式化后就已经决定,不能改变,除非重新格式化。每个block只能保存一个文件的数据,如果文件数据小于一个block块,那么这个block的剩余空间不能被其他文件使用;如果文件数据大于一个block块,则要占用多个block块。Windows中磁盘碎片整理工具的原理就是把一个文件占用的多个block块尽量整理到一起,这样可以加快读/写速度。

  • inode(i节点):用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的block编号。每个文件需要占用一个inode。

文件名并非保存在inode中,而是属于父目录的数据,保存在父目录的数据块中,故有父目录的w权限才可删除目录中的文件。

df

查看已挂载分区的信息

# -a 显示所有已挂载分区,包括特殊文件系统
# -h 采用人类友好方式的文件大小表示
# -T 挂载分区的文件系统类型
df
# Filesystem              Type      Size  Used Avail Use% Mounted on
# devtmpfs                devtmpfs  898M     0  898M   0% /dev
# tmpfs                   tmpfs     910M     0  910M   0% /dev/shm
# tmpfs                   tmpfs     910M  9.6M  901M   2% /run
# tmpfs                   tmpfs     910M     0  910M   0% /sys/fs/cgroup
# /dev/mapper/centos-root xfs        50G  1.7G   49G   4% /
# /dev/mapper/centos-home xfs       147G   33M  147G   1% /home
# /dev/sda1               xfs      1014M  152M  863M  15% /boot
# tmpfs                   tmpfs     182M     0  182M   0% /run/user/1000

du

# 查看该目录下所有子文件和子目录的磁盘占用大小
du -a
# 人类友好文件大小显示方式
du -h
# 仅显示该目录总占用的磁盘大小
du -s

添加硬盘

对于物理机器,需要先关闭电源然后将新硬盘安装至主机。
对于虚拟机,只需要在软件层面上“安装硬盘”。
虚拟机添加硬盘,以VMware为例。

首先关闭虚拟机电源,然后按步骤添加硬盘。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

分区

使用lsblk看一眼块设备,可见sdb 8:16 0 20G 0 disk 20G磁盘sdb。

[root@yc-cn-centos-abc ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  200G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0  199G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0  147G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
sr0              11:0    1  988M  0 rom  

使用fdisk对磁盘/dev/sdb进行分区,会进入fdisk的交互界面。

  • p用于打印磁盘分区信息
  • n用于创建分区,p表示主分区,e表示扩展分区,l表示逻辑分区
  • w用于保存分区结果,只有保存后分区才会生效,不保存不生效

磁盘sdb被分为一个主分区sdb1和一个扩展分区sdb2,其中sdb2又分为sdb5、sdb6、sdb7三个逻辑分区。

[root@yc-cn-centos-abc ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x977323dc.

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x977323dc

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +10G         
Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x977323dc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e
Partition number (2-4, default 2): 2
First sector (20973568-41943039, default 20973568): 
Using default value 20973568
Last sector, +sectors or +size{K,M,G} (20973568-41943039, default 41943039): 
Using default value 41943039
Partition 2 of type Extended and of size 10 GiB is set

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x977323dc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux
/dev/sdb2        20973568    41943039    10484736    5  Extended

Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (20975616-41943039, default 20975616): 
Using default value 20975616
Last sector, +sectors or +size{K,M,G} (20975616-41943039, default 41943039): +3G
Partition 5 of type Linux and of size 3 GiB is set

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x977323dc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux
/dev/sdb2        20973568    41943039    10484736    5  Extended
/dev/sdb5        20975616    27267071     3145728   83  Linux

Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 6
First sector (27269120-41943039, default 27269120): 
Using default value 27269120
Last sector, +sectors or +size{K,M,G} (27269120-41943039, default 41943039): +3G
Partition 6 of type Linux and of size 3 GiB is set

Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 7
First sector (33562624-41943039, default 33562624): 
Using default value 33562624
Last sector, +sectors or +size{K,M,G} (33562624-41943039, default 41943039): 
Using default value 41943039
Partition 7 of type Linux and of size 4 GiB is set

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x977323dc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux
/dev/sdb2        20973568    41943039    10484736    5  Extended
/dev/sdb5        20975616    27267071     3145728   83  Linux
/dev/sdb6        27269120    33560575     3145728   83  Linux
/dev/sdb7        33562624    41943039     4190208   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

查看磁盘列表

[root@yc-cn-centos-abc ~]# fdisk -l

Disk /dev/sda: 214.7 GB, 214748364800 bytes, 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000c2dd3

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200   419430399   208665600   8e  Linux LVM

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x977323dc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux
/dev/sdb2        20973568    41943039    10484736    5  Extended
/dev/sdb5        20975616    27267071     3145728   83  Linux
/dev/sdb6        27269120    33560575     3145728   83  Linux
/dev/sdb7        33562624    41943039     4190208   83  Linux

Disk /dev/mapper/centos-root: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-home: 157.8 GB, 157831659520 bytes, 308264960 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

查看块设备列表

[root@yc-cn-centos-abc ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  200G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0  199G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0  147G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
├─sdb1            8:17   0   10G  0 part 
├─sdb2            8:18   0    1K  0 part 
├─sdb5            8:21   0    3G  0 part 
├─sdb6            8:22   0    3G  0 part 
└─sdb7            8:23   0    4G  0 part 
sr0              11:0    1  988M  0 rom  

查看设备文件

[root@yc-cn-centos-abc ~]# ls /dev/sdb* -l
brw-rw----. 1 root disk 8, 16 Jan 30 06:26 /dev/sdb
brw-rw----. 1 root disk 8, 17 Jan 30 06:26 /dev/sdb1
brw-rw----. 1 root disk 8, 18 Jan 30 06:26 /dev/sdb2
brw-rw----. 1 root disk 8, 21 Jan 30 06:26 /dev/sdb5
brw-rw----. 1 root disk 8, 22 Jan 30 06:26 /dev/sdb6
brw-rw----. 1 root disk 8, 23 Jan 30 06:26 /dev/sdb7

格式化

分区之后需要格式化以写入文件系统。文件系统的作用在于妥善管理文件,好比于一个快递柜,快递柜设备通常会分为大中小三种不同的格子来存放不同体积的快递,同时对格子进行有序编号使得可以快速找到快递所在,也提供了身份验证保证只有物主或者得到物主授权的人才可取件,试想,一个快递柜不分格子而是所有人共用一个大柜子,大大小小的快递堆在一起,既不利于翻找快递还不安全。

[root@yc-cn-centos-abc ~]# mkfs -t ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

逻辑分区无法格式化

[root@yc-cn-centos-abc ~]# mkfs -t ext4 /dev/sdb2
mke2fs 1.42.9 (28-Dec-2013)
mkfs.ext4: inode_size (128) * inodes_count (0) too big for a
        filesystem with 0 blocks, specify higher inode_ratio (-i)
        or lower inode count (-N).

mke2fs支持更多参数

  • t 文件系统类型
  • b 块大小
  • L 卷标,文件系统标签
[root@yc-cn-centos-abc ~]# mke2fs -t ext4 -b 2048 -L C /dev/sdb5
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=C
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks
196608 inodes, 1572864 blocks
78643 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=270008320
96 block groups
16384 blocks per group, 16384 fragments per group
2048 inodes per group
Superblock backups stored on blocks: 
        16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816, 1327104

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

挂载

例如将/dev/sdb1挂载到/picture用以存储图片

创建挂载点

挂载点是目录,且原则上应使用空目录作为挂载点。若使用非空目录为挂载点,那么挂载后,该目录指向新磁盘位置,原来的文件还存在原磁盘中,但此时文件系统无法索引到原磁盘该目录也就无法访问原来的文件,同理,新文件也不会写到原磁盘而是到新磁盘。

mkdir /picture
挂载设备

Linux中的设备都需要挂载到挂载点后才可使用,包括硬盘、U盘、光盘。

mount /dev/sdb1 /picture
[root@yc-cn-centos-abc picture]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  200G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0  199G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0  147G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
├─sdb1            8:17   0   10G  0 part /picture
├─sdb2            8:18   0    1K  0 part 
├─sdb5            8:21   0    3G  0 part 
├─sdb6            8:22   0    3G  0 part 
└─sdb7            8:23   0    4G  0 part 
sr0              11:0    1  988M  0 rom  

查看所有挂载

[root@yc-cn-centos-abc picture]# mount -l
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=919440k,nr_inodes=229860,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuacct,cpu)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_prio,net_cls)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=22,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=13697)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=186300k,mode=700)
/dev/sdb1 on /picture type ext4 (rw,relatime,seclabel,data=ordered)

若要挂载光盘

# 通常创建挂载点//mnt/cdrom
mkdir /mnt/cdrom
# 挂载,光盘设备文件名固定
mount -t iso9660 /dev/cdrom /mnt/cdrom

/dev/cdrom是软连接实质是/dev/sr0

[root@yc-cn-centos-abc picture]# ls -l /dev/cdrom 
lrwxrwxrwx. 1 root root 3 Jan 29 20:36 /dev/cdrom -> sr0
[root@yc-cn-centos-abc picture]# ls -l /dev/sr0 
brw-rw----. 1 root cdrom 11, 0 Jan 29 20:36 /dev/sr0

若要挂载U盘
U盘挂载步骤同理,不同于光盘,U盘设备文件名在插入设备后由系统自动分配,需要查找一番以确认设备文件,U盘使用的文件系统可能Linux不支持,通常发生在U盘由Windows系统格式化为NTFS然后在Linux使用的情形,以及若U盘使用的编码方式与Linux默认编码方式不一致会乱码,挂载时需指定编码方式。

卸载
通常,磁盘会长久使用而不必卸载,而光盘和U盘在使用完毕后需要卸载。

# umount 设备文件或者挂载点
# 注意,当处于挂载点目录中时无法卸载设备,过河拆桥不能在桥上就开始拆
umount /mnt/cdrom
umount /dev/cdrom

若磁盘损坏,可尝试自动修复

fsck -y /devsdb1

查看磁盘信息

dumpe2fs /dev/sdb1
自动挂载

磁盘必然是开机即用,故磁盘通常需要设置开机自动挂载。

# 打开配置文件,其中每一行都是一个挂载的磁盘
vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Jan 12 23:08:23 2024
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=9b714c53-b661-4952-a690-46efd6f33eed /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
  • 分区设备文件名或设备UUID,UUID可以通过dumpe2fs查看
  • 挂载点
  • 文件系统类型
  • 挂载参数
  • dump备份,0表示不备份,1表示每天备份,2表示不定期备份
  • fsck检测,0表示不检测,其他正整数表示优先级,值越小优先级越高
[root@yc-cn-centos-abc picture]# dumpe2fs /dev/sdb1 | grep UUID
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem UUID:          2f4229b1-1b08-4e23-a2c3-554a67128a2f
[root@yc-cn-centos-abc picture]# dumpe2fs /dev/sdb5 | grep UUID
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem UUID:          0178618d-b969-4053-94a7-a413ab21ce97
2f4229b1-1b08-4e23-a2c3-554a67128a2f /picture                    ext4    defaults        0 0
fstab配置错误后重启报错

在这里插入图片描述
进入紧急模式,以root身份登录修复即可,例如:

# 错误写法
2f4229b1-1b08-4e23-a2c3-554a67128a2f /picture                    ext4    defaults        0 0
# 正确写法,有UUID=
UUID=2f4229b1-1b08-4e23-a2c3-554a67128a2f /picture                    ext4    defaults        0 0

改完后重启即可

parted

MBR与GPT

MBR最大支持2TB分区,最多支持4个主分区,或者三个主分区和一个扩展分区。
GPT最大支持18EB分区(1 EB = 1024 PB = 1024 * 1024 TB),最多支持128个分区,其中一个系统保留分区,127个用户自定义分区。

fdisk不支持GPT,parted工具可以分区和格式化,但只能格式化写入ext2文件系统,通常使用parted分区,使用mkfs格式化。

特殊分区swap

swap分区在安装系统时已经建立,可以使用fdisk和parted进行分区,需要使用mkswap进行格式化,使用swapon将该分区与原有swap合并,使用swapoff将该分区卸载,自动挂载同样使用/etc/fstab。

[root@yc-cn-centos-abc ~]# mkswap /dev/sdb6
Setting up swapspace version 1, size = 3145724 KiB
no label, UUID=95dd23f7-0ae6-4ee3-ade9-911318f992cd
[root@yc-cn-centos-abc ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1862968      145532     1541348        9768      176088     1563612
Swap:       2097148           0     2097148
[root@yc-cn-centos-abc ~]# swapon /dev/sdb6
[root@yc-cn-centos-abc ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1862968      147968     1538908        9768      176092     1561176
Swap:       5242872           0     5242872
[root@yc-cn-centos-abc ~]# swapoff /dev/sdb6
[root@yc-cn-centos-abc ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1862968      147356     1539524        9768      176088     1561788
Swap:       2097148           0     2097148
  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为你提供Linux下SQLite的安装和使用的步骤。 1. 安装SQLite 在终端中输入以下命令进行安装: ``` sudo apt-get update sudo apt-get install sqlite3 ``` 2. 创建数据库 在终端中输入以下命令来创建一个新的数据库: ``` sqlite3 example.db ``` 这将创建一个名为example.db的数据库文件。 3. 创建表格 在SQLite中,表格是通过CREATE TABLE语句创建的。例如,以下命令将创建一个名为“customers”的表格: ``` CREATE TABLE customers ( id INTEGER PRIMARY KEY, name TEXT, email TEXT ); ``` 这将创建一个包含id、name和email列的表格。 4. 插入数据 使用INSERT语句向表格中插入数据。例如,以下命令将向“customers”表格中插入一条记录: ``` INSERT INTO customers (name, email) VALUES ('John Doe', 'johndoe@example.com'); ``` 5. 查询数据 使用SELECT语句从表格中查询数据。例如,以下命令将从“customers”表格中选择所有记录: ``` SELECT * FROM customers; ``` 这将返回所有列和行的结果。 6. 更新数据 使用UPDATE语句更新现有的记录。例如,以下命令将将具有id = 1的“customers”表格中的名称更改为“Jane Doe”: ``` UPDATE customers SET name = 'Jane Doe' WHERE id = 1; ``` 7. 删除数据 使用DELETE语句删除现有的记录。例如,以下命令将从“customers”表格中删除具有id = 1的记录: ``` DELETE FROM customers WHERE id = 1; ``` 这就是在Linux下安装和使用SQLite的基本步骤。希望这个教程对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值