【操作系统】linux系统操作 - hippowc/hippowc.github.io GitHub Wiki

文件系统

系统标准目录

  • bin:存放大多数系统命令,如cat、mkdir、mv、dir等
  • boot:存放开机所需文件,开机时载入bootloader
    • grub:开机设置相关文件
    • 内核文件
  • dev:存放设备文件,如disk、stdin等
  • etc:存放绝大多数Linux系统所需的配置文件,如yum.conf、hosts等
  • home:存放用户账号
  • lib:用于存放程序的动态库和模块文件
  • media:用于挂载本地磁盘或者其他存储设备
  • mnt:用于挂载其他临时的文件系统
  • opt:发行版附加的一些软件包安装目录
  • root:root用户目录
  • sbin:很多都是root用户才可以执行的命令,譬如:系统更新、开关机
  • srv:存放服务进程所需的数据文件和一些服务文件的执行脚本
  • tmp:存放临时文件
  • proc:存放记录系统状态的文件:meminfo、cpuinfo
  • usr:第二层,包含绝大数多用户工具和应用程序
    • bin:非必要可执行文件
    • include:标准包含头文件
    • lib:usr/bin,usr/sbin中二进制文件的库
    • local:第三层
      • bin
      • etc
      • include
      • lib...
    • share:体系结构无关的共享数据
    • sbin:非必要系统二进制文件
    • src:源代码
  • var:变量文件,存放系统定义

分区与挂载

  • 挂载:类似于windows的格式化,linux系统中需要将分区挂载到具体路径下才可以使用
  • lsblk 查看磁盘信息,列出所有块信息
  • df -lh 查看容量信息
  • fdisk -l 列出所有分区表
  • 命名:
    • 磁盘命名:da,db,dc...
    • 分区命名:da1,db2,dc1...
    • tmpfs:虚拟内存文件系统,可能是real memery,也可能是硬盘的swap

用户与权限

用户与用户组

linux允许不同的用户同时登陆主机,同时使用主机资源,Linux以”用户与用户组“的概念,建立用户与文件权限之前的联系

从文件权限的角度出发,存在三种不同的使用对象:

  • 文件所有者
    • 当一个用户创建了一个文件,他就是这个文件的文件所有者,拥有对文件的最高权限。除非文件所有者开放权限,否则其他人无法查看、修改该文件
  • 用户组成员
    • 希望对部分用户开放权限,可将这部分用户划入同一用户组,一个用户可在多个用户组中
  • 其他人
    • 与该文件没有任何关系的其他用户

0号用户 root

root是系统中唯一一个超级管理员,拥有系统所有权限,出于安全考虑,不推荐使用root用户进行日常使用

  • root用户所在的用户组是 root组,出于root组的普通用户能够通过sudo命令获取root权限

用户与用户组的记录

账号和密码

  • /etc/passwd 管理用户UID和GID
  • /etc/shadow 管理用户密码
  • /etc/group 管理用户组相关信息
  • /etc/gshadow 管理用户组管理员相关信息
  • 以上文件,每一行代表一个用户或用户组

/etc/passwd

存储格式,每一个用户都有UID(UserID),GID(GroupID)

账号名称 : 密码 : UID : GID : 用户信息说明列 : 主文件夹 : shell
root : x : 0 : 0 : root : /root : /bin/bash

/etc/shadow

存储格式

账号名称 : 密码 : 最近改动密码的日期 : 密码不可被改变的天数 : 密码需要重新更改的天数 : 更改提醒天数 : 密码过期后账号的宽限时间 : 账号失效日期 : 保留

root : (字符串,此处打码) : 200 : 0 : 99999 : 7 : : :

/etc/group

存储格式

用户组名称 : 用户组密码 : GID : 此用户组包含的账号名称
root : x : 0 : root

/etc/gshadow

存储格式

用户组名 : 密码 : 用户组管理员账号 : 该用户组包含的账号名称
root : : : root

账号管理

  • 创建账号
    • useradd [username]
      • 默认不会再home下创建同名主目录
      • 创建的用户不会设置登录密码
    • passwd [username]
      • 设置密码
    • adduser
      • 进入交互界面,默认创建home同名文件夹
      • 相比于useradd,adduser像一个应用
    • 类似的 addgroup, deluser, delgroup等
  • 修改用户
    • change [username]
      • 修改与用户密码相关的过期信息,也可以直接使用 passwd 修改
    • usermod
  • 删除用户
    • userdel [username]
    • deluser [username]
  • 创建用户组
    • groupadd [groupname]
    • addgroup [groupname]
    • 用法与user类似,但是不需要设置密码
  • 修改用户组
    • groupmod [groupname]
  • 删除用户组
    • groupdel
    • delgroup

用户身份切换

日常使用中,遇到需要root用户才有权限的操作,就需要切换时身份

  • su
  • sudo

su

  • su [username]
    • -:代表读取目标用户的login-shell 存疑?实际使用中环境变量变化了
    • -l:同上
    • -m:不读取新用户配置文件
    • -c:仅执行一次命令,执行完后切换
  • 可以通过exit退回之前用户

当普通用户切换root时,需要root密码,如何能让用户具备root权限,但有不知道root密码? -- sudo

sudo

普通用户可以通过sudo,使用root用户权限执行命令

  • 不是所有用户都能执行sudo,而是在 /etc/sudoers文件中的用户才可以执行

sudoers文件信息:用什么身份执行什么命令

# 第一行,表示可以执行sudo的单个用户白名单
root      ALL=(ALL:ALL)                           ALL
用户账号   登录者来源主机名=(可切换身份:身份所在用户组)  可执行命令
# 第二行,表示可以执行sudo的用户组白名单,%后表示组
%root      ALL=(ALL:ALL)                           ALL
用户账号   登录者来源主机名=(可切换身份:身份所在用户组)  可执行命令

其中:

  • 可切换身份:可以限制用户执行sudo的目标身份
  • 可执行命令:可以限制用户利用sudo执行的命令内容

eg:

# testuser可以利用sudo以任何身份执行任何命令
testuser   ALL=(ALL:ALL)               ALL
# testuser可以利用sudo以root身份执行任何命令,NOPASSWD: 表示不需要输入密码
testuser   ALL=(root:root)     NOPASSWD:         ALL
# testuser组可以利用sudo以root身份执行passwd命令
%testuser   ALL=(root:root)             /usr/bin/passwd
  • 查询用户信息
    • id :展示当前用户UID,GID等信息
    • who:展示当前登录用户的信息

系统管理

磁盘存储

du: disk usage,基于文件统计

  • du -hd1 查看当前一级目录下的文件大小,数字表示到几级目录
  • du 查看某个文件及下面所有文件大小,-h 以容易理解的方式列出文件大小
  • du -s 查看某个文件总计大小

df: disk free,基于操作系统统计

  • df 查看整个磁盘使用情况,-h 以容易理解的方式列出文件大小
    • 分区,挂载点

CPU处理

  • 总核数 = 物理CPU个数 X 每颗物理CPU的核数
  • 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
  • 查看物理CPU ID个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
  • 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep "cpu cores"| uniq
  • 查看逻辑CPU的个数 cat /proc/cpuinfo| grep "processor"| wc -l

proc目录

proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。

譬如我们可以通过命令查看某个java进程有多少个线程:

cat /proc/{pid}/status
cat /proc/version
信息中Red Hat表示是red hat体系的(与之对应的是Debian:譬如Ubuntu),还有一个信息 X86_64 表示是64位的,这个在安装包的时候会使用到。
cat /proc/{pid}/status
* Name: java /*进程的程序名*/
* State: S (sleeping) /*进程的状态信息,具体参见*/
* Tgid: 9744 /*线程组号*/
* Pid: 9744 /*进程pid*/
* PPid: 7672 /*父进程的pid*/
* TracerPid: 0 /*跟踪进程的pid*/
* VmPeak: 60184 kB /*进程地址空间的大小*/
* VmSize: 60180 kB /*进程虚拟地址空间的大小reserved_vm:进程在预留或特殊的内存间的物理页*/
* VmLck: 0 kB /*进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘*/
* VmHWM: 18020 kB /*文件内存映射和匿名内存映射的大小*/
* VmRSS: 18020 kB /*应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)*/
* VmData: 12240 kB /*程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据*/
* VmStk: 84 kB /*进程在用户态的栈的大小*/
* VmExe: 576 kB /*程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 */
* VmLib: 21072 kB /*被映像到任务的虚拟内存空间的库的大小*/
* VmPTE: 56 kB /*该进程的所有页表的大小*/
* Threads: 1 /*共享使用该信号描述符的任务的个数*/

关于load

  • top中有一个load average,展示1分钟,5分钟,15分钟CPU的负载
  • 理解load:加入cpu 1分钟可以处理100个进程,这一分钟内有200个进程需要处理,那么这一分钟的load就是 200 / 100 = 2
  • load值与CPU核数也有关,1核满载load为1,2核满载load为2

内存管理

free -b k m g 查看内存使用情况,以b,k,m,g为单位

进程管理

ps

查看系统进程

ps -ef | grep xxx

top

最常用的命令,可以通过大写的M或者大写的P,来按照内存或者cpu进行排序

前后台命令

&
加在一个命令后,后台执行
watch -n 10 sh test.sh & #每10s在后台执行一次test.sh脚本
ctrl + z # 将一个命令放在后台,并且暂停
bg  # 将后台暂停的命令,转为后台执行
bg %<job number> # 将某一个后台任务从暂停转为执行
fg # 将后台命令,转为前台执行
fg %<job number> # 将某一个后台任务转为前台执行
jobs 查看有多少后台运行的命令

网络

lsof

linux一切皆文件,list open files,不仅可以用于查文件打开,还可以查看网络连接情况

  • lsof -i 显示所有连接
lsof -i<protocol> -s<status> 查看协议、状态相关连接,大小写不敏感
# 查看http并发量
lsof -itcp -stcp:ESTABLISHED | wc -l
lsof -i:port 查看端口连接
lsof [email protected] 查看到某个host的连接
  • lsof -c command 查看某个命令打开的文件

软件安装

软件安装原理

linux上安装软件目前有四种方式:

  • 源码包
  • RPM包
  • yum在线安装
  • 脚本安装

源码包

  • pros:可定制,编译安装更适合系统、更稳定、执行效率高
  • cons:安装过程繁琐,过程中问题较多,编译时间长
默认安装位置
  • /usr/local/ 软件安装位置
  • /usr/local/src/<源码> 源码保存位置
服务使用

通过软件安装为止的绝对路径来启动,如果将源码包安装后的启动程序复制到【/etc/rc.d/init.d】目录中,则也是可以使用【service】命令执行的。

RPM包

  • pros:安装快,简单,可管理、升级、卸载
  • cons:不灵活、依赖性
默认安装路径
  • /etc/ 配置文件目录
  • /usr/bin/ 可执行命令目录
  • /usr/lib/ 程序使用的函数库
  • /usr/share/doc/ 程序使用手册
  • /usr/share/man/ 帮助手册
服务使用

rpm安装包可以使用系统服务管理命令 service 来管理

yum在线安装

  • pros:简单、可解决依赖文件
  • cons:Radhat收费,centos不收费
默认安装路径

yum是基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,实质上是用RPM安装,所以RPM查询信息的指令都可用。

脚本安装

  • pros:最简单
  • cons:完全没有定制型,傻瓜化
默认安装路径

把复杂的软件包安装过程写成了程序脚本,初学者可以执行脚本实现一键安装。但实际安装的还是源码包和二进制包。

软件安装

一般linux系统分为两大类:

  • RedHat系列:Redhat、Centos、Fedora等
  • Debian系列:Debian、Ubuntu等

RedHat 系列

  • 常见的安装包格式 rpm包,安装rpm包的命令是“rpm -参数”
  • 包管理工具 yum
  • 支持tar包

Debian系列

  • 常见的安装包格式 deb包,安装deb包的命令是“dpkg -参数”
  • 包管理工具 apt-get
  • 支持tar包

包管理器:yum

1.列出所有可更新的软件清单命令:yum check-update

2.更新所有软件命令:yum update

3.仅安装指定的软件命令:yum install <package_name>

4.仅更新指定的软件命令:yum update <package_name>

5.列出所有可安裝的软件清单命令:yum list;yum info installed列出所有已经安装的包

6.删除软件包命令:yum remove <package_name>

7.查找软件包 命令:yum search

8.清除缓存命令:

yum clean packages: 清除缓存目录下的软件包

yum clean headers: 清除缓存目录下的 headers

yum clean oldheaders: 清除缓存目录下旧的 headers

yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的headers

安装扩展源:sudo yum -y install epel-release;EPEL(http://fedoraproject.org/wiki/EPEL) 是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。

另外,还可以直接下载二进制包或者文件本地编译安装。这种程序下载后或者编译完后不会将各个模块分别放在各个文件夹,所有内容会在一个文件夹中,我们一般把它放在/usr/local下,并在/usr/local/bin下 做软连接: ln -s src target

譬如redis安装,去redis官网会下载到一个源文件的压缩包,需要先解压然后手动make,具体步骤可以看官网文档或者readme。完后将这个文件夹拷贝到/usr/local,然后做链接

安装netstat : yum install net-tools

关于如何查看yum文件安装路径: rpm -qa | grep 包名; rpm -ql 包名

实践问题

well-known file is not secure

需要操作的线程和当前用户不是同一个用户,使用相同账号执行可以解决这个问题,我这个现象是arthus连接的线程不是当前用户启动的线程

# 查看进程用户
ps -ef | grep pid
# 使用相应用户执行
sudo -u admin <command>

安装代理

通过pip安装shadowsocks:pip install shadowsocks

配置:

{
"server":"0.0.0.0",         #服务端监听IP,我这里用的是aws的ec2,公网IP不固定,故监听所有IP
"local_address":"127.0.0.1",#本地代理IP
"local_port":2882,          #本地代理端口
"port_password": {          #支持多用户,端口对应一个密码,然后为每个用户分配一个端口密码即可,如果单用户:配一个password即可
     "2828": "123456",  
     "2829": "abcds1",  
     "2830": "654321"  
 }, 
"timeout":600,              #超时时间
"fast_open": false,         #是否使用tcp
"method":"aes-256-cfb"      #加密方式
}

启动 ssserver -c /etc/shadowsocks.json -d start

停止 ssserver -c /etc/shadowsocks.json -d stop

检查端口是否打开

telnet ip port;如果服务器端端口处于listening状态,那么应该是telnet成功;如果不成功,有可能是防火墙问题

端口没打开或者有防火墙:

telnet: connect to address 66.42.48.61: Connection refused
telnet: Unable to connect to remote host

端口打开:

rying 66.42.48.61...
Connected to 66.42.48.61.vultr.com.
Escape character is '^]'.
^C
Connection closed by foreign host.

ss客户端:https://v2xtls.org/%e5%b0%8f%e7%81%ab%e7%ae%adshadowrocket%e9%85%8d%e7%bd%aess-ssr%e6%95%99%e7%a8%8b/

linux 查看并开发对外端口

开放的端口位于/etc/sysconfig/iptables中

或者可以直接使用命令:

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT #开启80端口

/sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT #开启22端口

/etc/rc.d/init.d/iptables save #保存配置

/etc/rc.d/init.d/iptables restart #重启服务

查看已开放端口

/etc/init.d/iptables status

对于centos7 已经iptables 相关命令不能用了,使用firewalld代替了原来的iptables

>>> 开启端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
 命令含义:
--zone #作用域
--add-port=80/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
>>> 重启防火墙
firewall-cmd --reload

常用命令:

firewall-cmd --state                           ##查看防火墙状态,是否是running
firewall-cmd --reload                          ##重新载入配置,比如添加规则之后,需要执行此命令
firewall-cmd --get-zones                       ##列出支持的zone
firewall-cmd --get-services                    ##列出支持的服务,在列表中的服务是放行的
firewall-cmd --query-service ftp               ##查看ftp服务是否支持,返回yes或者no
firewall-cmd --add-service=ftp                 ##临时开放ftp服务
firewall-cmd --add-service=ftp --permanent     ##永久开放ftp服务
firewall-cmd --remove-service=ftp --permanent  ##永久移除ftp服务
firewall-cmd --add-port=80/tcp --permanent     ##永久添加80端口 
iptables -L -n                                 ##查看规则,这个命令是和iptables的相同的
man firewall-cmd                               ##查看帮助
⚠️ **GitHub.com Fallback** ⚠️