Linux教程
1. Linux基础
1.1 Linux简介
Linux是一种自由和开放源代码的类Unix操作系统,它是由Linus Torvalds于1991年首次发布的。Linux内核是Linux操作系统的核心,它负责管理硬件资源、提供系统服务和支持应用程序运行。
1.2 Linux的特点
- 开源免费:任何人都可以查看、修改和分发Linux源代码
- 稳定性高:Linux系统可以长时间运行而不需要重启
- 安全性强:Linux系统有完善的权限管理和安全机制
- 可定制性强:用户可以根据自己的需求定制Linux系统
- 多用户多任务:支持多个用户同时使用系统,每个用户可以运行多个任务
- 网络功能强大:Linux系统内置了丰富的网络工具和服务
1.3 Linux发行版
Linux发行版是基于Linux内核的完整操作系统,它包含了Linux内核、系统工具、应用程序和文档等。常见的Linux发行版包括:
- Ubuntu:基于Debian的用户友好型发行版,适合初学者
- CentOS:基于Red Hat Enterprise Linux的免费发行版,适合服务器
- Debian:稳定可靠的发行版,是许多其他发行版的基础
- Fedora:由Red Hat赞助的社区发行版,包含最新的软件
- Arch Linux:轻量级、灵活的发行版,适合有经验的用户
- openSUSE:由SUSE赞助的发行版,适合桌面和服务器
1.4 Linux系统的组成
- Linux内核:系统的核心,负责管理硬件资源
- Shell:命令行解释器,用户与系统交互的界面
- 文件系统:用于存储和组织文件的结构
- 系统工具:用于管理系统的各种工具程序
- 应用程序:用户使用的各种软件程序
2. 命令行基础
2.1 Shell简介
Shell是Linux系统的命令行解释器,它是用户与Linux内核之间的接口。常见的Shell包括:
- Bash(Bourne Again Shell):最常用的Shell,大多数Linux发行版的默认Shell
- Zsh:功能强大的Shell,支持更多的特性
- Csh(C Shell):语法类似C语言的Shell
- Ksh(Korn Shell):兼容Bash的Shell
2.2 基本命令
2.2.1 文件和目录操作命令
# 查看当前目录
pwd
# 列出目录内容
ls
ls -l # 详细列出
ls -la # 列出所有文件(包括隐藏文件)
ls -h # 人类可读的格式
# 切换目录
cd /path/to/directory
cd ~ # 切换到主目录
cd .. # 切换到上级目录
# 创建目录
mkdir directory_name
mkdir -p parent_directory/child_directory # 创建嵌套目录
# 创建文件
touch file_name
# 复制文件或目录
cp source_file destination_file
cp -r source_directory destination_directory # 复制目录
# 移动文件或目录
mv source destination
# 删除文件
rm file_name
rm -f file_name # 强制删除
# 删除目录
rmdir directory_name # 删除空目录
rm -r directory_name # 删除非空目录
rm -rf directory_name # 强制删除非空目录
# 查看文件内容
cat file_name # 显示整个文件
less file_name # 分页显示文件
more file_name # 分页显示文件
tail file_name # 显示文件末尾
tail -f file_name # 实时显示文件末尾
head file_name # 显示文件开头
2.2.2 系统信息命令
# 查看系统信息
uname -a # 显示所有系统信息
uname -r # 显示内核版本
# 查看CPU信息
cat /proc/cpuinfo
# 查看内存信息
cat /proc/meminfo
free -h # 人类可读的格式
# 查看磁盘信息
df -h # 人类可读的格式
# 查看系统负载
uptime
# 查看登录用户
who
w
# 查看当前用户
whoami
2.2.3 网络命令
# 查看网络接口
ifconfig
ip addr
# 测试网络连接
ping hostname or ip_address
# 查看路由表
route -n
ip route
# 查看网络连接
netstat -tuln
ss -tuln
# 下载文件
wget url
curl -O url
# 远程登录
ssh username@hostname or ip_address
2.3 命令行技巧
- 使用Tab键自动补全命令和文件名
- 使用上下箭头键查看历史命令
- 使用Ctrl+C终止当前命令
- 使用Ctrl+D退出当前Shell
- 使用Ctrl+L清屏
- 使用history命令查看历史命令
- 使用!n执行历史命令中的第n条命令
- 使用!command执行最近的以command开头的命令
- 使用|管道符号将一个命令的输出传递给另一个命令
- 使用>重定向符号将命令的输出重定向到文件
- 使用>>追加符号将命令的输出追加到文件
- 使用<输入重定向符号将文件内容作为命令的输入
3. 文件系统
3.1 Linux文件系统结构
Linux文件系统采用树形结构,从根目录(/)开始,向下延伸出各个子目录。常见的目录包括:
/ # 根目录
├── bin # 基本命令二进制文件
├── boot # 引导加载程序和内核文件
├── dev # 设备文件
├── etc # 系统配置文件
├── home # 用户主目录
├── lib # 共享库文件
├── media # 可移动介质挂载点
├── mnt # 临时挂载点
├── opt # 可选软件包
├── proc # 进程信息和系统状态
├── root # 根用户主目录
├── run # 运行时数据
├── sbin # 系统管理命令二进制文件
├── srv # 服务数据
├── sys # 系统硬件信息
├── tmp # 临时文件
├── usr # 用户程序和数据
└── var # 可变数据(日志、缓存等)
3.2 文件类型
- 普通文件(-):文本文件、二进制文件等
- 目录文件(d):包含其他文件和目录的文件
- 链接文件(l):指向其他文件的引用
- 设备文件(b/c):块设备文件和字符设备文件
- 管道文件(p):用于进程间通信的文件
- 套接字文件(s):用于网络通信的文件
3.3 文件权限
Linux文件系统使用权限来控制对文件和目录的访问。权限分为三类:所有者权限、组权限和其他用户权限。每种权限包括读(r)、写(w)和执行(x)权限。
# 查看文件权限
ls -l file_name
# 权限表示示例
-rw-r--r-- # 所有者有读写权限,组和其他用户有读权限
drwxr-xr-x # 目录,所有者有读写执行权限,组和其他用户有读执行权限
# 修改文件权限
chmod permissions file_name
# 权限数字表示
# r=4, w=2, x=1
chmod 755 file_name # 所有者有读写执行权限,组和其他用户有读执行权限
chmod 644 file_name # 所有者有读写权限,组和其他用户有读权限
# 修改文件所有者
chown owner:group file_name
# 修改文件所属组
chgrp group file_name
3.4 链接文件
Linux支持两种类型的链接文件:硬链接和符号链接(软链接)。
# 创建硬链接
ln source_file hard_link
# 创建符号链接
ln -s source_file soft_link
# 硬链接与符号链接的区别:
# 1. 硬链接指向文件的inode,符号链接指向文件的路径
# 2. 硬链接不能跨文件系统,符号链接可以跨文件系统
# 3. 硬链接不能指向目录,符号链接可以指向目录
# 4. 删除源文件后,硬链接仍然有效,符号链接失效
4. 用户和权限管理
4.1 用户管理
# 添加用户
useradd username
useradd -m username # 创建用户时同时创建主目录
useradd -s /bin/bash username # 指定用户的默认Shell
# 设置用户密码
passwd username
# 修改用户信息
usermod -l new_username old_username # 修改用户名
usermod -d /new/home/directory username # 修改用户主目录
usermod -s /new/shell username # 修改用户默认Shell
usermod -aG groupname username # 将用户添加到组
# 删除用户
userdel username
userdel -r username # 删除用户时同时删除主目录
# 查看用户信息
id username
finger username
4.2 组管理
# 添加组
groupadd groupname
# 修改组信息
groupmod -n new_groupname old_groupname # 修改组名
# 删除组
groupdel groupname
# 查看组信息
groups username # 查看用户所属的组
cat /etc/group # 查看所有组
4.3 权限管理
Linux系统使用权限来控制对文件和目录的访问。权限分为三类:所有者权限、组权限和其他用户权限。每种权限包括读(r)、写(w)和执行(x)权限。
4.3.1 文件权限
# 查看文件权限
ls -l file_name
# 修改文件权限
chmod permissions file_name
# 权限数字表示
# r=4, w=2, x=1
chmod 755 file_name # 所有者有读写执行权限,组和其他用户有读执行权限
chmod 644 file_name # 所有者有读写权限,组和其他用户有读权限
# 使用符号表示修改权限
chmod u+x file_name # 给所有者添加执行权限
chmod g-w file_name # 移除组的写权限
chmod o=r file_name # 给其他用户设置读权限
chmod a+x file_name # 给所有用户添加执行权限
4.3.2 目录权限
# 查看目录权限
ls -ld directory_name
# 修改目录权限
chmod permissions directory_name
# 目录权限说明:
# r:可以列出目录内容
# w:可以在目录中创建、删除和重命名文件
# x:可以进入目录
# 递归修改权限
chmod -R permissions directory_name
4.3.3 SUID、SGID和Sticky位
# SUID(Set User ID):执行文件时,以文件所有者的身份执行
chmod u+s file_name
# SGID(Set Group ID):执行文件时,以文件所属组的身份执行;对于目录,新创建的文件继承目录的组
chmod g+s file_name or directory_name
# Sticky位:对于目录,只有文件所有者和root可以删除文件
chmod +t directory_name
# 查看特殊权限
ls -l file_name
# SUID:所有者权限的x位变为s
# SGID:组权限的x位变为s
# Sticky位:其他用户权限的x位变为t
5. 进程管理
5.1 进程概述
进程是正在运行的程序的实例。每个进程都有一个唯一的进程ID(PID)。Linux系统使用进程来执行各种任务。
5.2 进程管理命令
# 查看进程
ps # 查看当前终端的进程
ps aux # 查看所有进程
ps -ef # 查看所有进程,显示父进程ID
# 查看进程树
pstree
# 实时查看进程
top
top -u username # 查看指定用户的进程
htop # 交互式的进程查看工具
# 终止进程
kill PID # 发送SIGTERM信号
kill -9 PID # 发送SIGKILL信号,强制终止进程
killall process_name # 终止所有同名进程
pkill process_name # 终止匹配名称的进程
# 挂起和恢复进程
Ctrl+Z # 挂起当前进程
fg # 恢复前台进程
bg # 恢复后台进程
jobs # 查看后台进程
# 后台运行进程
command &
nohup command & # 忽略挂断信号,进程在终端关闭后继续运行
5.3 进程优先级
Linux系统使用优先级来决定进程的调度顺序。优先级范围为-20(最高)到19(最低),默认优先级为0。
# 查看进程优先级
top # 查看NI列
ps -l # 查看PRI和NI列
# 修改进程优先级
nice -n priority command # 以指定优先级启动进程
renice priority PID # 修改正在运行的进程的优先级
6. 系统管理
6.1 系统服务管理
# 使用systemctl管理服务(systemd系统)
systemctl status service_name # 查看服务状态
systemctl start service_name # 启动服务
systemctl stop service_name # 停止服务
systemctl restart service_name # 重启服务
systemctl enable service_name # 启用服务(开机自启)
systemctl disable service_name # 禁用服务(开机不自启)
systemctl list-units --type=service # 查看所有服务
systemctl list-enabled # 查看已启用的服务
# 使用service管理服务(SysV init系统)
service service_name status
service service_name start
service service_name stop
service service_name restart
6.2 系统日志管理
Linux系统使用日志来记录系统事件和错误信息。常见的日志文件包括:
/var/log/messages # 系统消息日志
/var/log/auth.log # 认证日志
/var/log/secure # 安全日志
/var/log/boot.log # 启动日志
/var/log/cron # 定时任务日志
/var/log/maillog # 邮件日志
/var/log/httpd # Apache日志
/var/log/mysql # MySQL日志
# 查看日志文件
cat /var/log/messages
tail -f /var/log/messages # 实时查看日志
# 使用journalctl查看systemd日志
journalctl
journalctl -u service_name # 查看指定服务的日志
journalctl --since "1 hour ago" # 查看最近1小时的日志
journalctl --tail 100 # 查看最近100条日志
6.3 系统备份和恢复
# 使用tar命令备份文件和目录
tar -cvf backup.tar /path/to/directory # 创建备份
tar -cvzf backup.tar.gz /path/to/directory # 创建压缩备份
tar -xvf backup.tar # 恢复备份
tar -xvzf backup.tar.gz # 恢复压缩备份
# 使用dd命令备份磁盘和分区
dd if=/dev/sda of=/dev/sdb bs=4M # 备份整个磁盘
dd if=/dev/sda1 of=partition.img bs=4M # 备份分区
dd if=partition.img of=/dev/sda1 bs=4M # 恢复分区
# 使用rsync命令同步文件和目录
rsync -av /source/directory /destination/directory # 同步目录
rsync -av -e ssh /source/directory user@remote_host:/destination/directory # 远程同步
6.4 系统性能监控
# 查看CPU使用情况
top
mpstat
vmstat
# 查看内存使用情况
free -h
vmstat
# 查看磁盘使用情况
df -h
iostat
# 查看网络使用情况
netstat -tuln
ss -tuln
iptraf
iftop
# 查看系统负载
uptime
w
# 使用sar命令收集系统性能数据
sar -u 1 10 # 每1秒收集一次CPU使用情况,共收集10次
sar -r 1 10 # 每1秒收集一次内存使用情况,共收集10次
sar -n DEV 1 10 # 每1秒收集一次网络使用情况,共收集10次
7. 软件包管理
7.1 Debian/Ubuntu系统的软件包管理
# 更新软件包列表
apt update
# 升级软件包
apt upgrade
apt full-upgrade
# 安装软件包
apt install package_name
apt install package1 package2 # 安装多个软件包
# 卸载软件包
apt remove package_name
apt purge package_name # 卸载软件包并删除配置文件
# 搜索软件包
apt search package_name
# 查看软件包信息
apt show package_name
# 清理缓存
apt clean
apt autoclean
# 自动移除不需要的依赖
apt autoremove
7.2 CentOS/RHEL系统的软件包管理
# 更新软件包
yum update
dnf update # CentOS 8+使用dnf
# 安装软件包
yum install package_name
dnf install package_name # CentOS 8+使用dnf
# 卸载软件包
yum remove package_name
dnf remove package_name # CentOS 8+使用dnf
# 搜索软件包
yum search package_name
dnf search package_name # CentOS 8+使用dnf
# 查看软件包信息
yum info package_name
dnf info package_name # CentOS 8+使用dnf
# 清理缓存
yum clean all
dnf clean all # CentOS 8+使用dnf
# 列出已安装的软件包
yum list installed
dnf list installed # CentOS 8+使用dnf
7.3 从源码编译安装软件
# 下载源码包
wget https://example.com/package-version.tar.gz
# 解压源码包
tar -xvzf package-version.tar.gz
# 进入源码目录
cd package-version
# 配置
./configure
./configure --prefix=/usr/local/package # 指定安装目录
# 编译
make
# 安装
make install
# 卸载
make uninstall
8. 网络配置
8.1 网络接口配置
# 查看网络接口信息
ifconfig
ip addr
# 启用/禁用网络接口
ifup interface_name
ifdown interface_name
ip link set interface_name up
ip link set interface_name down
# 配置网络接口(临时)
ip addr add ip_address/netmask dev interface_name
ip route add default via gateway_ip
# 配置网络接口(永久)
# Debian/Ubuntu系统
/etc/network/interfaces
# CentOS/RHEL系统
/etc/sysconfig/network-scripts/ifcfg-interface_name
# systemd网络配置
/etc/systemd/network/
8.2 DNS配置
# 配置DNS服务器
/etc/resolv.conf
# 添加DNS服务器
nameserver 8.8.8.8
nameserver 8.8.4.4
# 测试DNS解析
nslookup example.com
dig example.com
host example.com
8.3 防火墙配置
# 使用iptables配置防火墙
# 查看规则
iptables -L
iptables -L -n
# 添加规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许SSH连接
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTP连接
iptables -A INPUT -j DROP # 拒绝所有其他入站连接
# 保存规则
# Debian/Ubuntu系统
iptables-save > /etc/iptables/rules.v4
# CentOS/RHEL系统
iptables-save > /etc/sysconfig/iptables
# 使用firewalld配置防火墙(CentOS 7+)
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --reload