文章目录
一、Linux简介
操作系统概述
- 是现代计算机系统中 最基本和最重要 的系统软件
- 是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩展
- 主要作用是管理好硬件设备,并为用户和应用程序提供一个简单的接口,以便于使用
- 而其他的诸如编译程序、数据库管理系统,以及大量的应用软件,都直接依赖于操作系统的支持
Linux简介
Unix
- 1965年, 贝尔实验室联合麻省理工大学和通用电气, 计划建立一套多使用者(multi-user), 多任务(multi-processor), 多层次(multi-level)的MULTICS操作系统, 以便让大型主机支持更多终端
- 1969年 贝尔实验室从项目退出, 成员Ken Thompson为了玩"星际旅行", 利用一个月时间使用汇编语言写出Unix原型
- 1970年 Thompson以BCPL语言为基础编写出B语言, 并用B语言写出了第一个Unix系统
- 1971年 Dennis M.Ritchie加入Thompson的队伍, 并改造B语言
- 1972年 Dennis M.Ritche基于B语言写出C语言
- 1973年 两人使用C语言重写Unix系统
Minix
- 因AT&T(通用电气)的政策改变, 导致大学无法使用Unix源代码. 于是Andrew S. Tanenbaum(塔能鲍姆)为了能在课堂上演示系统操作的细节, 自行开发与Unix兼容的系统.
- 取名小型Unix, 即Minix
Linux
- 1991年, 林纳斯(Linus)读大学时常使用Minix, 并自己编写磁盘驱动程序与文件系统, 这些也成为Linux内核雏形
- 后来他使用GNU的bash当做开发环境, gcc做编译工具, 编写Linux内核
- 开始的Linux与Unix不兼容
Linux版本
Linux内核版本
- 内核(kernal) 是系统的心脏, 它是运行程序/管理磁盘/管理打印机等硬件的核心程序, 提供了一个在裸设备与应用程序间的抽象层
- 稳定版: 具有工业级强度,可以广泛地应用和部署。新的稳定版相对于较旧的只是修正一些 bug 或加入一些新的驱动程序
- 开发版: 由于要试验各种解决方案,所以变化很快
- 内核是操作系统最基本的部分。
- 它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。
- 内核的分类可分为单内核和双内核以及微内核。
Linux发行版本
- Linux 发行版(也被叫做 GNU/Linux 发行版)通常包含了包括桌面环境、办公套件、媒体播放器、数据库等应用软件
- 这些发行版由个人,松散组织的团队,以及商业机构和志愿者组织编写。
- 发行版为许多不同的目的而制作, 包括对不同计算机结构的支持, 对一个具体区域或语言的本地化,实时应用,和嵌入式系统,甚至许多版本故意地只加入免费软件。
- 常见的发行版本如下:
- Ubuntu
- Redhat
- Fedora
- openSUSE
- Linux Mint
- Debian
- Manjaro
- Mageia
- CentOS
- Arch
二、Linux文件结构与用户
Linux的目录及其存放文件内容
- /:
- 根目录,一般根目录下只存放目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始
- 当在终端里输入 /home,其实是在告诉电脑,先从 /(根目录)开始,再进入到 home 目录
- /bin、/usr/bin:
- 可执行二进制文件的目录,如常用的命令 ls、tar、mv、cat 等
- /boot:
- 放置 linux 系统启动时用到的一些文件,如 linux 的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub
- /dev:
- (device)存放linux系统下的设备文件, 即设备管理器,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱mount /dev/cdrom /mnt
- /etc:
- 系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有
- /etc/inittab
- /etc/fstab
- /etc/init.d
- /etc/X11
- /etc/sysconfig
- /etc/xinetd.d
- /home:
- 系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下(存放登录的用户)
- 用户对于它的家目录内的东西拥有绝对权限
- ~ 表示当前用户的家目录
- ~edu 表示用户 edu 的家目录
- /lib、/usr/lib、/usr/local/lib:
- 系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助
- /lost+fount:
- 系统异常产生错误时,会将一些遗失的片段放置于此目录下
- /mnt: /media:
- 光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载
- /opt:
- 给主机额外安装软件(软件安装包)所摆放的目录
- /proc:
- 此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的文件有:/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等
- /root:
- 系统管理员root的家目录
- /sbin、/usr/sbin、/usr/local/sbin:
- (super binary)放置系统管理员使用的可执行命令,如 fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root 使用的命令,一般用户只能"查看"而不能设置和使用
- /tmp:
- 一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下(temp)
- /srv:
- 服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内
- /usr:
- 应用程序存放目录 (Unix System Resource) 系统资源
- /usr/bin:存放应用程序
- /usr/share:存放共享数据
- /usr/lib:存放不能直接运行的,却是许多程序运行所必需的一些函数库文件
- /usr/local:存放软件升级包
- /usr/share/doc:系统说明文件存放目录
- /usr/share/man:程序说明文件存放目录
- /var:
- 放置系统执行过程中经常变化的文件
- /var/log:随时更改的日志文件
- /var/spool/mail:邮件存放的目录
- /var/run:程序或服务启动后,其 PID 存放在该目录下
Linux用户相关操作
添加用户
# 直接添加用户
useradd user_name
# 添加用户到某个目录
useradd -d dir user_name
# 添加用户到某个组
useradd -g group_name user_name
[options]
-c:加上备注文字,备注文字保存在passwd的备注栏中。
-d:指定用户登入时的启始目录。
-D:变更预设值。
-e:指定账号的有效期限,缺省表示永久有效。
-f:指定在密码过期后多少天即关闭该账号。
-g:指定用户所属的起始群组。
-G:指定用户所属的附加群组。
-m:自动建立用户的登入目录。
-M:不要自动建立用户的登入目录。
-n:取消建立以用户名称为名的群组。
-r:建立系统账号。
-s:指定用户登入后所使用的shell。
-u:指定用户ID号。
查询用户信息
# 查看信息
id user_name
# 查看登录用户
who
who -q[--count] # 只显示用户的登录账号和登录用户的数量
# 用户与组的配置文件
/etc/passwd
/etc/group
操作用户组
# 增加组
groupadd group_name
[options]
-g:指定组ID号。
-o:允许重复的组ID号。
-f:强制创建组。
# 删除组
groupdel group_name
# 修改用户所在组
usermod -g group_name user_name
三、Linux常用命令
软件安装
- 需要注意的是,不同发行版的安装命令是不同的,我常用ubuntu系统,因此只以ubuntu系统为例
sudo apt-get update 更新源
sudo apt-get install package 安装包
sudo apt-get remove package 删除包
sudo apt-cache search package 搜索软件包
sudo apt-cache show package 获取包的相关信息,如说明、大小、版本等
sudo apt-get install package --reinstall 重新安装包
sudo apt-get -f install 修复安装
sudo apt-get remove package --purge 删除包,包括配置文件等
sudo apt-get build-dep package 安装相关的编译环境
sudo apt-get upgrade 更新已安装的包
sudo apt-get dist-upgrade 升级系统
sudo apt-cache depends package 了解使用该包依赖那些包
sudo apt-cache rdepends package 查看该包被哪些包依赖
sudo apt-get source package 下载该包的源代码
sudo apt-get clean && sudo apt-get autoclean 清理无用的包
sudo apt-get check 检查是否有损坏的依赖
# 离线安装
sudo dpkg -i xxx.deb # 安装包
sudo dpkg -r package # 删除包,删除程序
命令的帮助
# 一下三种方式都可以查看命令的说明
man [command]
help [command]
[command] --help
-
man命令打开使用手册,可用如下操作查看手册
操作键 作用 Space 下一页 Enter 下一行 f 下一页 b 上一页 q 退出 /word 搜索word内容
文件与目录的命令
查看文件信息:ls
-
Linux文件或者目录名称最长可以有265个字符,“.”代表当前目录,“…”代表上一级目录,以“.”开头的文件为隐藏文件,需要用 -a 参数才能显示。
-
常用参数
参数 含义 -a 显示指定目录下所有子目录与文件,包括隐藏文件 -l 以列表方式显示文件的详细信息,其中文件大小的单位是字节 -h 配合-l以人性化的方式显示文件大小,单独的-h无作用 -
文件详情列表
drwxr-xr-x 2 python python 4.0K 5月 16 2016 Music
- 第一列:
- 第一个字符: 文件类型 d(目录) -(普通文件) l(链接文件) b(装置文件里面的可供储存的接口设备) c(装置文件里面的串行端口设备)
- 第2个字符到第10个字符:文件权限
- rwxr-xr-x : 分为三组 (属主用户,属主用户的组,其他用户)
- r: 读
- w: 写
- x: 执行
- -: 无权限
- 第二列:链接数,表示有多少个文件链接到inode号码
- 第三列:拥有者
- 第四列:所属群组
- 第五列:文件大小
- 第六列:文件最后修改时间
- 第七列:文件名,以
.
开头的是隐藏文档
- 第一列:
-
使用通配符
通配符 含义 * 代表任意多的字符,例如ls te* ? 代表任意一个字符,例如ls ?te [] 匹配括号内任意一个字符,例如ls [abc] \ 转义,使通配符失效
操作目录
-
切换目录:cd
命令 含义 cd ~ 回到家目录 cd … 回到上层目录 cd - 回到上次所在的目录 -
创建目录:mkdir
- 新建目录的名称不能与当前目录中已有的目录或文件同名
- 目录创建者必须对当前目录具有写权限
# 创建目录 mkdir [dir] # 递归地创建目录 mkdir -p [dir]
-
删除目录:rmdir
# 删除空目录 rmdir [dir] # 递归删除 rm -r [dir] # 跑路删除法 rm -rf [dir]
操作文件
-
创建文件:touch
touch [file1] [file2] ...
-
拷贝:cp
参数 含义 -f 强制拷贝 -i 交互式拷贝,当覆盖时需要用户确认 -r 递归拷贝目录及其内部文件 -v 可视化拷贝,显示拷贝进度 # 可以使用cp给文件改名 cp [file_name1] [file_name2]
-
删除:rm
参数 含义 -f 强制删除 -i 交互式删除 -r 递归删除目录及其内部文件 -v 可视化删除,显示删除进度 -
移动:mv
- mv命令对文件夹移动时, 不需要-r的对文件夹的操作选项
参数 含义 -f 强制移动 -i 交互式移动 -v 可视化移动 -
查看文件内容:cat
# 基本使用 cat [file] # 显示行号 cat -n [file] # 分页查看 cat -n [file] | more # 合并文件 cat [file1] [file2] > [file3]
-
分屏显示:more/less
- 使用more命令, 可以让文件一次只显示一页
- 使用less命令, 内容一页一页加载,适用于大文件
more [file] less [file]
操作键 作用 Space 下一页 Enter 下一行 f 下一页 b 上一页 q 退出 h 显示帮助 -
输出重定向:>/>>
操作键 作用 > 覆盖式重定向 >> 追加式重定向 -
输出文件部分内容: head/tail
# 默认输出前十行内容 head [file] # 输出5行内容 head -n 5 [file] # 默认输出后十行内容 tail [file] # 输后出5行内容 tail -n 5 [file] # 输出文件内容并实时更新 tail -f [file]
-
查看指定行的内容:sed
sed -n '19344,19844p' [file]
-
修改文件所有者:chown
chown [user]:[group] [file]
-
查看历史命令: history
# 显示全部 history # 显示一定数量 history number # 执行历史指令 !number
搜索查找
-
内容搜索:grep
# 搜索时可以使用正则表达式匹配 grep [options] content [file] cat [file] | grep content
操作键 作用 -v 取反 -n 显示行号 -i 忽略大小写 -
查找文件:find
# 按文件名查找 find ./ -name [file] # 按文件大小查找 find ./ -size +2M find ./ -size +4k -size -2M # 按权限查找 find ./ -perm 777
修改文件权限
-
字母法:
chmod [u/g/o/a] [+/-/=] [rwx] [file] # u user 表示该文件的所有者 # g group 表示与该文件的所有者属于同一组( group )者,即用户组 # o other 表示其他以外的人 # a all 表示这三者皆是 # + 增加权限 # - 撤销权限 # = 设定权限 # r read 表示可读取,对于一个目录,如果没有r权限,那么就意味着不能通过ls查看这个目录的内容。 # w write 表示可写入,对于一个目录,如果没有w权限,那么就意味着不能在目录下创建新的文件。 # x excute 表示可执行,对于一个目录,如果没有x权限,那么就意味着不能通过cd进入这个目录。
-
数字法:
chmod u=7,g=5,o=4 [file] chmod 754 [file] chmod 754 [dir] -R # 递归地添加权限
打包与压缩:
-
打包:tar
# 参数可以不带- tar [options] file.tar [file] tar cvf 20210304.tar test/ # -c 生成档案文件,创建打包文件 # -v 列出归档解档的详细过程,显示进度 # -f 指定档案文件名称,f后面一定是.tar文件,所以必须放选项最后 # -t 列出档案中包含的文件 # -x 解开档案文件
-
压缩:
# 打包并压缩 tar -czvf file.tar.gz [file] # 打包压缩时排除部分文件 tar -czvf file.tar.gz --exclude=file1 --exclude=file2 [file] # 解压并解包到指定路径 tar -xzvf file.tar.gz -C [dir]
关机与重启
命令 | 含义 |
---|---|
reboot | 重启 |
shutdown -r now | 重启并给其他用户提示 |
shutdown -h now | 立即关机 |
shutdown -h 20:00 | 定时关机 |
shutdown -h +10 | 10分钟后关机 |
查看服务
-
查看进程:ps
ps命令详解ps -aux # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ps -ef # UID PID PPID C STIME TTY TIME CMD ps -lA # F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD ps axjf # PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND # 需要说明的字段 F 代表这个程序的旗标 (flag), 4 代表使用者为 superuser C CPU 使用的资源百分比 PRI指进程的执行优先权(Priority的简写),其值越小越早被执行 NI 这个进程的nice值,其表示进程可被执行的优先级的修正数值 SZ 使用掉的内存大小 WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作 VSZ: 占用的虚拟记忆体大小 RSS: 占用的记忆体大小 TTY: 终端的次要装置号码 (minor device number of tty) STAT(S): 该行程的状态: D: 无法中断的休眠状态 (通常 IO 的进程) R: 正在执行中 S: 静止状态 T: 暂停执行 Z: 不存在但暂时无法消除 W: 没有足够的记忆体分页可分配 <: 高优先序的行程 N: 低优先序的行程 L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
-
查看网络状态:netstat
netstat命令详解# 常见参数说明 -a (all)显示所有选项,默认不显示LISTEN相关 -t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相关选项 -n 拒绝显示别名,能显示数字的全部转化成数字 -l 仅列出有在 Listen (监听) 的服務状态 -p 显示建立相关链接的程序名 -r 显示路由信息,路由表 -e 显示扩展信息,例如uid等 -s 按各个协议进行统计 -c 每隔一个固定时间,执行该netstat命令 # 列出所有端口 netstat -a | more # 列出所有 tcp 端口 netstat -at # 列出所有 udp 端口 netstat -au # 只显示监听端口 netstat -l # 只显示监听tcp端口 netstat -lt # 只显示监听udp端口 netstat -lu # 输出中显示 PID 和进程名称 netstat -p # 输出中不显示别名 netstat -n # 输出核心路由 netstat -r # 查看端口是否被占用 netstat -an | grep 3306 # 查看端口对应的进程, 核心是列出的网络里有端口号及其进程号 sudo netstat -nlp | grep 3306 # 查看所有监听的端口 netstat -nlp |grep LISTEN
-
终止进程:kill
# 根据对口找进程 sudo lsof -i:port # 只返回进程号 sudo lsof -t -i:port # 终止进程 kill [pid] # 暴力终止 kill -9 [pid] # 终止指定用户的进程 kill -9 $(ps -ef | grep hnlinux) # 方法一 过滤出hnlinux用户进程 kill -u hnlinux # 方法二 # 查看信号 kill -l
使用ssh与scp
- 基本使用
ssh -p$port $user@$host scp $user@$host:/Desktop/source.txt ./ scp source.txt $user@$host:/Desktop
- 服务器之间传输文件
# 通过ssh生成秘钥 ssh-keygen -t rsa -C "email-address" # 在我的使用中发现一般从远程机器拷贝文件到本机能够成功,这里需要将本机的公钥复制到远程主机的authorized_keys中 /home/ubuntu/.ssh/authorized_keys # 如果本机有多个秘钥,可以使用指定秘钥进行传输 scp -i ~/.ssh/scp -r $user@$host:/home/ubuntu/* /home/ubuntu/target
四、使用vim
基本介绍
- vim没有格式/段落/字体等, 只是一个文本编辑器, 有着繁多的命令
- vim有三种基本的工作模式:
- 命令模式
- 文本输入模式
- 末行模式
命令行模式
- 进入vi编辑器时的模式, 可以执行各种命令
- 其中输入的字符是不会显示的, 一旦输错,或命令不合法, vi就会报警
文本输入模式
- 在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式
- 文本输入模式下, 输入的所有字符会当成文件保存起来
末行模式
- 也称为ex转义模式, 可以在命令行模式下按":" 进入该模式
- 多数文件管理命令都是在这个模式下去执行的
基本操作
命令模式
-
移动光标
n+方向: 移动n个单位 M: 光标移动到中间行 L: 光标移动到屏幕最后一行行首 nG: 移动到指定行,n是数字,配合:set nu Ctr-d: 向下翻半屏 Ctr-u: 向上翻半屏 Ctr-f: 向下翻一屏 Ctr-b: 向上翻一屏 gg: 光标移动文件开头 G: 光标移动到文件末尾 0 或功能键[Home]: 移动到这一行的最前面字符处 $ 或功能键[End]: 移动到这一行的最后面字符处
-
删除与复制
# 删除 x: 删除光标后一个字符,相当于 Del X: 删除光标前一个字符,相当于 Backspace dd: 删除光标所在行,n dd 删除指定的行数 D: 删除光标后本行所有内容,包含光标所在字符 d0: 删除光标前本行所有内容,不包含光标所在字符 dw: 删除光标开始位置的字,包含光标所在字符 # 复制 yy: 复制当前行,n yy 复制 n 行 p: 在光标所在位置向下新开辟一行,粘贴
-
撤销与重复
u: 一步一步撤销(undo) Ctrl-r: 反撤销(reverse) .: 重复上一次操作的命令
-
设置行号:
set nu: 打开行号 set nonu: 关闭行号
输入模式
```bash
i: 插入光标前一个字符
I: 插入行首
a: 插入光标后一个字符
A: 插入行未
o: 在下一行处输入新的一行
O: 在上一行处输入新的一行
```
末行模式
-
搜索与替换
/word: 向光标之下寻找一个名称为 word 的字符串 ?word: 向光标之上寻找一个名称为 word 的字符串 # 搜索出结果后 n: 代表重复前一个搜寻的动作 N: 与 n 刚好相反,为反向进行前一个搜寻动作 # 替换 :n1,n2s/word1/word2/g # 在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 :%s/word1/word2/g # 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 :%s/word1/word2/gc # 取代前需要用户confirm
-
退出与保存
w: 将编辑的数据写入硬盘档案中 q: 离开 vim q!: 强制离开不储存档案 wq: 储存后离开,若为wq!则为强制储存后离开
五、Linux的磁盘管理
查看磁盘的挂载情况
```bash
# 查看系统分区与挂载
lsblk -f
# 查看系统的磁盘数据
sudo fdisk -l
# 查看磁盘的使用情况
df -h
```
挂载新的磁盘
```bash
# 查看系统的磁盘数据
sudo fdisk -l
# 创建目录作为挂载点
mkdir /home/new_disk
# 挂载硬盘
mount /dev/xxx /home/new_disk
设置可自动挂载
vim /etc/fstab
# 然后修改文件内容
echo "/dev/xvdb /home/data ext4 defaults 0 0" >> /etc/fstab
# 最后执行
mount -a
```
查看磁盘使用情况
```bash
# 基本使用
du [options] [dir]
# options
-s 指定目录占用大小汇总
-h 带计量单位
-a 含文件
--max-depth 子目录深度
-c 汇总
# 常用命令
du -ach --max-depth=1 /opt # 汇总深度为1的opt下所有文件大小
sudo du -csh * # 汇总当前路径下所有文件大小
# 一些统计的组合命令
ls -l /dir | grep "^-" | wc -l # 统计文件数目
ls -l /dir | grep "^d" | wc -l # 统计目录数目
ls -lR /dir | grep "^-" | wc -l # 递归统计文件数目
ls -lR /dir | grep "^d" | wc -l # 递归统计目录数目
```