Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议,支持32位和64位硬件。

作为一名程序员,Linux是我们必须掌握的基本技能之一。无论是服务器运维、后端开发、云计算、大数据,还是嵌入式开发,Linux都无处不在。今天就来分享Linux操作系统的完整学习指南,从入门到精通。

Linux简介

1. 什么是Linux

Linux是一种自由和开放源码的类UNIX操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。

Linux的特点:

  • 开源免费:Linux的源代码完全开放,任何人都可以免费使用、修改和分发
  • 稳定可靠:Linux系统非常稳定,可以长时间运行而不需要重启,适合作为服务器操作系统
  • 安全性能好:Linux的用户权限管理严格,病毒和恶意软件较少,安全性较高
  • 多用户多任务:Linux支持多用户同时登录,支持多任务同时运行
  • 网络功能强大:Linux内置了强大的网络功能,支持各种网络协议和服务
  • 可移植性好:Linux可以运行在各种硬件平台上,从嵌入式设备到超级计算机
  • 丰富的软件生态:Linux有大量的开源软件和工具,几乎可以满足各种需求

2. Linux的历史

Linux的诞生要追溯到1991年,芬兰赫尔辛基大学的学生林纳斯·托瓦兹(Linus Torvalds)在Minix(一个小型的类UNIX操作系统)的基础上,开发了一个新的操作系统内核,这就是Linux内核。

1991年9月17日,Linus Torvalds在comp.os.minix新闻组上发布了Linux内核的第一个版本0.01版,并公开了源代码。他在帖子中写道:"我正在做一个(免费的)操作系统,只是一个业余爱好,不会像gnu那样大和专业。"

谁也没有想到,这个"业余爱好"的操作系统,后来会成为世界上最流行的服务器操作系统,运行在全球绝大多数的服务器、超级计算机、移动设备(Android)上。

Linux的发展离不开开源社区的贡献。全世界的程序员都在为Linux贡献代码,包括个人开发者、大学研究机构、以及IBM、Google、Red Hat、Intel等大公司。Linux内核从最初的几万行代码,发展到现在的数千万行代码,成为人类历史上最大的开源协作项目之一。

3. Linux发行版

Linux内核本身只是一个操作系统内核,还需要配合各种软件和工具,才能成为一个完整可用的操作系统。不同的组织和社区,将Linux内核和各种软件打包在一起,形成了不同的Linux发行版(Distribution)。

常见的Linux发行版:

  • Ubuntu:基于Debian,以易用性著称,适合桌面用户和初学者,也广泛用于服务器
  • Debian:社区驱动的发行版,稳定可靠,是很多其他发行版的基础
  • CentOS:基于Red Hat Enterprise Linux(RHEL)的社区版,稳定可靠,广泛用于企业服务器
  • Red Hat Enterprise Linux(RHEL):商业版Linux,企业级支持,广泛用于企业服务器
  • Fedora:Red Hat赞助的社区发行版,软件版本较新,适合桌面和开发
  • Arch Linux:滚动更新的发行版,轻量灵活,适合高级用户
  • openSUSE:德国SUSE公司的社区版,稳定易用,有YaST配置工具
  • SUSE Linux Enterprise Server(SLES):商业版Linux,企业级支持
  • Alpine Linux:轻量级Linux发行版,基于musl libc和BusyBox,适合容器和嵌入式
  • Kali Linux:基于Debian的安全测试发行版,预装了大量安全工具
  • Deepin:国产Linux发行版,桌面界面美观,适合国内用户

选择Linux发行版,要根据自己的需求和使用场景。桌面使用推荐Ubuntu、Fedora、Deepin;服务器使用推荐CentOS、Ubuntu Server、Debian;容器使用推荐Alpine;安全测试推荐Kali。

Linux基础命令

Linux命令是我们使用Linux的基础,掌握常用的Linux命令,是学习Linux的第一步。

1. 文件和目录操作

# 列出目录内容
ls                    # 列出当前目录内容
ls -l                 # 长格式列出,显示详细信息
ls -a                 # 显示所有文件,包括隐藏文件
ls -lh                # 人性化显示文件大小(K、M、G)
ls -R                 # 递归列出子目录内容

# 切换目录
cd /path/to/dir       # 切换到指定目录
cd ..                 # 切换到上一级目录
cd ~                  # 切换到用户主目录
cd -                  # 切换到上一次所在目录

# 显示当前目录
pwd                   # 显示当前工作目录的绝对路径

# 创建目录
mkdir dirname         # 创建目录
mkdir -p dir1/dir2    # 递归创建多级目录

# 删除文件或目录
rm filename           # 删除文件
rm -r dirname         # 递归删除目录及其内容
rm -f filename        # 强制删除,不提示
rm -rf dirname        # 强制递归删除目录(危险!)

# 复制文件或目录
cp source dest        # 复制文件
cp -r source dest     # 递归复制目录
cp -i source dest     # 覆盖前提示

# 移动或重命名
mv source dest        # 移动文件或目录,也可用于重命名
mv -i source dest     # 覆盖前提示

# 查看文件内容
cat filename          # 查看文件全部内容
more filename         # 分页查看文件内容(向下翻页)
less filename         # 分页查看文件内容(可上下翻页,功能更强)
head filename         # 查看文件前10行
head -n 20 filename   # 查看文件前20行
tail filename         # 查看文件后10行
tail -n 20 filename   # 查看文件后20行
tail -f filename      # 实时跟踪文件末尾(常用于查看日志)

# 文件统计
wc filename           # 统计文件的行数、单词数、字符数
wc -l filename        # 只统计行数
wc -c filename        # 只统计字符数

# 查找文件
find /path -name "*.txt"    # 按文件名查找
find /path -type f           # 查找所有文件
find /path -type d           # 查找所有目录
find /path -size +10M        # 查找大于10M的文件
find /path -mtime -7         # 查找7天内修改过的文件

# 查找文件内容
grep "pattern" filename      # 在文件中查找匹配的行
grep -r "pattern" /path      # 递归查找目录下所有文件
grep -i "pattern" filename   # 忽略大小写
grep -v "pattern" filename   # 显示不匹配的行
grep -n "pattern" filename   # 显示行号
grep -c "pattern" filename   # 统计匹配的行数

2. 系统信息和管理

# 系统信息
uname -a              # 显示系统所有信息
uname -r              # 显示内核版本
hostname              # 显示主机名
cat /etc/os-release   # 显示操作系统发行版信息
cat /etc/redhat-release  # CentOS/RHEL显示版本信息
lsb_release -a        # 显示发行版信息(需要安装lsb-release)

# 硬件信息
lscpu                 # 显示CPU信息
free -h               # 显示内存使用情况(人性化)
df -h                 # 显示磁盘使用情况(人性化)
du -sh /path          # 显示目录大小
du -h --max-depth=1 /path  # 显示一级子目录大小
lsblk                 # 显示块设备信息
lspci                 # 显示PCI设备信息
lsusb                 # 显示USB设备信息

# 进程管理
ps                    # 显示当前终端的进程
ps aux                # 显示所有进程的详细信息
ps -ef                # 显示所有进程(另一种格式)
top                   # 实时显示进程和系统资源使用情况
htop                  # 增强版top(需要安装)
kill PID              # 终止指定PID的进程
kill -9 PID           # 强制终止进程
killall processname   # 按进程名终止进程
pstree                # 显示进程树

# 服务管理(Systemd)
systemctl start service     # 启动服务
systemctl stop service      # 停止服务
systemctl restart service   # 重启服务
systemctl status service    # 查看服务状态
systemctl enable service    # 设置开机自启
systemctl disable service   # 取消开机自启
systemctl list-units --type=service  # 列出所有服务

# 关机和重启
shutdown -h now       # 立即关机
shutdown -h +10       # 10分钟后关机
shutdown -r now       # 立即重启
reboot                # 重启
poweroff              # 关机

3. 用户和权限管理

# 用户管理
whoami                # 显示当前用户名
who                   # 显示当前登录的用户
w                     # 显示登录用户及其操作
id                    # 显示用户ID和组ID
useradd username      # 创建用户
passwd username       # 设置用户密码
userdel username      # 删除用户
usermod -aG group username  # 将用户添加到组
su - username         # 切换用户
sudo command          # 以管理员权限执行命令

# 组管理
groupadd groupname    # 创建组
groupdel groupname    # 删除组
groups username       # 显示用户所属的组

# 文件权限
chmod 755 filename    # 修改文件权限(数字方式)
chmod u+x filename    # 给文件所有者添加执行权限
chmod g+w filename    # 给文件所属组添加写权限
chmod o-r filename    # 取消其他用户的读权限
chown user:group filename  # 修改文件所有者和所属组
chown -R user:group /path  # 递归修改目录所有者

# 权限说明
# r=4(读), w=2(写), x=1(执行)
# 755 = rwxr-xr-x(所有者读写执行,组和其他读执行)
# 644 = rw-r--r--(所有者读写,组和其他只读)
# 777 = rwxrwxrwx(所有人都有所有权限,不推荐)

4. 网络管理

# 网络信息
ip addr               # 显示网络接口信息
ifconfig              # 显示网络接口信息(旧命令,需要安装net-tools)
ip route              # 显示路由表
route -n              # 显示路由表(旧命令)
ping host             # 测试网络连通性
ping -c 4 host        # 发送4个包后停止
traceroute host       # 追踪网络路径
mtr host              # 结合ping和traceroute的网络诊断工具

# 端口和连接
netstat -tlnp         # 显示监听的TCP端口
ss -tlnp              # 显示监听的TCP端口(新命令)
netstat -anp          # 显示所有网络连接
lsof -i :port         # 查看占用指定端口的进程
curl URL              # 发送HTTP请求
wget URL              # 下载文件

# 域名解析
nslookup domain       # 查询域名解析
dig domain            # 查询域名解析(更详细)
host domain           # 查询域名解析

# 防火墙(firewalld)
firewall-cmd --state                    # 查看防火墙状态
firewall-cmd --list-all                 # 查看所有规则
firewall-cmd --permanent --add-port=80/tcp   # 永久开放80端口
firewall-cmd --permanent --remove-port=80/tcp  # 永久关闭80端口
firewall-cmd --reload                   # 重新加载防火墙规则

# 防火墙(ufw,Ubuntu常用)
ufw status            # 查看防火墙状态
ufw enable            # 启用防火墙
ufw disable           # 禁用防火墙
ufw allow 80/tcp      # 允许80端口
ufw deny 80/tcp       # 拒绝80端口
ufw delete allow 80/tcp  # 删除规则

5. 软件包管理

# Debian/Ubuntu(apt)
apt update            # 更新软件包列表
apt upgrade           # 升级所有可升级的软件包
apt install package   # 安装软件包
apt remove package    # 卸载软件包(保留配置)
apt purge package     # 卸载软件包(删除配置)
apt autoremove        # 自动删除不需要的依赖包
apt search keyword    # 搜索软件包
apt show package      # 显示软件包信息
dpkg -l               # 列出所有已安装的软件包
dpkg -i package.deb   # 安装本地deb包

# CentOS/RHEL(yum/dnf)
yum install package   # 安装软件包
yum remove package    # 卸载软件包
yum update            # 升级所有软件包
yum search keyword    # 搜索软件包
yum info package      # 显示软件包信息
yum list installed    # 列出已安装的软件包
yum clean all         # 清理缓存
dnf install package   # dnf是yum的下一代(CentOS 8+)

# 源码编译安装
./configure           # 配置编译环境
make                  # 编译
make install          # 安装

Linux文件系统

1. 文件系统结构

Linux的文件系统是一个树形结构,根目录是"/",所有文件和目录都在根目录下。

/                  # 根目录
├── bin/           # 基本命令二进制文件
├── boot/          # 启动引导文件
├── dev/           # 设备文件
├── etc/           # 系统配置文件
├── home/          # 用户主目录
├── lib/           # 系统库文件
├── lib64/         # 64位系统库文件
├── media/         # 可移动设备挂载点
├── mnt/           # 临时挂载点
├── opt/           # 可选软件安装目录
├── proc/          # 进程和系统信息虚拟文件系统
├── root/          # root用户主目录
├── run/           # 运行时数据
├── sbin/          # 系统管理二进制文件
├── srv/           # 服务数据
├── sys/           # 系统设备虚拟文件系统
├── tmp/           # 临时文件
├── usr/           # 用户软件和数据
│   ├── bin/       # 用户命令
│   ├── lib/       # 用户库
│   ├── local/     # 本地安装软件
│   ├── sbin/      # 系统管理命令
│   └── share/     # 共享数据
└── var/           # 可变数据
    ├── log/       # 日志文件
    ├── www/       # Web网站根目录
    ├── lib/       # 可变状态数据
    ├── tmp/       # 临时文件
    └── spool/     # 邮件、打印等队列

2. 重要目录说明

  • /etc:系统配置文件目录,几乎所有的系统配置文件都在这里,如网络配置、服务配置、用户配置等
  • /var/log:日志文件目录,系统日志、服务日志都在这里,排查问题时经常需要查看
  • /home:普通用户的主目录,每个用户在/home下有一个以用户名命名的目录
  • /root:root用户(超级管理员)的主目录
  • /usr/local:本地安装软件的目录,手动编译安装的软件通常放在这里
  • /opt:可选软件安装目录,一些第三方软件会安装在这里
  • /tmp:临时文件目录,系统和程序会在这里存放临时文件,重启后可能被清空
  • /dev:设备文件目录,Linux中一切皆文件,硬件设备也以文件的形式存在这里

3. 常见文件系统类型

  • ext4:Linux最常用的文件系统,稳定可靠,支持大文件和大分区
  • xfs:高性能文件系统,适合大文件和高并发,CentOS 7+默认文件系统
  • btrfs:下一代文件系统,支持快照、子卷、数据校验等高级功能
  • swap:交换分区,用于内存不足时将内存数据交换到磁盘
  • vfat/fat32:Windows和Linux都支持的文件系统,常用于U盘
  • ntfs:Windows的文件系统,Linux需要安装ntfs-3g才能读写
  • nfs:网络文件系统,用于在网络上共享文件

Linux常用服务配置

1. Nginx Web服务器

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它以高并发、低内存占用、稳定性好著称,是目前最流行的Web服务器之一。

# 安装Nginx(CentOS)
yum install nginx

# 安装Nginx(Ubuntu)
apt install nginx

# 管理Nginx服务
systemctl start nginx      # 启动
systemctl stop nginx       # 停止
systemctl restart nginx    # 重启
systemctl reload nginx     # 重新加载配置(不中断服务)
systemctl status nginx     # 查看状态
systemctl enable nginx     # 开机自启

# Nginx配置文件
# 主配置文件:/etc/nginx/nginx.conf
# 站点配置目录:/etc/nginx/conf.d/ 或 /etc/nginx/sites-available/
# 默认网站根目录:/usr/share/nginx/html 或 /var/www/html
# 日志目录:/var/log/nginx/

# 测试配置文件是否正确
nginx -t

# 查看Nginx版本
nginx -v

2. MySQL/MariaDB数据库

MySQL是最流行的开源关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MariaDB是MySQL的一个分支,由MySQL的原始开发者创建,完全兼容MySQL。

# 安装MySQL(CentOS)
yum install mysql-server

# 安装MariaDB(CentOS)
yum install mariadb-server

# 安装MySQL(Ubuntu)
apt install mysql-server

# 管理MySQL服务
systemctl start mysqld     # 启动
systemctl stop mysqld      # 停止
systemctl restart mysqld   # 重启
systemctl status mysqld    # 查看状态
systemctl enable mysqld    # 开机自启

# 登录MySQL
mysql -u root -p

# MySQL配置文件
# /etc/my.cnf 或 /etc/mysql/my.cnf
# 数据目录:/var/lib/mysql
# 日志目录:/var/log/mysql

# 常用MySQL命令
mysql> SHOW DATABASES;                    # 显示所有数据库
mysql> CREATE DATABASE dbname;             # 创建数据库
mysql> USE dbname;                         # 切换数据库
mysql> SHOW TABLES;                        # 显示所有表
mysql> DESCRIBE tablename;                 # 显示表结构
mysql> SELECT * FROM tablename;            # 查询数据
mysql> exit;                               # 退出

3. Redis缓存

Redis是一个开源的、基于内存的、高性能的键值对数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。它常用于缓存、消息队列、会话存储、排行榜等场景。

# 安装Redis(CentOS,需要EPEL源)
yum install epel-release
yum install redis

# 安装Redis(Ubuntu)
apt install redis-server

# 管理Redis服务
systemctl start redis      # 启动
systemctl stop redis       # 停止
systemctl restart redis    # 重启
systemctl status redis     # 查看状态
systemctl enable redis     # 开机自启

# Redis配置文件
# /etc/redis.conf 或 /etc/redis/redis.conf
# 常用配置:
# bind 127.0.0.1        # 监听地址
# port 6379              # 监听端口
# requirepass password   # 设置密码
# maxmemory 256mb        # 最大内存
# maxmemory-policy allkeys-lru  # 内存淘汰策略

# 连接Redis
redis-cli
redis-cli -h host -p port -a password

# 常用Redis命令
redis> SET key value      # 设置键值
redis> GET key            # 获取值
redis> DEL key            # 删除键
redis> EXISTS key         # 判断键是否存在
redis> EXPIRE key 60      # 设置过期时间(秒)
redis> KEYS *             # 列出所有键(生产环境慎用)
redis> INFO               # 查看服务器信息
redis> FLUSHALL           # 清空所有数据库(危险!)

4. PHP-FPM

PHP-FPM(PHP FastCGI Process Manager)是PHP的FastCGI进程管理器,用于管理PHP进程,处理PHP请求。它与Nginx配合使用,是目前最流行的PHP运行方式。

# 安装PHP和PHP-FPM(CentOS)
yum install php php-fpm php-mysql php-gd php-mbstring php-xml php-curl

# 安装PHP和PHP-FPM(Ubuntu)
apt install php php-fpm php-mysql php-gd php-mbstring php-xml php-curl

# 管理PHP-FPM服务
systemctl start php-fpm    # 启动
systemctl stop php-fpm     # 停止
systemctl restart php-fpm  # 重启
systemctl status php-fpm   # 查看状态
systemctl enable php-fpm   # 开机自启

# PHP-FPM配置文件
# /etc/php-fpm.conf 或 /etc/php/7.4/fpm/php-fpm.conf
# 池配置目录:/etc/php-fpm.d/ 或 /etc/php/7.4/fpm/pool.d/
# PHP配置文件:/etc/php.ini 或 /etc/php/7.4/fpm/php.ini

# 查看PHP版本
php -v

# 查看PHP扩展
php -m

Linux安全加固

1. 基本安全措施

  • 修改默认端口:修改SSH默认端口22为其他端口,减少暴力破解
  • 禁用root登录:禁止root用户直接SSH登录,使用普通用户登录后再su或sudo
  • 使用密钥登录:使用SSH密钥对登录,禁用密码登录,提高安全性
  • 设置强密码:为所有用户设置强密码,定期更换密码
  • 最小权限原则:只给用户必要的权限,不要滥用root
  • 及时更新系统:及时安装系统安全更新,修复已知漏洞
  • 关闭不必要的服务:关闭不需要的服务和端口,减少攻击面
  • 配置防火墙:只开放必要的端口,限制访问来源

2. SSH安全配置

# SSH配置文件:/etc/ssh/sshd_config

# 修改默认端口
Port 2222

# 禁用root登录
PermitRootLogin no

# 禁用密码登录(启用密钥登录后)
PasswordAuthentication no

# 限制最大认证尝试次数
MaxAuthTries 3

# 设置登录超时时间
LoginGraceTime 30

# 禁用空密码
PermitEmptyPasswords no

# 修改配置后重启SSH服务
systemctl restart sshd

3. 防火墙配置

# firewalld配置示例
# 只开放必要的端口
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload

# 限制SSH访问来源(只允许特定IP)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'

4. 定期备份

数据备份是安全的最后一道防线。定期备份重要数据,包括网站文件、数据库、配置文件等。备份要异地存储,定期测试备份的可用性。

# 备份MySQL数据库
mysqldump -u root -p dbname > backup.sql

# 备份文件
tar -czf backup.tar.gz /path/to/files

# 自动备份脚本示例(crontab定时执行)
# 每天凌晨3点备份数据库和网站文件
0 3 * * * /usr/bin/mysqldump -u root -ppassword dbname > /backup/db_$(date +\%Y\%m\%d).sql
0 3 * * * /bin/tar -czf /backup/www_$(date +\%Y\%m\%d).tar.gz /var/www/html

学习建议

  1. 多动手实践:Linux是一门实践性很强的技能,光看教程是学不会的,一定要多动手操作。建议在虚拟机或云服务器上安装Linux,边学边练。
  1. 掌握常用命令:Linux命令很多,不需要全部记住,但是常用的命令一定要熟练掌握。遇到不熟悉的命令,善用man手册和--help参数。
  1. 理解文件系统:Linux的文件系统结构和Windows有很大不同,理解Linux的目录结构、文件权限、挂载等概念,是学好Linux的基础。
  1. 学会排查问题:Linux出问题时,要学会查看日志、分析错误信息、使用诊断工具。日志文件通常在/var/log目录下,这是排查问题的第一站。
  1. 循序渐进:Linux的内容很多,从基础命令到系统管理、网络配置、服务部署、安全加固、性能调优,要循序渐进,不要急于求成。
  1. 善用社区资源:Linux有活跃的开源社区,遇到问题可以搜索、提问。推荐Stack Overflow、Linux中国、开源中国等社区。

总结

Linux是程序员必须掌握的基本技能之一,它稳定、安全、高效,广泛应用于服务器、云计算、嵌入式、移动设备等领域。掌握Linux,不仅能提高我们的工作效率,还能让我们更深入地理解计算机系统的工作原理。

学习Linux没有捷径,只有多动手、多实践、多思考。从基础命令开始,逐步深入到系统管理、服务配置、安全加固、性能调优。相信通过不断的学习和实践,你一定能够从Linux入门到精通。

最后,送给大家一句话:"Linux不是一个操作系统,而是一种生活方式。"希望大家都能享受Linux带来的自由和乐趣!