「Linux」- 配置文件备份
问题描述
在 Linux 下,进行配置文件文件备份。实现的功能: 1)对配置文件进行备份。备份工具可以使用rsync命令的复制功能。备份不能使用cp命令,主要是因为配置文件重名或者发生调整时,cp命令无法对原文件进行操作。 2)且能够自动对配置文件进行备份。自动备份可以使用Cron定时任务实现。 3)由版本控制,能切换到指定时间点。版本控制可以使用git。在Rsync同步结束后,执行git提交变更。 3)灾后,能够实现快速恢复服务。使用Rsync进行反向复制即可。
配置文件丢失或者无法恢复,真的非常要命。
需要说明的几点
这里的“配置文件备份”区别于cp file.conf{,.backup}形式的备份。只要是为了解决灾后恢复、配置回滚等问题。
备份是按照配置文件在文件系统中的目录结构进行存储配置的。
解决方案(单机备份)
#1 创建脚本
备份脚本/usr/local/bin/rsync-conf-backup.sh内容如下:
#!/bin/bash
################################################################################
# 服务器配置文件备份
################################################################################
WORKTREE=’/srv/backups/sysconf’
########################################
# 执行检查
########################################
echo -n “# check…”
# 创建配置文件保存目录
if [ ! -d “$WORKTREE” ]
then
echo “# $WORKTREE not exist”
echo “# creating ${WORKTREE}…”
mkdir -pv $WORKTREE
fi
cd $WORKTREE
if [ ! -f “$WORKTREE/.rsyncd.filter” ]
then
echo “# .rsyncd.filter not exist!”
echo “# creating .rsyncd.filter…”
cat <<EOF > .rsyncd.filter
################################################################################
# 系统配置文件备份
#########[……]
「Backup」- 当软件版本升级时,进行服务备份的方法
问题描述
在软件版本升级时,比如升级 Jenkins、GitLab 等等服务时,我们需要提前进行服务备份,以当升级失败时而进行回滚操作。否则当版本升级失败时,现有的数据也将被破坏,而导致服务无法再使用。
该笔记将记录:在 Linux 中,进行服务数据备份的相关方法(通用、概述),以及常见问题的解决办法。
解决方案
停服、快照
某些服务在升级时是允许停机的,即我们并不需要该服务保持 7×24 可用性。比如当升级 Jenkins 服务时,我们可以对 Jenkins 服务停机,当二进制文件升级结束时,可再启动服务。
对于该类型的服务,我们可用通过「停服、快照」的方式进行备份:停止服务,并利用文件系统的快照功能来创建快照,如果升级失败,则利用快照进行恢复;[……]
「rsync」- remote sync
问题描述
该笔记将记录:与 rsync 有关的内容,以及相关问题的解决方法。
注意事项
将RSYNC放入该分类中,主要动机是为了给RSYNC找一个分类。
与其他协议不同,虽然RSYNC也有自己的协议,但是它没有被IETF标准化,因此也没有RFC文档。
参考文献
Where is Rsync protocol documented?[……]
「rsync」- 安装(Windows,Linux)
问题描述
该笔记将记录:安装rsync 的方法,包括从源码安装、安装二进制包等等。
GNU/Linux
通过仓库安装
apt-get install rsync
通过源码安装
# 下载rsync源码并进入源码目录。
wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
tar -xf rsync-3.1.2.tar.gz
cd rsync-3.1.2
# 准备、编译
./configure –prefix=/usr –without-included-zlib &&
make
make install
macOS
能够使用 brew 直接进行安装,执行如下命令:
brew install rsync
或者也可以像GNU/Linux中一样,从源码中编译安装,没有太大的差别:
#!/bin/bash
# 下载rsync源码并进入源码目录。
wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
tar -xf rsync-3.1.2.tar.gz
cd rsync-3.1.2
# 准备、编译
./configure –prefix=/usr/local –without-included-zlib &&
make
make install
注意:与GNU/Linux下编译相比,唯一的差别可能在于安装到了/usr/local中。macOS中,由于有System Integrity Protection的保护,所以你不能随随便便的向/usr下写东西。如果你想安装到/usr下,需要重启macOS,开机时按住command+R,然后进入恢复模式,在终端中执行csrutil disable命令来禁用System Integrity Protection。在这种情况下安装结束后,重新进入恢复模式,在终端中执行csrutil enable命令来启用System Integrity Protection。
Microsoft Windows
WSL – Windows Subsystem for Linux
# 09/10/2021 这是我们正在使用的方案。
cwRsync
与于 Microsoft Windows 能够使用 cwRsync 软件(参考 cwRsync 项目)。
cwRsync 是对 Rsync 的打包,专门用于 Windows 的 Rsync(cwRsync,看名字也能猜出来与 Cygwin 有关)。[……]
「rsync」- 服务搭建(在GNU/Linux中)
处理rsync客户端请求的服务端有三种:Inetd、远程Shell、Rsync守护进程。这里先首先介绍Rsync守护进程这种方式。
准备工作
rsync命令由一个–daemon选项,可以使rsync以守护进程的方式运行,并监听默认的873端口,以等待客户端的连接。
要创建一个Rsync服务需要两样东西。一个是rsync命令,这个我们已经有了。另外一个东西是Rsync服务的配置文件rsyncd.conf。
接下来就开始介绍如何编写一个rsyncd.conf配置文件。
创建配置文件
rsyncd.conf是rsync在守护进程模式下的运行时配置文件。该文件控制了认证、访问、日志、可用模块等等。
配置文件结构及组成
下面是一个基本的rsync.simple.conf文件:
[ftp]
path = /home/ftp
comment = ftp export area
再下面是一个稍微复杂一点的rsync.sophisticated.conf文件:
uid = nobody
gid = nobody
use chroot = yes
max connections = 4
syslog facility = local5
pid file = /var/run/rsyncd.pid
[ftp]
path = /var/ftp/./pub
comment = whole ftp area (approx 6.1 GB)
[cvs]
path = /data/cvs
comment = CVS repository (requires authentication)
auth users = tridge, susan
secrets file = /etc/rsyncd.secrets
稍微复杂一点的rsyncd.conf配置文件中/etc/rsyncd.secrets文件的内容如下:
tridge:mypass
susan:herpass
配置文件由模块和参数组成:
模块:如上面的[ftp]、[cvs]。一个模块以由方括号包含着模块名称开始,并一直持续到下一个模块开始时结束。
参数:“name=value”形式的内容就是参数。比如:path = /data/cvs,use chroot = yes。
有关配置的几点注意事项
配置文件是基于行的。也就是说,以换行符终止的行可能代表着注释、模块名称、参数之一。
只有参数中第一个等号是有意义的,因为第一个等号将参数和值分开。第一个等号之前或之后的空白字符被丢弃。模块及参[……]
「rysnc」- 常见问题处理
内容简介
本部分简介与rsync相关的概念,以及常用命令。
# 使用SSH同步
-「How to copy files with rsync over SSH」 拉取:rsync root@hostname:/foo /bar 推送:rsync /bar root@loacalhost:/foo[……]
「rsync」- 与文件所有者、所属组、权限有关的处理
问题描述
在使用rsync进行文件同步时,「保留原文件的所有属性」是常规用法。有时候,我们也需要: 1)在覆盖时,保留远程原文件的所有者 ⇒ 仅覆盖文件内容,但不覆盖文件属性; 2)或者「以特定用户创建远程文件」。
本文将介绍在使用rsync进行文件同步时的处理文件所有者、所属组、权限有关的方法。
保留文件的全部属性
场景描述
即保留文件所有属性,使远程与本地文件保持一致。
这是一种常见需求,比如在进行某个服务的数据迁移,如果没有正确保留权限,那服务启动时可能会产生错误。
解决办法
使用rsync -az命令。
将目标文件设置为特定用户
场景描述
被同步到远程的文件,文件的所有者、所属组将设置为特定用户。
这是另外一种场景,本地文件由root用户所有。在同步到远程后,希望归www用户所有。
解决办法
方法一,使用特定用户上传,rsync /source/directory user@hostname:/destination/directory,远程的文件所有者及组将被设置为特定用户,这是用user及其组。
方法二,使用–chown选项,rsync –owner –group –chown=user:group src dst,选项–chown并不是修改文件所有者及所属组,而是重新映射。所以一定要指定–owner与–group选项来保留所有者及所属组,然后告诉rsync(通过–chown选项)对其重新映射。
参考文献
Rsync with destination owner and permission possible? Rsync command issues, owner and group permissions doesn´t change[……]
「使用inotify与rsync来实现实时同步」
参考文献
linux下两台服务器文件实时同步方案设计和实现: http://blog.csdn.net/5iasp/article/details/13630927 真正的inotify+rsync实时同步 彻底告别同步慢: http://www.ttlsa.com/web/let-infotify-rsync-fast/ rsync 远程同步文件的两种方式: http://blog.csdn.net/dabao1989/article/details/43731845[……]
「Linux」- 磁盘分区
问题描述
与 Linux 磁盘分区有关内容(多偏重 Linux 环境),以及相关问题解决办法;
该笔记将记录:与磁盘管理及使用有关内容(但并非所有内容),通常与单个磁盘相关;
解决方案
所属分类
“文件系统”是“操作系统”的组成部分之一,但是存储磁盘不是操作系统的组成部分。存储磁盘是计算机的组成部分,因此磁盘管理、配置是操作系统无关的,它是硬件自身的属性。但是,鉴于磁盘管理是操作系统维护的任务之一,所以我们依旧将磁盘、磁盘管理归属到操作系统分类下,;
章节内容
”磁盘分区“必然属于该部分。这是磁盘日常管理的基础内容;
”坏块检测“属于该部分。坏块检测是针对磁盘设备本身的,这确实是磁盘相关问题;
”性能检测“数据该部分。磁盘读写性能是磁盘属性之一,它属于该部分。虽然分布式文件系统、分布式存储也涉及”性能检测“,但是这两者所涵盖内容不同。这里的”性能检测“更基础,更底层;
本部分也包含 Windows 相关的磁盘管理,但是我们 Windows Server 用的比较少,所以内容更偏向于桌面;
不包含内容
”进程当前 I/O 活动“不属于该部分。因为他与磁盘本身没有太大关系,该问题及相关问题不属于磁盘,它仅使用该资源;
”LVM/NFS/RAID“不属于该部分。它们属于存储技术,会在独立的部分进行讨论,它们所涉及的内容已经超过单个磁盘;
磁盘分区带来的优势
The importance of Linux partitions 10 reasons for using multiple partitions
更灵活的安全控制
1)可以针对特定分区(文件系统)进行数据加密,而无需加密整个磁盘; 2)通过针对分区设置挂载选项,比如 nosuid,noexec 等等,提高安全性;
针对用途进行优化
1)可以针对目的(用途),采用不同文件系统,使用不同的调优参数; 2)针对小文件,可以对该分区文件系统使用更小的块,以提高利用率; 3)较小的文件系统效率更高(未验证过);
易于使用、维护简单
1)当文件系统损坏时,通常只会损坏某个分区内的文件系统,易于修复; 2)当重新安装操作系统时,不会影响到其他分区内的数据,无需迁移数据;
更灵活的控制与使用
1)可以限制文件系统对磁盘空间的占用,使其不会超过分区的大小; 2)可以安装多个操作系统进行测试;
数据备份与数据恢复
1)可以针对特定分区进行数据备份与恢复,更加灵活;
我们的选择分区方案
KVM Guest
某台主机用于虚拟化,我们将整个磁盘分为 / 与 /var 两部分。理由如下: 1)在主机中,包含操作系统(/)与虚拟机的磁盘文件(/var/lib/li[……]
「Linux」- 在虚拟机中,检测新增磁盘(无需重启)
问题描述
当我们向 Linux 虚拟机添加虚拟磁盘后,Linux 虚拟机是无法检测到该磁盘的,需要重启系统后才能检测到新添加的磁盘;
那如何在不重启的情况下检测到该磁盘呢?
该需求通常发生在虚拟机中,而物理机一般不会有这种需求;
解决办法
for host in /sys/class/scsi_host/*
do
echo “####### $host”
echo “- – -” > $host/scan
# ls /dev/sd*
done
参考文献
How to detect new hard disk attached without rebooting? VMware: Add disk to linux without rebooting the VM[……]
「Linux」- 磁盘分区工具
问题描述
在Linux中有众多用于磁盘分区的工具,比如fdisk、gdisk、parted等等。它们对分区表的支持程度也不尽相同,有些支持MBR分区表,有些支持GPT分区表。因此,在创建不同类型的分区表时,需要使用不同的工具。
本文将简单梳理这些分区工具,了解其适用场景,以明确何种场景下使用何种工具。
注意事项
本文仅列举常用分区工具(即在发行版中常见的磁盘分区管理工具)。因为我们认为发行版中自带的工具具有通用性、普适性,因此我们更倾向于学习发行版中默认自带的工具。“用户友好且高级的工具”不在本文介绍的范畴。
如果分区工具的版本不同,那么功能也会存在差异。在本文中,我们将标注出所介绍工具的版本,请参考对应手册获取准确信息。
常见磁盘分区工具有哪些?
fdisk, gdisk, sfdisk, parted, cfdisk, gparted, …
下面对这些工具进行简单的分类,分类依据为工具能否在脚本中使用。
可脚本化的分区工具
该分类下的工具可以在脚本中使用,进行编程。
fdisk
命令版本:fdisk from util-linux 2.34 分区类型:GPT, MBR, Sun, SGI, BSD
旧版(比如fdisk from util-linux 2.23.2版本)可以处理GPT分区表,但是处于实验阶段,因此不建议使用。
gdisk
-「gdisk」 用于处理GPT分区表,与fdisk算是兄弟了。
parted
同时支持MBR和GPT分区表,还支持其他多种分区表格式。常用于为新操作系统创建空间、重新组织磁盘使用、将数据复制到新硬盘。 它不是那种类似于fdisk的程序,使用该命令添加和删除分区并不会更改磁盘,它只是告诉内核有关磁盘分区的存在和编号。
sfdisk
从2.26版本起,sfdisk支持MBR (DOS), GPT, SUN和SGI磁盘标签,详细参考sfdisk(8)手册。
关于脚本编程
其中 disk, sfdisk, gdisk 可以用类似于如下的形式,进行脚本编程:
#!/bin/sh
fdisk /dev/sdc <<EOF
g
n
1
+64MiB
n
2
t
1
83
t
2
83
w
EOF
但是 parted 会更好一些,因为 parted 有自己的命令:
#!/bin/sh
parted –script /dev/sdc \
mklabel gpt \
mkpart primary ext4 1MiB 65MiB \
mkpart primary ext4 65MiB 134MB
非脚本化[……]
「硬盘」- 如何检测坏块
问题描述
该笔记将记录:检测 SSD 坏块的方法,包括使用第三方工具及系统工具;
使用命令行(使用 Linux 命令)
方法一、使用 badblock 命令
参考 使用 badblock 命令检查磁盘坏块 笔记;
方法二、使用 Smartmontools 工具(推荐)
对于现代硬盘(ATA/SATA、SCSI/SAS、SSD),通常带有 S.M.A.R.T 模块。它用于检测、记录、报告磁盘的健康状况。因此可以使用它检测硬件故障;
在安装 smartmontools 之后,就可以通过 smartctl 命令操作集成到磁盘中的 S.M.A.R.T 模块。实际上 smartmontools 分为两部分,客户端与服务端。客户端是 smartctl 命令,而服务端是 smartd 程序。在发行版中,安装 smartmontools 后,服务会被自动启动。所以实际过程是「smartctl => smartd => S.M.A.R.T」;
#!/bin/sh
################################################################################
# 安装工具(Debian)
################################################################################
apt-get install smartmontools
systemctl status smartd.service # 验证 samard.service 已经启动
################################################################################
# 简单使用示例
################################################################################
#1 显示 S.M.A.R.T 的整体健康自我评估结果
smartctl -H /dev/sda1 # 如果结果显示 PASS 值,则表示通过。但这不代表没有问题;
#2 使用–all 则显示相关磁盘信息;使用–xall 则显示磁盘所有信息(包括 SMART 与非 SMART 信息);
# 留意输出结果中的 Current_Pending_Sector 值,该值显示有多少磁盘扇区无法读取并在等待重新映射;
smartctl -a /dev/sdb
#3 测试硬盘
smartctl -t short /dev/sdb # 执行测试,即发送命令给 smartd 程序
smartctl -l[……]
「Linux」- 使用badblock命令检查磁盘坏块
badblock
实用程序 badblock 用于检测磁盘中的坏块。它支持以下几种扫描模式:
只读模式 – 默认模式,但是精准度是最低的;
写入模式 – 有害模式,这是最精准的模式,但是检测时间较久,并且会破坏所有数据;
读写模式 – 无害模式,精准度与写入模式差不多,但是最慢。
如果已知硬盘存在坏块,那只读模式应该是最安全的。
扫描磁盘
使用如下命令可以对磁盘进行扫描:
#!/bin/sh
################################################################################
#1 使用fdisk命令确定要检查的磁盘
################################################################################
fdisk -l # 或者lsblk命令
################################################################################
#2 然后扫描磁盘(这里是/dev/sdc分区)
################################################################################
badblocks -v /dev/sdc > badsectors.txt
#「-v」- 显示操作的细节
#「> badsectors.txt」- 将扫描结果保存到文件中。命令e2fsck、fsck等等可以使用该文件。
################################################################################
#3 扫描特定分区
################################################################################
badblocks -v /dev/sdc1 > badsectors.txt
全盘扫描
但是全盘扫描由一个缺点:每个文件系统”相对于它所在的分区“开始进行块计算。
假如你的第二个分区存在坏块,并且该分区从块1000开始。在进行全盘扫描得到坏块值,减去1000后,得到的值才是你想要的坏块值,后面的计算也要基于该值。
或者,在全盘扫描之后,再单独对坏块所在的分区进行扫描。这样就不需要进行数学计算。
块大小
另外需要注意的是块大小:命令badblock使用1024 BYTE块,因此你需要使用-b[……]
「Linux」- 磁盘克隆
内容简介
本部分整理与磁盘复制有关的内容。
相关链接
How to clone disks with Linux dd command[……]
「STORAGE」- 查看物理磁盘位置
ledmon
apt-get install ledmon
# To start:
ledctl locate=/dev/sdd
# To stop:
ledctl off={/dev/sdd}
smartctl
while :; do smartctl -a /dev/sdaX; done; # simple looop for blinking a disk
参考文献
centos – How to make a RAID disk light blink (on Linux)? – Server Fault[……]
「Linux」- 查看和修改分区表类型
查看分区表类型
在如下命令输出信息中,将显示分区表类型:
parted “/dev/sdX” print
修改分区表类型
如下命令将使分区使用 MBR 分区:
parted “/dev/sdX” mklabel “msdos”
参考文学
How can I check and change the partition table type?[……]
「Linux」- 文件系统管理,File System Management
磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!
TODO rm on a directory with millions of files rm on a directory with millions of files
-> https://serverfault.com/questions/183821/rm-on-a-directory-with-millions-of-files/328305#328305
How can I delete a folder with lots of subfolders fast?
TODO initramfs 「LFS/About initramfs」 「Wikipedia/Initial ramdisk」
在Linux中支持的文件系统
内核:Linux 4.9.0-amd64
# cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cpuset
nodev cgroup
nodev cgroup2
nodev tmpfs
nodev devtmpfs
nodev debugfs
nodev tracefs
nodev securityfs
nodev sockfs
nodev dax
nodev bpf
nodev pipefs
nodev hugetlbfs
nodev devpts
nodev pstore
nodev mqueue
btrfs
ext3
ext2
ext4
nodev autofs
nodev binfmt_misc
fuseblk
nodev fuse
nodev fusectl
squashfs
nodev rpc_pi[……]
「File system」- 杂记
碎片整理
How to Repair and Defragment Linux System Partitions and Directories
Overlay filesystem
ArchWiki/Overlay filesystem
章节列表
「find」- Permission denied 「Journaling block device」 「Linux」- 分区标签(LABEL) 「Linux」- 监控文件删除、找到删除文件的进程 「Linux」- 如何高效地移动/复制文件 「系统维护」- 关于扩展文件系统 「关于使用mv命令合并目录」[……]
「系统维护」- 关于扩展文件系统
内容简介
在部署服务时,我们一定会预估需要的磁盘空间,然后为系统添加额外的分区,以容纳更多数据。
本文将讨论这个过程中某些做法的优劣,以及应该怎么做。
关于数据目录
# 修改默认目录
这是一种很常见的做法:
新建一个目录,然后将新的分区挂载到这个目录,再修改应用的配置,将指定的配置指向该目录,然后启动服务。
问题就在于我们为什么要这么做,为什么要修改默认目录,为什么不直接挂载到默认的目录上?
# 如果有更好的做法
我更倾向于“挂载到原有目录”的做法。理由有以下几点:
(1)不需要修改配置。做到最少变动,以减少配置错误或配置遗漏的可能性。
(2)遵循发行版的默认规则,更具有通用性。如果使用自定义规则,除了要维护相关文档外,还要监督所有的管理员遵循这些规则。
(3)可以使用发行版内置的功能。比如日志轮转,如果调整了日志文件的写入路径,与此同时还应该修改日志轮转脚本。
(4)另外,依照发行版的配置,可以为升级管理带来方便,减少维护成本。
所以在系统管理中,个人更倾向于遵循发行版中默认规则,进行最小变动。有时候,有些变动是完全没有必要的。
目前的做法是:为主机分配一块较大的存储设备(比如SAN存储),然后创建多个LVM逻辑卷,供不同目录挂载使用。通常主机是专用的,只运行几个特定服务,因此需要大容量的目录也就很少。
# 关于LVM命名
命名一直是一个让人头疼的问题。不过也还好,既然遵循发行版的规则,命名也简单了很多,也有迹可循了。
对于/var/lib/mysql可以创建名为/dev/mysql/lib的分区;而/var/log/mysql可以创建名为/dev/mysql/log的分区。[……]
「Journaling block device」
问题描述
遇到一个状况:
通过iotop命令,内核jbd(jbd2/dm-0-8)线程占用的IO特别高。
没解决,先记录下来把。
相关链接
Index» Kernel & Hardware» High IO wait caused by jbd2 Linux Wait IO Problem what is jbd2/vda1-8 ? using high io High server load – [jbd2/md1-8] using 99.99% IO
参考文献
Wikipedia/Journaling block device[……]
「Linux」- 分区标签(LABEL)
问题描述
在 Windows 中,我们为分区命名,那个名字就是「分区标签」。所以说“分区标签”是给分区的一个名字,让分区更容易被我们记忆。
在 Linux 中,我们也可以为分区设置标签。
该笔记将记录:在 Linux 中,如何查看和设置分区标签。
解决方案
查看分区标签
# ==== 方法一,使用/dev/disk/by-label查看 ====
ls -l /dev/disk/by-label
# ==== 方法二,使用「lsblk」命令 ====
lsblk -o name,mountpoint,label,size,uuid
# ==== 方法三,使用「blkid」命令 ====
blkid
# ==== 其他,显示某个磁盘的「LABEL」值 ====
e2label /dev/sdx
设置分区标签
对于 ext 文件系统:
# 使用 e2label 命令
e2label /dev/sdb2 usbstroage
# 使用 tune2fs 命令
tune2fs -L usbstroage /dev/sdb2
对于 exFAT 文件系统:
exfatlabel /dev/sdb2 usbstroage
对于 NTFS 文件系统:
ntfslabel /dev/sdb2 usbstroage
附加说明
关于 UUID 与 LABEL 的存储位置
LABEL 是文件系统的概念。当我们尝试在一个NTFS分区上使用e2label命令时,得到了e2label: Bad magic number in super-block while trying to open /dev/mmcblk0错误。而且包括 UUID 也是文件系统的概念。所以使用 dd 命令复制分区,此得到 UUID 及 LABEL 相同的两个分区。
参考文章: Are disk partition labels or UUIDS stored in the partition area itself or in some other area of the hard disk? Where does Ubuntu store partition UUIDs on disk? http://www.nongnu.org/ext2-doc/ext2.html#S-UUID http://linux.die.net/man/3/libuuid
Disk Label vs Partation Label
关于 磁盘标签 与 分区标签 区别: 1)磁盘标签(Disk Label),其实是我们经常说的分区表,比如 MBR、GPT[……]
「Linux」- 监控文件删除、找到删除文件的进程
问题描述
该笔记将记录:在 Linux 中,如何监控文件系统文件删除,找出删除文件的进程,以及常见问题处理。
解决方案
解决该问题的方案有很多,比如: 1)auditd 2)sysdig 3)inotifywait(仅能获取变化文件,无法获取相关进程)
方案一、通过 auditd 服务
第一步、安装 auditd 服务:
# apt-get install -y auditd
# systemctl enable auditd.service
# systemctl start auditd.service
第二步、添加服务配置,以监控文件删除:
# vi /etc/audit/rules.d/audit.rules
-a always,exit -F dir=/tmp -S unlink -S unlinkat -S rename -S renameat -S rmdir -k delete_var
# systemctl restart auditd.service
# auditctl -l
-a always,exit -S rename,rmdir,unlink,unlinkat,renameat -F dir=/var/tmp -F key=delete_var
第三步、查看日志,以获取文件删除的原因:
# ausearch -k delete_var
参考文件
How to use auditd to monitor a file deletion in Linux – The Geek Diary linux – Auditd – auditctl rule to monitor dir only (not all sub dir and files etc..) – Stack Overflow rm – How to find the pid of the process which has deleted a file? – Ask Ubuntu[……]
「Linux」- 如何高效地移动/复制文件
问题描述
在日常工作中,离不开数据的复制与移动。有时需要将几百万(甚至几千万)的静态资源移动/复制到其他存储设备中。那该如何高效的移动/复制这些数据呢?
本文将介绍如何高效移动大量文件的方法。
关于并行地移动/复制
在「Is it better to pass all files to mv or to run a bunch of mv processes in parallel?」中,有人回答了这个问题。其中有一句话是点睛之笔:
如果并行移动文件真的有意义,那么mv(1)或者其他类似工具早有这么做了。
所以说,不要再想着并行移动/复制文件。而且,并行移动/复制还会带来其他问题:
(1)并行写入可能会带来文件碎片;
(2)如果目标空间不足,并行会导致多个文件不完整;
所以不要再想象什么并行移动/复制操作。
移动文件
# 同一文件系统
如果移动的源地址及目的地址位于同一文件系统中,可以直接使用mv(1)命令,速度将会非常快,因为它只更新inode信息。
# 不同文件系统
既然没有什么并行动作,所以直接使用mv(1)命令即可。
复制文件
对于文件的复制,不管是否位于同一文件系统,都可以使用rsync(1)命令。因为它可以提供更细粒度的控制,比如权限保留、增量复制等等。如果发生终端,由于支持增量复制,因此也可以恢复。
参考文献
Is it better to pass all files to mv or to run a bunch of mv processes in parallel? What is the fastest way to move a million images from one directory to another in Linux?[……]
「find」- Permission denied
find: /sys/firmware: Permission denied
find: ‘./proc/1/map_files’: Permission denied
「https://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html」
参考文献
find: ‘./proc/1/map_files’: Permission denied[……]
「关于使用mv命令合并目录」
经常会有这种情景:我们需要合并两个目录。
实际情况:mv命令不支持目录合并
看一个示例。当前目录下有两个目录a0与b0,同时b0中还有一个a0,但是这个两个a0目录的内容不同,我想合并这两个a0目录。目录结构如下:
# tree a0 b0
a0
└── a1
├── a1.txt
└── a2
b0
├── a0
│ └── a1
│ └── a2
│ └── a2.txt
└── b1
└── b2
7 directories, 2 files
在我尝试将a0合并到b0/a0中时,mv命令返回了一个错误:
# mv a0 b0/
mv: cannot move ‘a0’ to ‘b0/a0’: Directory not empty
之所以返回这个错误是因为mv命令不支持目录合并。
实现目录合并的方法
不跨文件系统的解决方案
You can use the -l option of the cp command, which creates hard links of files on the same filesystem instead of full-data copies. The following command copies the folder source/folder to a parent folder (destination) which already contains a directory with the name folder.
cp -rl source/folder destination
rm -r source/folder
Notes:
You may also want to use the -P (–no-dereference – do not de-reference symbolic links) or -a (–archive – preserve all metadata, also includes -P option), depending on your needs.
Though there are two “I/O” steps involved, the steps are relatively simple metadata operations involving zero “[……]
「Linux」- 文件系统的挂载
# Mount Google Drive Locally How To Mount Google Drive Locally As Virtual File System In Linux
非特权用户执行 mount 命令
linux – How to allow non-superusers to mount any filesystem? – Unix & Linux Stack Exchange
mount 命令无法由非特权用户直接执行,有两种方法: 1)使用 SUDO 命令(这等同于使用 ROOT 用户) 2)由 ROOT 定义 fstab 条目。
方法一、使用 SUDO 命令
执行 sudo mount 命令即可,这里不再深入展开。
方法二、由 ROOT 定义 fstab 条目
第一步,ROOT 用户修改 /etc/fstab 文件,添加如下配置:
192.168.30.26:/root/backup /usr/backup nfs rw,noauto,user 0 0
// 这里以 NFS 文件系统为例
// noauto:防止开机自动挂载
// user:允许普通用户执行
第二步、普通用户执行挂载命令:
mount /usr/backup
参考文献
Wikipedia/mount (Unix)
章节列表
「Linux」- fstab 「Linux」- 挂载 CIFS 文件系统 「Windows」- 访问 Samba 共享[……]
「Linux」- 挂载 CIFS 文件系统
问题描述
该笔记将记录:在 Linux 中,如何挂载 Windows 共享(Samba、CIFS),以及相关问题处理。
解决方案
查看共享内容:
# smbclient -L 127.0.0.1
Enter WORKGROUP\k4nz’s password:
Sharename Type Comment
——— —- ——-
print$ Disk Printer Drivers
IPC$ IPC IPC Service (desktop-ubuntu20 server (Samba, Ubuntu))
ORG000-D3RM Disk
SMB1 disabled — no workgroup available
方法一、mount.cifs(8)
如果使用 mount(8) 挂载 CIFS 文件系统,需要安装 LinuxCIFS utils 工具集。
第一步、安装软件包:
# Debain
apt-get install -y cifs-utils
# Redhat/CentOS
yum install -y cifs-utils.x86_64
第二步、挂载文件系统:
# 将 //192.168.3.4/ sharedir 挂载到 /mnt/cifs 目录上,并指定了用户名和密码。
# 如果不需要认证,则无需指定用户名和密码。
mount -t cifs -o username=demo,password=demo ‘//192.168.3.4/sharedir’ ‘/mnt/cifs’
第三步、开机自动挂载(修改 /etc/fstab 文件):
# 将//192.168.3.4/sharedir挂载到/mnt/cifs上,并指定了用户名和密码
//192.168.3.4/sharedir /mnt/cifs cifs username=demo,password=demo 0 0
# 如果不需要认证,可以不指定用户名和密码。
方法二、smbmount(废弃)
命令 smbmount 已被弃用,推荐使用 mount.cifs 命令。
# 12/23/2019 现在,在 Debian GNU/Linux 10 (buster) 中,已经找不到该命令。
常见错误汇总
mount.cifs: bad UNC
问题描述:在执行 mount 过程中,返回如下错误:
mount.cifs: bad UNC[……]
「Windows」- 访问 Samba 共享
解决方案
// 映射网络驱动(持久化挂载)
net use Z: \\computer_name\share_name /PERSISTENT:YES
// 卸载共享
net use Z: /delete
常见问题处理
You can’t access this shared folder because your organization’s security policies block unauthenticated guest access.
You can’t access this shared folder because your organization’s security policies block unauthenticated guest access FIX: You Can’t Access This Shared Folder Because Your Organization’s Security Policies Block Unauthenticated Guest Access
问题描述:
解决方案: Open the Local Group Policy Editor (gpedit.msc). In the console tree, select Computer Configuration > Administrative Templates > Network > Lanman Workstation. For the setting, right-click Enable insecure guest logons and select Edit. Select Enabled and select OK.
参考 Guest access in SMB2 and SMB3 disabled by default in Windows 文档,以获得详细说明。
参考文献
How to Mount CIFS Shares from Windows Command Line – FileCloud – FileCloud Support[……]
「Linux」- fstab
# _netdev -「How does _netdev mount option in /etc/fstab work?」
# runit-fstab-generator https://www.vivaolinux.com.br/script/runit-fstab-generator
使用绑定挂载
unix – How do I do ‘mount –bind’ in /etc/fstab? – Server Fault
/source /destination none defaults,bind 0 0
/source 是最终被写入数据的目录;在挂载 Ext4 文件系统时,其对应块设备地址; /destination 是呈现出来的目录;在挂载 Ext4 文件系统时,其对应系统的目录;
生成 /etc/fstab 配置行
每次修改 fstab 文件,虽然不难,但是繁琐。那能不能自动生成呢?答案是肯定的,能,必须能!本文将介绍一些自动生成 fstab 文件的工具;
genfstab(推荐) GitHub/Brainiarc7/fstab-generate-arch arch/arch-install-scripts.git
The fstab line generator https://epistel.no/fstab/[……]
「AutoFS」
介绍
工具autofs是一个根据需要自动挂载目录的程序。 自动挂载仅在访问时挂载,并在一段时间不活动后卸载。 因此,与通过fstab进行静态挂载相比,自动挂载NFS/Samba共享可以节省带宽并提供更好的整体性能。
为避免混淆,将使用以下术语: 1)automount,指用于为autofs配置挂载点的程序。启动autofs时,会为每个映射生成一个automount守护程序。 2)自动挂载,指自动挂载文件系统的过程。 3)autofs,指控制 automount 守护进程操作的程序。
安装
配置
注意事项
请记住,在自动挂载之前,您需要访问目录。否则,不会看不到任何列出的内容。访问完成后,您的共享将一直列出,直到超时为止。记住这一点很好,因为它可以节省您诊断autofs问题的时间。
自动挂载 SSHFS 文件系统
Auto mount (autofs) sshfs access Autofs and sshfs – the perfect couple How to convert sshfs command to fstab entry? How do I remove the passphrase for the SSH key without having to create a new key?
参考文献
https://mirrors.edge.kernel.org/pub/linux/daemons/autofs/v5/ Autofs[……]