【操作系统】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以”用户与用户组“的概念,建立用户与文件权限之前的联系
从文件权限的角度出发,存在三种不同的使用对象:
- 文件所有者
- 当一个用户创建了一个文件,他就是这个文件的文件所有者,拥有对文件的最高权限。除非文件所有者开放权限,否则其他人无法查看、修改该文件
- 用户组成员
- 希望对部分用户开放权限,可将这部分用户划入同一用户组,一个用户可在多个用户组中
- 其他人
- 与该文件没有任何关系的其他用户
root是系统中唯一一个超级管理员,拥有系统所有权限,出于安全考虑,不推荐使用root用户进行日常使用
- root用户所在的用户组是 root组,出于root组的普通用户能够通过sudo命令获取root权限
- /etc/passwd 管理用户UID和GID
- /etc/shadow 管理用户密码
- /etc/group 管理用户组相关信息
- /etc/gshadow 管理用户组管理员相关信息
- 以上文件,每一行代表一个用户或用户组
存储格式,每一个用户都有UID(UserID),GID(GroupID)
账号名称 : 密码 : UID : GID : 用户信息说明列 : 主文件夹 : shell
root : x : 0 : 0 : root : /root : /bin/bash
存储格式
账号名称 : 密码 : 最近改动密码的日期 : 密码不可被改变的天数 : 密码需要重新更改的天数 : 更改提醒天数 : 密码过期后账号的宽限时间 : 账号失效日期 : 保留
root : (字符串,此处打码) : 200 : 0 : 99999 : 7 : : :
存储格式
用户组名称 : 用户组密码 : GID : 此用户组包含的账号名称
root : x : 0 : root
存储格式
用户组名 : 密码 : 用户组管理员账号 : 该用户组包含的账号名称
root : : : root
- 创建账号
- useradd [username]
- 默认不会再home下创建同名主目录
- 创建的用户不会设置登录密码
- passwd [username]
- 设置密码
- adduser
- 进入交互界面,默认创建home同名文件夹
- 相比于useradd,adduser像一个应用
- 类似的 addgroup, deluser, delgroup等
- useradd [username]
- 修改用户
- change [username]
- 修改与用户密码相关的过期信息,也可以直接使用 passwd 修改
- usermod
- change [username]
- 删除用户
- userdel [username]
- deluser [username]
- 创建用户组
- groupadd [groupname]
- addgroup [groupname]
- 用法与user类似,但是不需要设置密码
- 修改用户组
- groupmod [groupname]
- 删除用户组
- groupdel
- delgroup
日常使用中,遇到需要root用户才有权限的操作,就需要切换时身份
- su
- sudo
- su [username]
- -:代表读取目标用户的login-shell 存疑?实际使用中环境变量变化了
- -l:同上
- -m:不读取新用户配置文件
- -c:仅执行一次命令,执行完后切换
- 可以通过exit退回之前用户
当普通用户切换root时,需要root密码,如何能让用户具备root权限,但有不知道root密码? -- 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 -hd1 查看当前一级目录下的文件大小,数字表示到几级目录
- du 查看某个文件及下面所有文件大小,-h 以容易理解的方式列出文件大小
- du -s 查看某个文件总计大小
- df 查看整个磁盘使用情况,-h 以容易理解的方式列出文件大小
- 分区,挂载点
- 总核数 = 物理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下,以进程的 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 /*共享使用该信号描述符的任务的个数*/
- 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 -ef | grep xxx
最常用的命令,可以通过大写的M或者大写的P,来按照内存或者cpu进行排序
&
加在一个命令后,后台执行
watch -n 10 sh test.sh & #每10s在后台执行一次test.sh脚本
ctrl + z # 将一个命令放在后台,并且暂停
bg # 将后台暂停的命令,转为后台执行
bg %<job number> # 将某一个后台任务从暂停转为执行
fg # 将后台命令,转为前台执行
fg %<job number> # 将某一个后台任务转为前台执行
jobs 查看有多少后台运行的命令
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】命令执行的。
- pros:安装快,简单,可管理、升级、卸载
- cons:不灵活、依赖性
- /etc/ 配置文件目录
- /usr/bin/ 可执行命令目录
- /usr/lib/ 程序使用的函数库
- /usr/share/doc/ 程序使用手册
- /usr/share/man/ 帮助手册
rpm安装包可以使用系统服务管理命令 service 来管理
- pros:简单、可解决依赖文件
- cons:Radhat收费,centos不收费
yum是基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,实质上是用RPM安装,所以RPM查询信息的指令都可用。
- pros:最简单
- cons:完全没有定制型,傻瓜化
把复杂的软件包安装过程写成了程序脚本,初学者可以执行脚本实现一键安装。但实际安装的还是源码包和二进制包。
一般linux系统分为两大类:
- RedHat系列:Redhat、Centos、Fedora等
- Debian系列:Debian、Ubuntu等
- 常见的安装包格式 rpm包,安装rpm包的命令是“rpm -参数”
- 包管理工具 yum
- 支持tar包
- 常见的安装包格式 deb包,安装deb包的命令是“dpkg -参数”
- 包管理工具 apt-get
- 支持tar包
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 包名
需要操作的线程和当前用户不是同一个用户,使用相同账号执行可以解决这个问题,我这个现象是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.
开放的端口位于/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 ##查看帮助