#43 Linux 文件系统

2018-01-25

物理结构

  1. 机械硬盘 Disk -> 盘片/盘面 Platter -> 磁道 Tracker -> 扇区 Physical Sector
  2. 光盘
  3. SSD -> NAND Package -> Die -> Plane -> Block -> Page
  4. 非易失性存储器(永久):NAND Flash
  5. 易失性存储器(临时):DRAM

扇区大小是厂商定的,一般是 512B 的倍数。
老的机械硬盘一般是 512B 扇区,新的机械硬盘一般是 4K 扇区(AF,Advanced Format)
光盘(CD/DVD)一般是 2K 扇区。

处于向前兼容的目的,其他类型存储设备的大小也一般是 512B。

逻辑结构

  • 逻辑扇区 Logical Sector
  • 块 Block
    Windows 下叫做 簇 Cluster,或者磁盘分配单元。
    PS:内存上的类似概念,是段 Segment 和页 Page
$ sudo fdisk /dev/sda -l
Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7EC7FA37-FE79-46C1-A404-56AA0E00CFAB

Device       Start      End  Sectors Size Type
/dev/sda1     2048     4095     2048   1M BIOS boot
/dev/sda2     4096  4198399  4194304   2G Linux filesystem
/dev/sda3  4198400 83884031 79685632  38G Linux filesystem

格式化

https://zh.wikipedia.org/wiki/磁盘格式化

  • 低级格式化、物理格式化

对于部分硬盘制造厂商,它也被称为初始化。
最早,低级格式化被用于指代对磁盘进行划分柱面、磁道、扇区的操作。
现今,随着软盘的逐渐退出日常应用,应用新的编址方法和接口的磁盘的出现,这个词已经失去了原本的含义,大多数的硬盘制造商将低级格式化定义为创建硬盘扇区(sector)使硬盘具备存储能力的操作。现在,人们对低级格式化存在一定的误解,多数情况下,提及低级格式化,往往是指硬盘的填零操作。

  • 高级格式化、逻辑格式化
    根据用户选定的文件系统,在磁盘的特定区域写入特定数据,以达到初始化磁盘或磁盘分区、清除原磁盘或磁盘分区中所有文件的一个操作。
    高级格式化包括对主引导记录中分区表相应区域的重写、根据用户选定的文件系统,在分区中划出一片用于存放文件分配表、目录表等用于文件管理的磁盘空间,以便用户使用该分区管理文件。

常见文件系统类型

  • FAT / FAT32 / exFAT
  • NTFS
  • EXT2 / EXT3 / EXT4
  • BTRFS
  • Apple HFS

参考资料与拓展阅读

#42 Bash set 命令

2018-01-11

我写 Shell 脚本一般都是用 bash 执行,一般我会在头部插入 set -xue 命令, 助记:蛇血。

那么这个命令的作用是什么呢?

set 是 bash 提供的一个命令,用来管理 bash 的一些行为。

  • x: 在执行命令前,输出所有命令,包括参数。
  • u: 遇到未定义变量时,报错。
  • e: 如果遇到错误,程序退出。

其他更多参数,参考:set --helphelp set

#41 Vim 备忘录

2018-01-03

我并不是个 Vim 高手,但是我所掌握的知识对于轻量使用来说,也够用了。
这就是我能想到的全部 Vim 知识。

如果你是一个新手,看看这篇文章,应该可以快速入门 Vim,能解决所有简单编辑任务所会面临的问题。

基础知识

避免由于意外操作而不知所措。

模式

  • 普通模式(Normal):直接打开文件(vim filepath)就进入了这个模式,可以移动光标,执行一些指令
  • 插入模式(Insert):像普通编辑器一样编辑文本
  • 可视模式(Visual):先在普通模式下移动光标到目标区域,然后切换到可视模式,这时移动光标就可以选中一块区域,对着块区域的内容执行一些命令
  • 命令模式:在 Vim 底部输入命令,按回车执行
  • 选择模式(Select):正常我们能够理解的选中,然后删除或者对着一块进行替换
  • Ex 模式:。。。

模式切换:

  1. 在任何模式下按 Esc 就可以回到普通模式
  2. 普通模式下,按 i 进入插入模式;
  3. 普通模式下,按 v 进入可视模式(字符);
  4. 普通模式下,按 V 进入可视模式;
  5. 普通模式下,按 Ctrl + v 进入可视模式;
    1. Windows 系统下 Ctrl + v 被占用作为粘贴快捷键,可以使用 Ctrl + q 代替;
  6. 普通模式下,按 : 进入命令模式;
  7. 可视模式下,按 Ctrl + g 进入选择模式;
  8. 选择模式下,可以按 Ctrl + o 回退到可视模式;

快捷键

上下左右,翻页(PageUp,PageDown),删除(Backspace,Del)本身就可以用,就不用记快捷键了。

Key Function
u 撤销
dd 删除当前行
3dd 删除当前行 + 后面两行(共 3 行)
>> 缩进
<< 取消缩进
== 自动对齐

使用命令 5d 删除第五行
使用命令 5,10d 删除第 5 到第 10 行

跳转

Key Function
gg 跳到第一行
20gg 跳到第 20 行
G 跳到最后一行
10j 往前跳 10 行
10k 往后跳 10 行

hjkl 本身用来表示左上下右,所以...

复制粘贴

Key Function
yy 复制当前行
3yy 复制当前行 + 后面两行(共 3 行)
yw 复制当前单词和后面的空白字符
p Paste 粘贴在当前行、字符后面
P Paste 粘贴在当前行、字符前面

搜索

Key Function
? 向后搜索(正则)
/ 向前搜索(正则)
# 向后搜索当前单词,等同于输入 #\<xxx\>
* 向前搜索当前单词,等同于输入 /\<xxx\>
  1. n/N 跳到上一处或下一处
  2. \cp[a-z]*n 忽略大小写,搜索 p 开头,n 结尾的单词

命令

一般都有取消配置的 set noXXX 命令。

Key Function
set nu 显示行号
set paste 粘贴模式(避免开启自动缩进时,会弄乱粘贴内容)
set ignorecase / set ic 搜索忽略大小写
set hlsearch 高亮搜索结果(似乎是默认)
set nohlsearch 取消高亮搜索结果
noh 关闭高亮
set listchars=tab:>~,trail:. 显示 TAB 键和行末空格
set cursorline 当前行加上下划线

替换

Key Function
s/Gitee/Gitea/g 将当前行所有 Gitee 替换成 Gitea
%s/Gitee/Gitea/g 将所有行所有 Gitee 替换成 Gitea
%s/Gitee/Gitea/gi ...忽略大小写
%s/Gitee/Gitea/gin ...不真正执行,只反馈印象范围
5,10s/Gitee/Gitea/g 将第 5 到 10 行所有 Gitee 替换成 Gitea
.,+5s/Gitee/Gitea/g 将当前行到后两行所有 Gitee 替换成 Gitea

保存

Key Function
q 退出(可能会提示你:已修改但尚未保存)
w 保存
wq 保存并退出
x 保存并退出
q! 不保存,强行退出
:w !sudo tee % 没有写入权限的时候提权保存

清空数据:gg + 1000dd(跳到第一行,然后删除 1000 行)

> filepath
# 或
echo > filepath

参考资料与拓展阅读

#40 apt 包管理系统

2017-12-25

搜索

apt search xxx

检索

apt list
apt list --installed
apt list --upgradable

升级

apt update
apt upgrade

apt-file

apt-file list youtube-dl
apt-file search bin/update-locale

其他

apt search
apt show
apt install
apt reinstall
apt remove
apt autoremove
apt full-upgrade
apt edit-sources
apt satisfy

apt-mark
apt-key
apt-config
apt-cache
apt-add-repository

#38 Apache 访问 /tmp 目录下的文件失败

2017-11-09

项目中有一个下载日志文件的功能,大致流程是 WEB 后端调用底层方法收集并压缩一些 .log 文件生成一个 zip 压缩包,放在 /tmp 目录下,前端访问指定路径下载。
之前系统环境用的 CentOS 6.5,现在升级到了 CentOS 7,结果测试时发现下载文件下载失败。

#37 Linux 文本处理:awk

2017-10-15

awk 的文档写出来可能有一本很厚的书,里面甚至有一种内嵌的解释性编程语言在里面。但是我们普通人就把他当一个小工具,了解一下基础用法就好了,不用深入研究。它的基本功能是将字符串切割之后按照 $1 ... $n 来处理,$0 表示整个字符串(整行)。

#36 Linux 文本处理:grep

2017-10-13
  • egrep = grep -E
  • fgrep = grep -F
# -G, --basic-regexp    基本正则, 默认
# -E, --extended-regexp 拓展正则
# -P, --perl-regexp     Perl 正则
# -w 完全匹配字词
# -x 完全匹配整行
grep markjour /var/log/auth.log
grep -E markjour /var/log/auth.log

# -F, --fixed-strings
grep -F markjour /var/log/auth.log

tail -1000 /var/log/auth.log | grep -Ev 'gnome-keyring-daemon|CRON'
  • -r 目录
  • -R 目录,处理软链
  • -v 排除
  • -i 忽略大小写 (ignore-case)
  • -m 控制匹配次数
  • -a 包含二进制内容的文件当作纯文本处理
  • -I 包含二进制内容的文件跳过

  • -b 输出命中内容的偏移量

  • -n 输出行号
  • -o 仅输出匹配部分
  • -h 不输出文件名(匹配多个文件时默认输出文件名 -H
  • -L, --files-without-match 仅输出没有匹配的文件名
  • -l, --files-with-matches 仅输出匹配文件名
  • -c, --count 仅输出文件名和匹配行数

  • --include=GLOB 只查找匹配 GLOB(文件模式)的文件

  • --exclude=GLOB 跳过匹配 GLOB 的文件
  • --exclude-from=FILE 跳过所有匹配给定文件内容中任意模式的文件
  • --exclude-dir=GLOB 跳过所有匹配 GLOB 的目录

  • -B, --before-context=NUM 打印文本及其前面NUM 行

  • -A, --after-context=NUM 打印文本及其后面NUM 行
  • -C, --context=NUM 打印NUM 行输出文本
  • -NUM 等同于 --context=NUM

#35 将文件当作磁盘

2017-08-05
dd if=/dev/zero of=cdata.img bs=1G count=5
mkfs ext4 -F cdata.img
LANG=en fdisk -lu cdata.img
sudo mount -o loop cdata.img /mnt/iso

sudo umount /mnt/iso

#34 Linux 命名空间

2017-05-11

命名空间是什么

对内核资源进行分区,为进程隔离提供支持。

命名空间类型

Namespace CloneFlag Version Year
Mount (mnt) CLONE_NEWNS 2.4.19 2002
UTS CLONE_NEWUTS 2.6.19 2006
Inter-process Communication (ipc) CLONE_NEWIPC 2.6.19 2006
Process ID (pid) CLONE_NEWPID 2.6.24 2008
Network (net) CLONE_NEWNET 2.6.29 2009
User ID (user) CLONE_NEWUSER 3.8 2013
Control group (cgroup) CLONE_NEWCGROUP 4.6 2016
Time CLONE_NEWTIME 5.6 2020

Mount

挂载点可以在不同命名空间之间共享。

UTS

UNIX Time-Sharing

不知道为什么叫这个名字。作用是隔离主机名和域名。

IPC

不同 IPC 命名空间的进程不能通过 shm 系列方法共享内存。

PID

Network

每个网络命名空间都有一组自己的网络资源,包括 IP 地址、路由表、套接字列表、连接跟踪表、防火墙等等。

User

主要作用是权限的隔离。

Cgroup

进程控制组。

Time

时间的隔离。

系统调用

  • clone
  • unshare
  • setns

参考资料与拓展阅读