开源之家
  • 首页
  • 精品培训视频
  • 计算机电子书
  • 软件工具
  • 知识库
    • Linux入门教程
    • Shell脚本学习指南
    • Nginx入门教程
    • Docker 入门实战
    • Kubernetes(k8s)手册
    • 快乐的Linux命令行
  • Linux命令手册
登录

Linux入门教程

01 Linux简介
  • 1.0 Linux学习路线
  • 1.1 操作系统概述
  • 1.2 Linux是什么,有哪些特点?
  • 1.3 Linux和UNIX的关系及区别(详解版)
  • 1.4 类UNIX系统是什么鬼?
  • 1.5 Linux中大量使用脚本语言,而不是C语言!
  • 1.6 为什么要学Linux,它比Windows好在哪里?
  • 1.7 Linux系统的优缺点
  • 1.8 常见Linux发行版本有哪些?
  • 1.9 初学者应选择哪个Linux发行版?
  • 1.10 Linux桌面系统大比拼|附带优缺点
  • 1.11 Linux的主要应用领域有哪些?
  • 1.12 Linux已经霸占了服务器领域!
  • 1.13 开源软件是什么?有哪些?
  • 1.14 开源协议是什么?有哪些?如何选择?
  • 1.15 开源就等于免费吗?用事实来说话
  • 1.16 Linux该如何学习(新手入门必看)
  • 1.17 想学好Linux,这些习惯必须养成(初学者必读)
02 Linux安装
  • 2.1 安装Linux系统对硬件有什么要求?
  • 2.2 虚拟机是什么
  • 2.3 为什么建议使用虚拟机来安装Linux?
  • 2.4 小白必看:零基础安装Linux系统(超级详细)
  • 2.5 使用U盘安装Linux系统
  • 2.6 使用dd命令安装Linux系统
  • 2.7 使用LiveCD从光盘直接运行Linux,无需安装
  • 2.8 忘记root账户密码怎么办?
  • 2.9 使用系统光盘修复Linux系统
  • 2.10 破解密码这么简单,Linux是安全的操作系统吗?
  • 2.11 Linux四种远程管理协议
  • 2.12 Linux两种远程管理工具(PuTTY和SecureCRT)
  • 2.13 新手必读的Linux使用注意事项
  • 2.14 Linux文件目录结构一览表
  • 2.15 Linux中一切皆文件[包含优缺点]
  • 2.16 Linux挂载详解
  • 2.17 新手必看的Linux服务器管理和维护注意事项
03 Linux文件和目录管理
  • 3.1 Linux文件系统的层次结构
  • 3.2 Linux文件系统到底有什么用处?
  • 3.3 Linux绝对路径和相对路径详解
  • 3.4 Linux文件(目录)命名规则
  • 3.5 Linux命令行下如何识别文件类型?
  • 3.6 Linux命令基本格式
  • 3.7 Linux切换目录(cd命令)
  • 3.8 Linux显示当前工作路径(pwd命令)
  • 3.9 Linux查看目录中的文件(ls命令)
  • 3.10 Linux创建目录(mkdir命令)
  • 3.11 Linux删除空目录(rmdir命令)
  • 3.12 Linux创建文件及修改文件时间戳(touch命令)
  • 3.13 Linux建立软硬链接文件(ln命令)
  • 3.14 深度剖析Linux硬链接和软链接,直击它们的本质!
  • 3.15 Linux复制文件和目录(cp命令)
  • 3.16 Linux删除文件或目录(rm命令)
  • 3.17 Linux移动或重命名文件和目录(mv命令)
  • 3.18 Linux懒人神器:命令自动补全功能!
  • 3.19 Linux命令的执行过程是怎样的?(新手必读)
  • 3.20 什么是环境变量,Linux环境变量有哪些?
  • 3.21 Linux PATH环境变量及作用(初学者必读)
04 Linux打包和压缩详解
  • 4.1 打包和压缩的概念和区别
  • 4.2 Linux tar打包命令详解
  • 4.3 Linux压缩文件或目录为.zip格式(zip命令)
  • 4.4 Linux解压.zip格式的文件(unzip命令)
  • 4.5 Linux压缩文件或目录中文件为.gz格式(gzip命令)
  • 4.6 Linux解压.gz格式的文件(gunzip命令)
  • 4.7 Linux压缩文件或目录中文件为.bz2格式(bzip2命令)
  • 4.8 Linux解压.bz2格式的文件(bunzip2命令)
05 Vim文本编辑器
  • 5.1 Vim及其安装
  • 5.2 Vi和Vim之间到底有什么关系?
  • 5.3 Linux Vim三种工作模式
  • 5.4 Linux Vim基本操作
  • 5.5 Vim移动光标命令汇总
  • 5.6 Linux Vim撤销和恢复撤销快捷键
  • 5.7 Linux Vim可视化模式
  • 5.8 Vim多窗口编辑模式
  • 5.9 Linux Vim批量注释和自定义注释
  • 5.10 Vim显示行号
  • 5.11 Vim配置文件(.vimrc)详解
06 Linux文本处理
  • 6.1 Linux连接合并文件内容(cat命令)
  • 6.2 Linux分屏显示文件内容(more命令)
  • 6.3 Linux显示文件开头内容(head命令)
  • 6.4 Linux查看文件内容(less命令)
  • 6.5 Linux显示文件结尾内容(tail命令)
  • 6.6 Linux重定向(输入输出重定向)
  • 6.7 Linux grep(Linux三剑客之一)
  • 6.8 Linux sed(Linux三剑客之一)
  • 6.9 Linux sed命令的高级玩法
  • 6.10 Linux awk(Linux三剑客之一)
  • 6.11 Linux awk命令的高级玩法
07 Linux系统软件安装
  • 7.1 Linux软件包
  • 7.2 Linux RPM包统一命名规则
  • 7.3 Linux RPM包安装、卸载和升级
  • 7.4 Linux rpm命令查询软件包
  • 7.5 Linux RPM包验证和数字证书
  • 7.6 Linux提取RPM包
  • 7.7 Linux SRPM源码包安装
  • 7.8 Linux重建RPM数据库(修复损坏的RPM数据库)
  • 7.9 RPM包的依赖性及其解决方案
  • 7.10 Linux yum源及配置
  • 7.11 Linux yum命令
  • 7.12 Linux yum管理软件组
  • 7.13 Linux源码包安装和卸载
  • 7.14 Linux源码包升级
  • 7.15 RPM包和源码包,究竟应该选择哪种安装方式?
  • 7.16 Linux函数库(静态函数库和动态函数库)及其安装过程
  • 7.17 Linux脚本程序包及安装方法详解(以webmin为例)
08 Linux用户和用户组管理
  • 8.1 Linux用户和用户组
  • 8.2 Linux UID和GID
  • 8.3 Linux /etc/passwd
  • 8.4 Linux /etc/shadow
  • 8.5 Linux /etc/group
  • 8.6 Linux /etc/gshadow
  • 8.7 Linux初始组和附加组
  • 8.8 Linux /etc/login.defs
  • 8.9 Linux系统添加新用户(useradd命令)
  • 8.10 Linux修改系统用户密码(passwd命令)
  • 8.11 Linux修改系统用户信息(usermod命令)
  • 8.12 Linux强制系统用户登陆时修改密码(chage命令)
  • 8.13 Linux删除系统用户(userdel命令)
  • 8.14 Linux查看用户的UID和GID(id命令)
  • 8.15 Linux临时切换用户身份(su命令)
  • 8.16 Linux whoami和who am i命令
  • 8.17 Linux添加用户组(groupadd命令)
  • 8.18 Linux修改用户组(groupmod命令)
  • 8.19 Linux删除用户组(groupdel命令)
  • 8.20 Linux将系统用户加入或移除群组(gpasswd命令)
  • 8.21 Linux切换用户的有效群组(newgrp命令)
09 Linux权限管理
  • 9.1 Linux权限管理的重要性
  • 9.2 Linux修改文件和目录的所属组(chgrp命令)
  • 9.3 Linux修改文件和目录的所有者和所属组(chown命令)
  • 9.4 Linux文件权限到底是如何设定的?
  • 9.5 Linux读写执行权限(-r、-w、-x)的真正含义是什么?
  • 9.6 Linux修改文件或目录权限(chmod命令)
  • 9.7 Linux默认权限的设定和修改(umask)
  • 9.8 Linux ACL访问控制权限
  • 9.9 Linux ACL权限设置(setfacl和getfacl)
  • 9.10 Linux mask有效权限有什么用,如何修改?
  • 9.11 Linux SetUID(SUID)特殊权限
  • 9.12 不要轻易设置SetUID(SUID)权限,否则会带来重大安全隐患!
  • 9.13 Linux SetGID(SGID)特殊权限
  • 9.14 Linux Stick BIT(SBIT)特殊权限
  • 9.15 Linux文件特殊权限(SUID、SGID和SBIT)的设置
  • 9.16 Linux修改文件或目录的隐藏属性(chattr命令)
  • 9.17 Linux查看文件或目录的隐藏属性(lsattr命令)
  • 9.18 Linux sudo命令(包含和su命令的对比)
  • 9.19 Linux权限对指令执行的影响
10 Linux文件系统管理
  • 10.1 硬盘结构(机械硬盘和固态硬盘)详解
  • 10.2 Linux文件系统详解
  • 10.3 Linux系统是如何识别硬盘设备和硬盘分区的?
  • 10.4 Linux df用法详解:查看文件系统硬盘使用情况
  • 10.5 Linux du命令:统计目录或文件所占磁盘空间大小
  • 10.6 Linux mount命令详解:挂载Linux系统外的文件
  • 10.7 Linux挂载光盘(使用mount命令)
  • 10.8 Linux挂载U盘(使用mount命令)
  • 10.9 Linux开机自动挂载硬件设备(配置/etc/fatab文件)
  • 10.10 修改/etc/fstab文件出错导致Linux不能启动,该怎么办?
  • 10.11 Linux umount命令:卸载文件系统
  • 10.12 Linux fsck命令:检测和修复文件系统
  • 10.13 Linux dumpe2fs命令:查看文件系统信息
  • 10.14 Linux fdisk命令详解:给硬盘分区
  • 10.15 Linux fdisk创建分区(主分区、扩展分区和逻辑分区)过程详解
  • 10.16 Linux parted命令用法详解:创建分区
  • 10.17 Linux mkfs命令详解格式化分区(为分区写入文件系统)
  • 10.18 Linux mke2fs命令格式化硬盘(给硬盘写入文件系统)
  • 10.19 Linux虚拟内存和物理内存
  • 10.20 Linux swap分区及作用详解
11 Linux高级文件系统管理
  • 11.1 磁盘配额是什么
  • 11.2 磁盘配额启动前的准备工作
  • 11.3 Linux扫描文件系统并建立磁盘配额记录文件(quotacheck命令)
  • 11.4 Linux开启磁盘配额限制(quotaon命令)
  • 11.5 Linux关闭磁盘配额限制(quotaoff命令)
  • 11.6 Linux修改用户(群组)的磁盘配额(edquota命令)
  • 11.7 Linux非交互式设置磁盘配额(setquota命令)
  • 11.8 Linux查询已建立好的磁盘配额(quota和repquota命令)
  • 11.9 Linux磁盘配额测试过程完全攻略
  • 11.10 Linux LVM逻辑卷管理机制
  • 11.11 Linux PV物理卷
  • 11.12 Linux VG卷组
  • 11.13 Linux LV逻辑卷
  • 11.14 Linux LVM(逻辑卷管理)的删除
  • 11.15 Linux RAID(磁盘阵列)完全攻略
  • 11.16 使用图形界面来配置RAID
  • 11.17 使用mdadm命令来配置RAID
12 Linux系统管理
  • 12.1 Linux进程管理
  • 12.2 Linux进程启动的方式有几种?
  • 12.3 Linux如何查看正在运行的进程(ps命令)
  • 12.4 Linux实时监听进程运行状态(top命令)
  • 12.5 Linux查看进程树(pstree命令)
  • 12.6 Linux列出进程调用或打开的文件信息(lsof命令)
  • 12.7 Linux进程优先级
  • 12.8 Linux调整进程的优先级(nice和renice命令)
  • 12.9 Linux常用信号(进程间通信)
  • 12.10 Linux终止进程(kill命令)
  • 10.11 Linux umount命令:卸载文件系统
  • 10.12 Linux fsck命令:检测和修复文件系统
  • 10.13 Linux dumpe2fs命令:查看文件系统信息
  • 10.14 Linux fdisk命令详解:给硬盘分区
  • 10.15 Linux fdisk创建分区(主分区、扩展分区和逻辑分区)过程详解
  • 10.16 Linux parted命令用法详解:创建分区
  • 10.17 Linux mkfs命令详解格式化分区(为分区写入文件系统)
  • 10.18 Linux mke2fs命令格式化硬盘(给硬盘写入文件系统)
  • 10.19 Linux虚拟内存和物理内存
  • 10.20 Linux swap分区及作用详解
13 Linux数据备份与恢复
  • 13.1 Linux备份的重要性
  • 13.2 Linux中的哪些数据需要备份?
  • 13.3 Linux数据备份介质的选择
  • 13.4 Linux备份策略
  • 13.5 Linux tar命令备份数据
  • 13.6 Linux dump
  • 13.7 Linux restore
  • 13.8 Linux dd
  • 13.9 Linux rsync命令:支持本地备份和远程备份
14 Linux系统服务管理
  • 14.1 Linux系统服务
  • 14.2 Linux端口
  • 14.3 Linux独立服务管理
  • 14.4 Linux基于xinetd服务的管理
  • 14.5 Linux源码包服务管理
  • 14.6 Linux常见服务类别及功能
  • 14.7 影响Linux系统性能的因素有哪些?
  • 14.8 Linux分析系统性能(sar命令)
  • 14.9 Linux如何查看CPU运行状态?
  • 14.10 Linux如何查看内存的使用情况?
  • 14.11 Linux如何查看硬盘的读写性能?
15 Linux系统日志管理
  • 15.1 Linux rsyslogd服务
  • 15.2 Linux日志文件及功能
  • 15.3 Linux日志文件的格式分析
  • 15.4 rsyslogd配置文件格式及其内容
  • 15.5 Linux日志服务器设置
  • 15.6 Linux日志轮替(日志转储)
  • 15.7 Linux logrotate命令
  • 15.8 Linux日志分析工具
16 Linux系统启动管理
  • 16.1 Linux系统启动流程
  • 16.2 BIOS开机自检
  • 16.3 主引导目录(MBR)结构及作用
  • 16.4 Linux内核(内核模块)的加载
  • 16.5 Linux /sbin/init
  • 16.6 Linux /etc/inittab
  • 16.7 Linux /etc/rc.d/rc.local配置文件
  • 16.8 Linux启动引导程序加载内核
  • 16.9 Linux /boot/grub/目录
  • 16.10 Linux GRUB磁盘分区表示法
  • 16.11 Linux GRUB配置文件
  • 16.12 Linux多系统并存的GRUB配置文件
  • 16.13 Linux GRUB手动安装
  • 16.14 Linux GRUB加密
  • 16.15 Linux字符界面调整分辨率
  • 16.16 Linux内核模块管理
  • 16.17 Linux NTFS文件系统安装
17 LAMP环境搭建和LNMP环境搭建
  • 17.1 Linux LAMP环境搭建的前期准备
  • 17.2 Linux libxml2安装
  • 17.3 Linux libmcrypt安装
  • 17.4 Linux mhash和mcrypt安装
  • 17.5 Linux zlib和libpng安装
  • 17.6 Linux jpeg6安装
  • 17.7 Linux freetype安装
  • 17.8 Linux gd库安装
  • 17.9 Linux Apache安装
  • 17.10 Linux ncurses安装
  • 17.11 Linux MySQL安装
  • 17.12 Linux PHP安装
  • 17.13 Linux memcache安装和配置
  • 17.14 Linux phpmyadmin安装及配置
  • 17.15 LNMP安装的前期准备
  • 17.16 LNMP一键安装
  • 17.17 LNMP安装php扩展模块
18 SELinux管理
  • 18.1 SELinux是什么
  • 18.2 SELinux的主要作用
  • 18.3 SELinux 的3种工作模式
  • 18.4 SELinux配置文件(/etc/selinux/config)
  • 18.5 SELinux工作模式设置
  • 18.6 SELinux安全上下文查看
  • 18.7 SELinux安全上下文的修改和设置
  • 18.8 SELinux默认安全上下文的查询和修改
  • 18.9 SELinux auditd日志系统的安装与启动
  • 18.10 SELinux auditd日志使用方法
  • 18.11 SELinux的3种策略类型
  • 18.12 SELinux策略规则查看的方法
  • 18.13 SELinux策略规则的开启和关闭

Shell脚本学习指南

01 Shell基础
  • 1.1 Shell是什么
  • 1.2 Shell是运维人员必须掌握的技能
  • 1.3 常用的Shell有哪些?
  • 1.4 进入Shell的两种方式
  • 1.5 Shell命令的基本格式
  • 1.6 Shell命令的本质到底是什么?如何自己实现一个命令?
  • 1.7 Shell命令的选项和参数在本质上是什么
  • 1.8 Shell命令提示符
  • 1.9 修改命令提示符
  • 1.10 第一个Shell脚本
  • 1.11 执行Shell脚本
  • 1.12 Shell四种运行方式
  • 1.13 Shell配置文件的加载
  • 1.14 如何编写自己的Shell配置文件?
02 Shell编程
  • 2.1 Shell变量
  • 2.2 Linux中的文件描述符到底是什么?
  • 2.3 Shell命令替换
  • 2.4 Shell位置参数
  • 2.5 Shell特殊变量
  • 2.6 Shell $*和$@之间的区别
  • 2.7 Shell $?
  • 2.8 Shell字符串详解
  • 2.9 Shell字符串拼接
  • 2.10 Shell字符串截取
  • 2.11 Shell数组
  • 2.12 Shell获取数组长度
  • 2.13 Shell数组拼接
  • 2.14 Shell删除数组元素
  • 2.15 Shell关联数组
  • 2.16 Shell内建命令
  • 2.17 Shell alias命令
  • 2.18 Shell echo命令
  • 2.19 Shell read命令
  • 2.20 Shell exit命令
  • 2.21 Shell declare和typeset命令
  • 2.22 Shell数学计算
  • 2.23 Shell (())
  • 2.24 Shell let命令
  • 2.25 Shell $[]
  • 2.26 Shell expr命令
  • 2.27 Linux bc命令
  • 2.28 Shell declare -i
  • 2.29 Shell if else
  • 2.30 Shell退出状态
  • 2.31 Shell test命令
  • 2.32 Shell [[]]
  • 2.33 Shell case in
  • 2.34 Shell while
  • 2.35 Shell until
  • 2.36 Shell for
  • 2.37 Shell select in
  • 2.38 Shell break和continue
  • 2.39 Shell函数
  • 2.40 Shell函数参数
  • 2.41 Shell函数返回值精讲
03 Shell高级教程
  • 3.1 Shell重定向
  • 3.2 Linux中的文件描述符到底是什么?
  • 3.3 结合文件描述符谈重定向,彻底理解重定向的本质!
  • 3.4 使用exec命令操作文件描述符
  • 3.5 使用exec命令操作文件描述符
  • 3.6 Shell Here Document
  • 3.7 Shell Here String
  • 3.8 Shell组命令
  • 3.9 Shell进程替换
  • 3.10 Linux管道
  • 3.11 Shell过滤器
  • 3.12 子Shell和子进程到底有什么区别?
  • 3.13 如何检测子Shell和子进程?
  • 3.14 Linux中的信号是什么
  • 3.15 Bash Shell中的信号
  • 3.16 Linux进程简明教程
  • 3.17 使用什么命令查看进程
  • 3.18 Shell向进程发送信号
  • 3.19 使用trap命令获取信号
  • 3.20 trap命令捕获信号实例演示
  • 3.21 移除(重置)信号捕获
  • 3.22 关于进程、信号和捕获的总结
  • 3.23 Shell模块化
04 Bash Shell快捷键
  • 4.1 Bash Shell快捷键大全
  • 4.2 Bash Shell命令自动补全功能
  • 4.3 Bash Shell历史命令

Nginx入门教程

01 Nginx基础
  • 1.1 前言
  • 1.2 Nginx 简介
  • 1.3 Nginx 源码架构分析
  • 1.4 Nginx 编译安装
  • 1.5 Tengine 编译安装
  • 1.6 OpenResty 编译安装
  • 1.7 Nginx 配置简述
  • 1.8 Nginx Docker 容器化配置
02 Nginx核心配置
  • 2.1 Nginx 核心配置指令
  • 2.2 Nginx 配置文件
  • 2.3 Nginx 进程配置指令
  • 2.4 Nginx 端口监听
  • 2.5 Nginx 主机名
  • 2.6 Nginx 处理HTTP请求
  • 2.7 Nginx 路由匹配规则
  • 2.8 Nginx 重定向配置
  • 2.9 Nginx 根目录配置
  • 2.10 Nginx 访问路径别名
  • 2.11 Nginx 文件判断
  • 2.12 Nginx 零复制
  • 2.13 Nginx 日志记录配置
03 Nginx HTTP模块
  • 3.1 Nginx 镜像模块
  • 3.2 Nginx 请求头控制模块
  • 3.3 Nginx IP访问控制模块
  • 3.4 Nginx 用户cookie模块
  • 3.5 Nginx 并发连接数限制模块
  • 3.6 Nginx 首页处理模块
  • 3.7 Nginx 请求频率限制模块
  • 3.8 Nginx 页面缓存时间配置
  • 3.9 Nginx gzip压缩及相关配置
04 Nginx Web服务
  • 4.1 Nginx 静态资源服务器搭建
  • 4.2 Nginx 文件下载服务器搭建
  • 4.3 Nginx 伪动态SSI服务器
  • 4.4 Nginx HTTPS服务器搭建
  • 4.5 Nginx FastCGI模块配置简述
  • 4.6 Nginx PHP服务器环境搭建
  • 4.7 Nginx 基于FastCGI负载均衡
  • 4.8 Nginx CGI网关接口
  • 4.9 Nginx uWSGI模块配置
  • 4.10 Nginx Python项目部署
  • 4.11 Nginx 伪流媒体服务器搭建
  • 4.12 Nginx HTTP2模块配置简述
  • 4.13 Nginx WebDAV模块配置简述
05 Nginx 代理服务器
  • 5.1 Nginx HTTP代理服务器
  • 5.2 Nginx stream模块简述
  • 5.3 Nginx TCPUDP代理简述
  • 5.4 Nginx 基于SSL的TCP代理服务器
  • 5.5 Nginx gRPC代理服务器
06 Nginx 缓存
  • 6.1 Nginx Web缓存配置
  • 6.2 Nginx 代理缓存配置
  • 6.3 Nginx Memcached 缓存模块
  • 6.4 Nginx 反向代理缓存服务器配置
  • 6.5 Nginx 客户端缓存控制
07 Nginx 负载均衡
  • 7.6 Nginx TCPUDP负载均衡
  • 7.5 Nginx upstream动态更新
  • 7.4 Nginx upstream容错机制
  • 7.3 Nginx 长连接负载均衡
  • 7.2 Nginx 负载均衡策略
  • 7.1 Nginx 负载均衡模块
08 Nginx 日志管理监控
  • 8.1 Nginx 日志分析简述
  • 8.2 Nginx 访问日志配置
  • 8.3 Nginx 错误日志配置
  • 8.4 Nginx 日志归档配置
  • 8.5 Nginx 日志分析工具 ELK
  • 8.6 Nginx 监控工具 Prometheus
09 Nginx 集群
  • 9.1 LVS简介
  • 9.2 Keepalived 配置简述
  • 9.3 Nginx 集群负载搭建
  • 9.4 Nginx 集群配置管理规划
  • 9.5 Nginx 配置归档工具GitLab
  • 9.6 Nginx 配置修改工具Ansible
  • 9.7 Jenkins 安装与配置简述
  • 9.8 Nginx 集群配置管理实例
10 Nginx 在 k8s 的应用
  • 10.1 Kubernetes(k8s)系统简述
  • 10.2 Kubernetes(k8s)集群部署
  • 10.3 Kubernetes(k8s)网络通信
  • 10.4 Nginx Ingress 简介
  • 10.5 Nginx Ingress 安装部署
  • 10.6 Nginx Ingress 配置映射
  • 10.7 Nginx Ingress 注解

Docker 入门实战

01 Docker基础
  • 1.1 前言
  • 1.2 Docker 架构
02 Docker安装
  • 2.1 CentOS Docker 安装
  • 2.2 Ubuntu Docker 安装
  • 2.3 Debian Docker 安装
  • 2.4 Windows Docker 安装
  • 2.5 MacOS Docker 安装
  • 2.6 Docker 镜像加速
03 Docker 使用
  • 3.1 Docker Hello World
  • 3.2 Docker 容器使用
  • 3.3 Docker 镜像使用
  • 3.4 Docker 容器连接
  • 3.5 Docker 仓库管理
  • 3.6 Docker Dockerfile
  • 07 Docker Compose
  • 08 Docker Machine
  • 09 Swarm 集群管理
04 Docker 实例
  • 4.1 Docker 安装 Ubuntu
  • 4.2 Docker 安装 CentOS
  • 4.3 Docker 安装 Nginx
  • 4.4 Docker 安装 Node.js
  • 4.5 Docker 安装 PHP
  • 4.6 Docker 安装 MySQL
  • 4.7 Docker 安装 Tomcat
  • 4.8 Docker 安装 Python
  • 4.9 Docker 安装 Redis
  • 4.10 Docker 安装 MongoDB
  • 4.11 Docker 安装 Apache
05 Docker 参考手册
  • 5.1 Docker 常用命令
  • 5.2 Docker 备忘单

Kubernetes(k8s)手册

01 kubernetes 概述
  • 01 kubernetes 简介
  • 02 Kubernetes 组件
  • 03 Kubernetes API
02 Kubernetes 安装
  • 01 Kubernetes Linux安装

快乐的Linux命令行

  • 第1章:引言
  • 第2章:什么是 shell
  • 第3章:文件系统中跳转
  • 第4章:探究操作系统
  • 第5章:操作文件和目录
  • 第6章:使用命令
  • 第7章:重定向
  • 第8章:从Shell眼中看世界
  • 第9章:键盘高级操作技巧
  • 第10章:权限
  • 第11章:进程
  • 第12章:Shell环境
  • 第13章:vi简介
  • 第14章:自定制Shell提示符
  • 第15章:软件包管理
  • 第16章:存储媒介
  • 第17章:网络系统
  • 第18章:查找文件
  • 第19章:归档和备份
  • 第20章:正则表达式
  • 第21章:文本处理
  • 第22章:格式化输出
  • 第23章:打印
  • 第24章:编译程序
  • 第25章:编写第一个Shell脚本
  • 第26章:启动一个项目
  • 第27章 : 自顶向下设计
  • 第28章 : 流程控制:if 分支结构
  • 第29章 : 读取键盘输入
  • 第30章 : 流程控制:while/until 循环
  • 第31章 : 疑难排解
  • 第32章 : 流程控制:case 分支
  • 第33章 : 位置参数
  • 第34章 : 流程控制:for 循环
  • 第35章 : 字符串和数字
  • 第36章 : 数组
  • 第37章 : 奇珍异宝

第16章:存储媒介

文章目录
  • 16.1 挂载和卸载存储设备
  • 16.2 查看挂载的文件系统列表
  • 16.3 确定设备名称
  • 16.4 创建新的文件系统
  • 16.5 用 fdisk 命令操作分区
  • 16.6 用 mkfs 命令创建一个新的文件系统
  • 16.7 测试和修复文件系统
  • 16.8 格式化软盘
  • 16.9 直接把数据移入/出设备
  • 16.10 创建 CD-ROM 映像
    • 16.10.1 创建一个 CD-ROM 的映像拷贝
    • 16.10.2 从文件集合中创建一个映像
  • 16.11 写入 CD-ROM 镜像
    • 16.11.1 直接挂载一个 ISO 镜像
    • 16.11.2 清除一张可重写入的 CD-ROM
    • 16.11.3 写入镜像
  • 16.12 拓展阅读
  • 16.13 友情提示

第16章:存储媒介

在前面章节中,我们已经在文件级别上见识了数据的操作。在这章里,我们将从设备级别来考虑数据。Linux 有着令人惊奇的能力来处理存储设备,不管是物理设备,比如说硬盘,还是网络设备,或者是虚拟存储设备,像 RAID(独立磁盘冗余阵列)和 LVM(逻辑卷管理器)。

然而,这不是一本关于系统管理的书籍,我们不会试图深入地覆盖整个主题。我们将努力做的就是介绍一些概念和用来管理存储设备的重要命令。

为了做这一章的练习,我们将会使用 USB 闪存,CD-RW 光盘(如果系统配备了 CD-ROM 烧录器)和一张软盘(如果系统有这样配备的话)。

我们将看看以下命令:

  • mount – 挂载一个文件系统

  • umount – 卸载一个文件系统

  • fsck – 检查和修复一个文件系统

  • fdisk – 分区表控制器

  • mkfs – 创建文件系统

  • fdformat – 格式化一张软盘

  • dd — 把块数据直接写入设备

  • genisoimage (mkisofs) – 创建一个 ISO 9660的映像文件

  • wodim (cdrecord) – 把数据写入光存储媒介

  • md5sum – 计算 MD5检验码

16.1 挂载和卸载存储设备

Linux 桌面系统的最新进展已经使存储设备管理对于桌面用户来说极其容易。大多数情况下,我们只要把设备连接到系统中,它就能工作。在过去(比如说,2004年),这个工作必须手动完成。在非桌面系统中(例如,服务器中),还是挺麻烦的一个过程,因为服务器经常有特有的存储需求和复杂的配置要求。

管理存储设备的第一步是把设备连接到文件系统树中。这个叫做"挂载"的过程允许设备连接到操作系统中。回想一下第三章,类 Unix 操作系统,比如 Linux ,会在一个文件系统树中挂载各种设备。这与其它操作系统形成对照,比如说 MS-DOS 和 Windows 系统中,每个设备(例如 C:\,D:\,等)会拥有自己的文件系统树。

有一个叫做 /etc/fstab 的文件可以列出系统启动时要挂载的设备(典型地,硬盘分区)。下面是来自于 Fedora 7 系统的/etc/fstab 文件实例:

LABEL=/12               /               ext3        defaults        1   1
LABEL=/home             /home           ext3        defaults        1   2
LABEL=/boot             /boot           ext3        defaults        1   2
tmpfs                   /dev/shm        tmpfs       defaults        0   0
devpts                  /dev/pts        devpts      gid=5,mode=620  0   0
sysfs                   /sys            sysfs       defaults        0   0
proc                    /proc           proc        defaults        0   0
LABEL=SWAP-sda3         /swap           swap        defaults        0   0

在这个实例中所列出的大多数文件系统是虚拟的,并不适用于我们的讨论。就我们的目的而言,前三个是我们感兴趣的:

LABEL=/12               /               ext3        defaults        1   1
LABEL=/home             /home           ext3        defaults        1   2
LABEL=/boot             /boot           ext3        defaults        1   2

这些是硬盘分区。每行由六个字段组成,如下所示:

表16-1: /etc/fstab 字段
字段 内容 说明
1 设备名 传统上,这个字段包含与物理设备相关联的设备文件的名字,比如说 /dev/hda1(第一个 IDE 通道上第一个主设备分区)。然而今天的计算机,有很多热插拔设备(像 USB 驱动设备),许多现代的 Linux 发行版用一个文本标签和设备相关联。当这个设备连接到系统中时,这个标签(当储存媒介格式化时,这个标签会被添加到存储媒介中)会被操作系统读取。那样的话,不管赋给实际物理设备哪个设备文件,这个设备仍然能被系统正确地识别。
2 挂载点 设备所连接到的文件系统树的目录。
3 文件系统类型 Linux 允许挂载许多文件系统类型。大多数本地的 Linux 文件系统是 ext3,
但是也支持很多其它的,比方说 FAT16 (msdos), FAT32
(vfat),NTFS (ntfs),CD-ROM (iso9660),等等。
4 选项 文件系统可以通过各种各样的选项来挂载。有可能,例如,挂载只读的文件系统,
或者挂载阻止执行任何程序的文件系统(一个有用的安全特性,避免删除媒介。)
5 频率 一位数字,指定是否和在什么时间用 dump 命令来备份一个文件系统。
6 次序 一位数字,指定 fsck 命令按照什么次序来检查文件系统。

16.2 查看挂载的文件系统列表

这个 mount 命令被用来挂载文件系统。执行这个不带参数的命令,将会显示一系列当前挂载的文件系统:

[me@linuxbox ~]$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /home type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sdd1 on /media/disk type vfat (rw,nosuid,nodev,noatime,
uhelper=hal,uid=500,utf8,shortname=lower)
twin4:/musicbox on /misc/musicbox type nfs4 (rw,addr=192.168.1.4)

这个列表的格式是:设备 on 挂载点 type 文件系统类型(选项)。例如,第一行所示设备/dev/sda2 作为根文件系统被挂载,文件系统类型是 ext3,并且可读可写(这个“rw”选项)。在这个列表的底部有两个有趣的条目。倒数第二行显示了在读卡器中的一张2G 的 SD 内存卡,挂载到了/media/disk 上。最后一行是一个网络设备,挂载到了/misc/musicbox 上。

第一次实验,我们将使用一张 CD-ROM。首先,在插入 CD-ROM 之前,我们将看一下系统:

[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

这个列表来自于 CentOS 5系统,使用 LVM(逻辑卷管理器)来创建它的根文件系统。正如许多现在的 Linux 发行版一样,这个系统试图自动挂载插入的 CD-ROM。当我们插入光盘后,我们看看下面的输出:

[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/hdc on /media/live-1.0.10-8 type iso9660 (ro,noexec,nosuid,
nodev,uid=500)

当我们插入光盘后,除了额外的一行之外,我们看到和原来一样的列表。在列表的末尾,我们看到 CD-ROM 已经挂载到了 /media/live-1.0.10-8 上,它的文件类型是 iso9660(CD-ROM)。就我们的实验目的而言,我们对这个设备的名字感兴趣。当你自己进行这个实验时,这个设备名字是最有可能不同的。

警告:在随后的实例中,至关重要的是你要密切注意用在你系统中的实际设备名,并且不要使用此文本中使用的名字!

还要注意音频 CD 和 CD-ROM 不一样。音频 CD 不包含文件系统,这样在通常意义上,它就不能被挂载了。

现在我们拥有 CD-ROM 光盘的设备名字,让我们卸载这张光盘,并把它重新挂载到文件系统树的另一个位置。我们需要超级用户身份(使用系统相应的命令)来进行操作,并且用umount(注意这个命令的拼写)来卸载光盘:

[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]# umount /dev/hdc

下一步是创建一个新的光盘挂载点。简单地说,一个挂载点就是文件系统树中的一个目录。它没有什么特殊的。它甚至不必是一个空目录,如果你把设备挂载到了一个非空目录上,你将不能看到这个目录中原来的内容,直到你卸载这个设备。就我们的目的而言,我们将创建一个新目录:

[root@linuxbox ~]# mkdir /mnt/cdrom

最后,我们把这个 CD-ROW 挂载到一个新的挂载点上。这个 -t 选项用来指定文件系统类型:

[root@linuxbox ~]# mount -t iso9660 /dev/hdc /mnt/cdrom

之后,我们可以通过这个新挂载点来查看 CD-ROW 的内容:

[root@linuxbox ~]# cd /mnt/cdrom
[root@linuxbox cdrom]# ls

注意当我们试图卸载这个 CD-ROW 时,发生了什么事情。

[root@linuxbox cdrom]# umount /dev/hdc
umount: /mnt/cdrom: device is busy

这是怎么回事呢?原因是我们不能卸载一个设备,如果某个用户或进程正在使用这个设备的话。在这种情况下,我们把工作目录更改到了 CD-ROW 的挂载点,这个挂载点导致设备忙碌。我们可以很容易地修复这个问题通过把工作目录改到其它目录而不是这个挂载点。

[root@linuxbox cdrom]# cd
[root@linuxbox ~]# umount /dev/hdc

现在这个设备成功卸载了。

为什么卸载很重要

如果你看一下 free 命令的输出结果,这个命令用来显示关于内存使用情况的统计信息,你会看到一个统计值叫做”buffers“。计算机系统旨在尽可能快地运行。系统运行速度的一个阻碍是缓慢的设备。打印机是一个很好的例子。即使最快速的打印机相比于计算机标准也极其地缓慢。一台计算机如果它要停下来等待一台打印机打印完一页,再去执行其他操作,就会变得很慢。在早期的个人电脑时代(多任务之前),这真是个问题。如果你正在编辑电子表格或者是文本文档,每次你要打印文件时,计算机都会停下来而且变得不能使用。计算机能以打印机可接受的最快速度把数据发送给打印机,但由于打印机不能快速地打印,这个发送速度会非常慢。由于打印机缓存的出现,这个问题被解决了。打印机缓存是一个包含 RAM 内存的设备,位于计算机和打印机之间。通过打印机缓存,计算机把要打印的结果发送到这个缓存区,数据会迅速地存储到这个 RAM 中,这样计算机就能回去工作,而不用等待。与此同时,打印机缓存将会以打印机可接受的速度把缓存中的数据缓慢地输出给打印机。

缓存被广泛地应用于计算机中,使其运行得更快。别让偶尔地的读取或写入慢设备的需求阻碍了系统的运行速度。在真正与比较慢的设备交互之前,操作系统会尽可能多的读取或写入数据到内存中的存储设备里。以 Linux 操作系统为例,你会注意到系统看似占用了多于它所需要的内存。这不意味着 Linux 正在使用这些内存,而是意味着 Linux 正在利用所有可用的内存,来作为缓存区。

这个缓存区允许非常快速地对存储设备进行写入,因为写入物理设备的操作被延迟到后面进行。同时,这些注定要传送到设备中的数据正在内存中堆积起来。时不时地,操作系统会把这些数据写入物理设备。

卸载一个设备需要把所有剩余的数据写入这个设备,所以设备可以被安全地移除。如果没有卸载设备,就移除了它,就有可能没有把注定要发送到设备中的数据输送完毕。在某些情况下,这些数据可能包含重要的目录更新信息,这将导致文件系统损坏,这是发生在计算机中的最坏的事情之一。

16.3 确定设备名称

有时很难来给设备起名字。在以前,这并不是很难。一台设备总是在某个固定的位置,也不会挪动它。类 Unix 的系统也喜欢这样。退回到 Unix 系统的时代,“更改一个磁盘驱动器”是要用一辆叉车从机房中移除一台如洗衣机大小的设备。最近几年,典型的桌面硬件配置已经变得相当动态,并且 Linux 已经发展地比其祖先更加灵活。在以上事例中,我们利用现代 Linux 桌面系统的功能来“自动地”挂载设备,然后再确定设备名称。但是如果我们正在管理一台服务器或者是其它一些这种自动挂载功能不会发生的环境,我们又如何能确定设备名呢?

首先,让我们看一下系统怎样来命名设备。如果我们列出目录/dev(所有设备的住所)的内容,我们会看到许许多多的设备:

[me@linuxbox ~]$ ls /dev

这个列表的内容揭示了一些设备命名的模式。这里有几个:

表16-2: Linux 存储设备名称
模式 设备
/dev/fd* 软盘驱动器
/dev/hd* 老系统中的 IDE(PATA)磁盘。典型的主板包含两个 IDE 连接器或者是通道,每个连接器
带有一根缆线,每根缆线上有两个硬盘驱动器连接点。缆线上的第一个驱动器叫做主设备,
第二个叫做从设备。设备名称这样安排,/dev/hda 是指第一通道上的主设备名;/dev/hdb
是第一通道上的从设备名;/dev/hdc 是第二通道上的主设备名,等等。末尾的数字表示
硬盘驱动器上的分区。例如,/dev/hda1是指系统中第一硬盘驱动器上的第一个分区,而
/dev/hda 则是指整个硬盘驱动器。
/dev/lp* 打印机
/dev/sd* SCSI 磁盘。在最近的 Linux 系统中,内核把所有类似于磁盘的设备(包括 PATA/SATA 硬盘,
闪存,和 USB 存储设备,比如说可移动的音乐播放器和数码相机)看作 SCSI 磁盘。
剩下的命名系统类似于上述所描述的旧的/dev/hd*命名方案。
/dev/sr* 光盘(CD/DVD 读取器和烧写器)

另外,我们经常看到符号链接比如说 /dev/cdrom,/dev/dvd 和/dev/floppy,它们指向实际的设备文件,提供这些链接是为了方便使用。如果你工作的系统不能自动挂载可移动的设备,你可以使用下面的技巧来决定当可移动设备连接后,它是怎样被命名的。首先,启动一个实时查看文件 /var/log/messages(你可能需要超级用户权限):

[me@linuxbox ~]$ sudo tail -f /var/log/messages

这个文件的最后几行会被显示,然后停止。下一步,插入这个可移动的设备。在这个例子里,我们将使用一个16MB 闪存。瞬间,内核就会发现这个设备,并且探测它:

Jul 23 10:07:53 linuxbox kernel: usb 3-2: new full speed USB device
using uhci_hcd and address 2
Jul 23 10:07:53 linuxbox kernel: usb 3-2: configuration #1 chosen
from 1 choice
Jul 23 10:07:53 linuxbox kernel: scsi3 : SCSI emulation for USB Mass
Storage devices
Jul 23 10:07:58 linuxbox kernel: scsi scan: INQUIRY result too short
(5), using 36
Jul 23 10:07:58 linuxbox kernel: scsi 3:0:0:0: Direct-Access Easy
Disk 1.00 PQ: 0 ANSI: 2
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] 31263 512-byte
hardware sectors (16 MB)
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Write Protect is
off
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Assuming drive
cache: write through
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] 31263 512-byte
hardware sectors (16 MB)
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Write Protect is
off
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Assuming drive
cache: write through
Jul 23 10:07:59 linuxbox kernel: sdb: sdb1
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Attached SCSI
removable disk
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: Attached scsi generic
sg3 type 0

显示再次停止之后,输入 Ctrl-c,重新得到提示符。输出结果的有趣部分是一再提及“[sdb]”,这正好符和我们期望的 SCSI 磁盘设备名称。知道这一点后,有两行输出变得颇具启发性:

Jul 23 10:07:59 linuxbox kernel: sdb: sdb1
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Attached SCSI
removable disk

这告诉我们这个设备名称是/dev/sdb 指整个设备,/dev/sdb1 是这个设备的第一分区。正如我们所看到的,使用 Linux 系统充满了有趣的侦探工作。

小贴士:使用这个 tail -f /var/log/messages 技巧是一个很不错的方法,可以实时观察系统的一举一动。

既然知道了设备名称,我们就可以挂载这个闪存驱动器了:

[me@linuxbox ~]$ sudo mkdir /mnt/flash
[me@linuxbox ~]$ sudo mount /dev/sdb1 /mnt/flash
[me@linuxbox ~]$ df
Filesystem      1K-blocks   Used        Available   Use%    Mounted on
/dev/sda2       15115452    5186944     9775164     35%     /
/dev/sda5       59631908    31777376    24776480    57%     /home
/dev/sda1       147764      17277       122858      13%     /boot
tmpfs           776808      0           776808      0%      /dev/shm
/dev/sdb1       15560       0           15560       0%      /mnt/flash

这个设备名称会保持不变只要设备与计算机保持连接并且计算机不会重新启动。

16.4 创建新的文件系统

假若我们想要用 Linux 本地文件系统来重新格式化这个闪存驱动器,而不是它现用的 FAT32 系统。这涉及到两个步骤:1.(可选的)创建一个新的分区布局,如果已存在的分区不是我们喜欢的。2.在这个闪存上创建一个新的空的文件系统。

注意!在下面的练习中,我们将要格式化一个闪存驱动器。拿一个不包含有用数据的驱动器作为实验品,因为它将会被擦除!再次,请确定你指定了正确的系统设备名称。未能注意此警告可能导致你格式化(即擦除)错误的驱动器!

16.5 用 fdisk 命令操作分区

这个 fdisk 程序允许我们直接在底层与类似磁盘的设备(比如说硬盘驱动器和闪存驱动器)进行交互。使用这个工具可以在设备上编辑,删除,和创建分区。以我们的闪存驱动器为例,首先我们必须卸载它(如果需要的话),然后调用 fdisk 程序,如下所示:

[me@linuxbox ~]$ sudo umount /dev/sdb1
[me@linuxbox ~]$ sudo fdisk /dev/sdb

注意我们必须指定设备名称,就整个设备而言,而不是通过分区号。这个程序启动后,我们将看到以下提示:

Command (m for help):

输入"m"会显示程序菜单:

Command action
a       toggle a bootable flag
....

我们想要做的第一件事情是检查已存在的分区布局。输入"p"会打印出这个设备的分区表:

Command (m for help): p

Disk /dev/sdb: 16 MB, 16006656 bytes
1 heads, 31 sectors/track, 1008 cylinders
Units = cylinders of 31 * 512 = 15872 bytes

Device Boot     Start        End     Blocks   Id        System
/dev/sdb1           2       1008      15608+   b       w95 FAT32

在此例中,我们看到一个16MB 的设备只有一个分区(1),此分区占用了可用的1008个柱面中的1006个,并被标识为 Windows 95 FAT32分区。有些程序会使用这个标志符来限制一些可以对磁盘所做的操作,但大多数情况下更改这个标志符没有危害。为了叙述方便,我们将会更改它,以此来表明是个 Linux 分区。在更改之前,首先我们必须找到被用来识别一个 Linux 分区的 ID 号码。在上面列表中,我们看到 ID 号码“b”被用来指定这个已存在的分区。要查看可用的分区类型列表,参考之前的程序菜单。我们会看到以下选项:

l   list known partition types

如果我们在提示符下输入“l”,就会显示一个很长的可能类型列表。在它们之中会看到“b”为已存在分区类型的 ID 号,而“83”是针对 Linux 系统的 ID 号。

:

回到之前的菜单,看到这个选项来更改分区 ID 号:

t   change a partition's system id

我们先输入“t”,再输入新的 ID 号:

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 83
Changed system type of partition 1 to 83 (Linux)

这就完成了我们需要做得所有修改。到目前为止,还没有接触这个设备(所有修改都存储在内存中,而不是在此物理设备中),所以我们将会把修改过的分区表写入此设备,再退出。为此,我们输入在提示符下输入"w":

Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
[me@linuxbox ~]$

如果我们已经决定保持设备不变,可在提示符下输入"q",这将退出程序而没有写更改。我们可以安全地忽略这些警告信息。

16.6 用 mkfs 命令创建一个新的文件系统

完成了分区编辑工作(它或许是轻量级的),是时候在我们的闪存驱动器上创建一个新的文件系统了。为此,我们会使用 mkfs("make file system"的简写),它能创建各种格式的文件系统。在此设备上创建一个 ext3文件系统,我们使用"-t"选项来指定这个"ext3"系统类型,随后是我们要格式化的设备分区名称:

[me@linuxbox ~]$ sudo mkfs -t ext3 /dev/sdb1
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
3904 inodes, 15608 blocks
780 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=15990784
2 block groups
8192 blocks per group, 8192 fragments per group
1952 inodes per group
Superblock backups stored on blocks:
8193
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[me@linuxbox ~]$

当 ext3 被选为文件系统类型时,这个程序会显示许多信息。若把这个设备重新格式化为它最初的 FAT32 文件系统,指定"vfat"作为文件系统类型:

[me@linuxbox ~]$ sudo mkfs -t vfat /dev/sdb1

任何时候添加额外的存储设备到系统中时,都可以使用这个分区和格式化的过程。虽然我们只以一个小小的闪存驱动器为例,同样的操作可以被应用到内部硬盘和其它可移动的存储设备上,例如 USB 硬盘驱动器。

16.7 测试和修复文件系统

在之前讨论文件 /etc/fstab 时,我们会在每行的末尾看到一些神秘的数字。每次系统启动时,在挂载系统之前,都会按照惯例检查文件系统的完整性。这个任务由 fsck 程序(是"file system check"的简写)完成。每个 fstab 项中的最后一个数字指定了设备的检查顺序。在上面的实例中,我们看到首先检查根文件系统,然后是 home 和 boot 文件系统。若最后一个数字是零则相应设备不会被检查。

除了检查文件系统的完整性之外,fsck 还能修复受损的文件系统,其成功度依赖于损坏的数量。在类 Unix 的文件系统中,文件恢复的部分被放置于 lost+found 目录里面,位于每个文件系统的根目录下面。

检查我们的闪存驱动器(首先应该卸载),我们能执行下面的操作:

[me@linuxbox ~]$ sudo fsck /dev/sdb1
fsck 1.40.8 (13-Mar-2008)
e2fsck 1.40.8 (13-Mar-2008)
/dev/sdb1: clean, 11/3904 files, 1661/15608 blocks

以我的经验,文件系统损坏情况相当罕见,除非硬件存在问题,如磁盘驱动器故障。在大多数系统中,系统启动阶段若探测到文件系统已经损坏了,则会导致系统停止下来,在系统继续执行之前,会指导你运行 fsck 程序。

什么是 fsck?

在 Unix 文化中,"fsck"这个单词往往会被用来指代另一个和它仅有一个字母差别的常用词。因为如果你遇到了迫不得已需要运行 fsck 命令的糟糕境遇时,这个词经常会脱口而出。

16.8 格式化软盘

对于那些还在使用配备了软盘驱动器的计算机的用户,我们也能管理这些设备。准备一张可用的空白软盘要分两个步骤。首先,对这张软盘执行低级格式化,然后创建一个文件系统。为了完成格式化,我们使用 fdformat 程序,同时指定软盘设备名称(通常为/dev/fd0):

[me@linuxbox ~]$ sudo fdformat /dev/fd0
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done

接下来,通过 mkfs 命令,给这个软盘创建一个 FAT 文件系统:

[me@linuxbox ~]$ sudo mkfs -t msdos /dev/fd0

注意我们使用这个“msdos”文件系统类型来得到旧(小的)风格的文件分配表。当一个软磁盘被准备好之后,则可能像其它设备一样挂载它。

16.9 直接把数据移入/出设备

虽然我们通常认为计算机中的数据以文件形式来组织数据,也可以“原始的”形式来考虑数据。如果我们看一下磁盘驱动器,例如,我们看到它由大量的数据“块”组成,而操作系统却把这些数据块看作目录和文件。然而,如果把磁盘驱动器简单地看成一个数据块大集合,我们就能执行有用的任务,如克隆设备。

这个 dd 程序能执行此任务。它可以把数据块从一个地方复制到另一个地方。它使用独特的语法(由于历史原因),经常它被这样使用:

dd if=input_file of=output_file [bs=block_size [count=blocks]]

比方说我们有两个相同容量的 USB 闪存驱动器,并且要精确地把第一个驱动器(中的内容)复制给第二个。如果连接两个设备到计算机上,它们各自被分配到设备/dev/sdb 和 /dev/sdc 上,这样我们就能通过下面的命令把第一个驱动器中的所有数据复制到第二个驱动器中。

dd if=/dev/sdb of=/dev/sdc

或者,如果只有第一个驱动器被连接到计算机上,我们可以把它的内容复制到一个普通文件中供以后恢复或复制数据:

dd if=/dev/sdb of=flash_drive.img

警告!这个 dd 命令非常强大。虽然它的名字来自于“数据定义”,有时候也把它叫做“清除磁盘” 因为用户经常会误输入 if 或 of 的规范。在按下回车键之前,要再三检查输入与输出规范!


16.10 创建 CD-ROM 映像

写入一个可记录的 CD-ROM(一个 CD-R 或者是 CD-RW)由两步组成;首先,构建一个 iso 映像文件,这就是一个 CD-ROM 的文件系统映像,第二步,把这个映像文件写入到 CD-ROM 媒介中。

16.10.1 创建一个 CD-ROM 的映像拷贝

如果想要制作一张现有 CD-ROM 的 iso 映像,我们可以使用 dd 命令来读取 CD-ROW 中的所有数据块,并把它们复制到本地文件中。比如说我们有一张 Ubunt CD,用它来制作一个 iso 文件,以后我们可以用它来制作更多的拷贝。插入这张 CD 之后,确定它的设备名称(假定是/dev/cdrom),然后像这样来制作 iso 文件:

dd if=/dev/cdrom of=ubuntu.iso

这项技术也适用于 DVD 光盘,但是不能用于音频 CD,因为它们不使用文件系统来存储数据。对于音频 CD,看一下 cdrdao 命令。

16.10.2 从文件集合中创建一个映像

创建一个包含目录内容的 iso 映像文件,我们使用 genisoimage 程序。为此,我们首先创建一个目录,这个目录中包含了要包括到此映像中的所有文件,然后执行这个 genisoimage 命令来创建映像文件。例如,如果我们已经创建一个叫做 ~/cd-rom-files 的目录,然后用文件填充此目录,再通过下面的命令来创建一个叫做 cd-rom.iso 映像文件:

genisoimage -o cd-rom.iso -R -J ~/cd-rom-files

"-R"选项添加元数据为 Rock Ridge 扩展,这允许使用长文件名和 POSIX 风格的文件权限。同样地,这个"-J"选项使 Joliet 扩展生效,这样 Windows 中就支持长文件名了。

一个有着其它名字的程序。。。

如果你看一下关于创建和烧写光介质如 CD-ROMs 和 DVD 的在线文档,你会经常碰到两个程序叫做 mkisofs 和 cdrecord。这些程序是流行软件包"cdrtools"的一部分,"cdrtools"由 Jorg Schilling 编写成。在2006年春天,Schilling 先生更改了部分 cdrtools 软件包的协议,Linux 社区许多人的看法是,这创建了一个与 GNU GPL 不相兼容的协议。结果,就 fork 了这个 cdrtools 项目,目前新项目里面包含了 cdrecord 和 mkisofs 的替代程序,分别是 wodim 和 genisoimage。

16.11 写入 CD-ROM 镜像

有了一个映像文件之后,我们可以把它烧写到光盘中。下面讨论的大多数命令对可记录的 CD-ROW 和 DVD 媒介都适用。

16.11.1 直接挂载一个 ISO 镜像

有一个诀窍,我们可以用它来挂载 iso 映像文件,虽然此文件仍然在我们的硬盘中,但我们当作它已经在光盘中了。添加 "-o loop" 选项来挂载(同时带有必需的 "-t iso9660" 文件系统类型),挂载这个映像文件就好像它是一台设备,把它连接到文件系统树上:

mkdir /mnt/iso_image
mount -t iso9660 -o loop image.iso /mnt/iso_image

上面的示例中,我们创建了一个挂载点叫做 /mnt/iso_image,然后把此映像文件 image.iso 挂载到挂载点上。映像文件被挂载之后,可以把它当作是一张真正的 CD-ROM 或者 DVD。当不再需要此映像文件后,记得卸载它。

16.11.2 清除一张可重写入的 CD-ROM

可重写入的 CD-RW 媒介在被重使用之前需要擦除或清空。为此,我们可以用 wodim 命令,指定设备名称和清空的类型。此 wodim 程序提供了几种清空类型。最小(且最快)的是 "fast" 类型:

wodim dev=/dev/cdrw blank=fast

16.11.3 写入镜像

写入一个映像文件,我们再次使用 wodim 命令,指定光盘设备名称和映像文件名:

wodim dev=/dev/cdrw image.iso

除了设备名称和映像文件之外,wodim 命令还支持非常多的选项。常见的两个选项是,"-v" 可详细输出,和 "-dao" 以 disk-at-once 模式写入光盘。如果你正在准备一张光盘为的是商业复制,那么应该使用这种模式。wodim 命令的默认模式是 track-at-once,这对于录制音乐很有用。

16.12 拓展阅读

我们刚才谈到了很多方法,可以使用命令行管理存储介质。看看我们所讲过命令的手册页。一些命令支持大量的选项和操作。此外,寻找一些如何添加硬盘驱动器到 Linux 系统(有许多)的在线教程,这些教程也要适用于光介质存储设备。

16.13 友情提示

通常验证一下我们已经下载的 iso 映像文件的完整性很有用处。在大多数情况下,iso 映像文件的贡献者也会提供一个 checksum 文件。一个 checksum 是一个神奇的数学运算的计算结果,这个数学计算会产生一个能表示目标文件内容的数字。如果目标文件的内容即使更改一个二进制位,checksum 的结果将会非常不一样。生成 checksum 数字的最常见方法是使用 md5sum 程序。当你使用 md5sum 程序的时候,它会产生一个独一无二的十六进制数字:

md5sum image.iso
34e354760f9bb7fbf85c96f6a3f94ece    image.iso

当你下载完映像文件之后,你应该对映像文件执行 md5sum 命令,然后把运行结果与发行商提供的 md5sum 数值作比较。

除了检查下载文件的完整性之外,我们也可以使用 md5sum 程序验证新写入的光学存储介质。为此,首先我们计算映像文件的 checksum 数值,然后计算此光学存储介质的 checksum 数值。这种验证光学介质的技巧是限定只对光学存储介质中包含映像文件的部分计算 checksum 数值。通过确定映像文件所包含的 2048 个字节块的数目(光学存储介质总是以 2048 个字节块的方式写入)并从存储介质中读取那么多的字节块,我们就可以完成操作。某些类型的存储介质,并不需要这样做。一个以 disk-at-once 模式写入的 CD-R ,可以用下面的方式检验:

md5sum /dev/cdrom
34e354760f9bb7fbf85c96f6a3f94ece    /dev/cdrom

许多存储介质类型,如 DVD 需要精确地计算字节块的数目。在下面的例子中,我们检验了映像文件 dvd-image.iso以及 DVD 光驱中磁盘 /dev/dvd 文件的完整性。你能弄明白这是怎么回事吗?

md5sum dvd-image.iso; dd if=/dev/dvd bs=2048 count=$(( $(stat -c "%s" dvd-image.iso) / 2048 )) | md5sum
更新于 2022年10月2日
第15章:软件包管理第17章:网络系统

发表评论 取消回复

您需要登录后才可以发表评论...
登录... 后才能评论
文章目录
  • 16.1 挂载和卸载存储设备
  • 16.2 查看挂载的文件系统列表
  • 16.3 确定设备名称
  • 16.4 创建新的文件系统
  • 16.5 用 fdisk 命令操作分区
  • 16.6 用 mkfs 命令创建一个新的文件系统
  • 16.7 测试和修复文件系统
  • 16.8 格式化软盘
  • 16.9 直接把数据移入/出设备
  • 16.10 创建 CD-ROM 映像
    • 16.10.1 创建一个 CD-ROM 的映像拷贝
    • 16.10.2 从文件集合中创建一个映像
  • 16.11 写入 CD-ROM 镜像
    • 16.11.1 直接挂载一个 ISO 镜像
    • 16.11.2 清除一张可重写入的 CD-ROM
    • 16.11.3 写入镜像
  • 16.12 拓展阅读
  • 16.13 友情提示

Copyright © 2015-2023 开源之家

  • 首页
  • 每日签到
  • 加入VIP
  • 顶部
AI&大数据 Java Java Linux Linux Python 办公软件 办公软件 培训视频 娱乐休闲 安卓 小程序开发 数据库 系统相关 网络 英语 设计创意 软件测试