以下是關於在 Debian 系統上管理二進位制和文字資料的工具及其相關提示。
資料的安全和它的受控共享有如下幾個方面。
存檔檔案的建立
遠端儲存訪問
複製
跟蹤修改歷史
促進資料共享
防止未經授權的檔案訪問
檢測未經授權的檔案修改
這些可以通過使用工具集來實現。
存檔和壓縮工具
複製和同步工具
網路檔案系統
移動儲存媒介
安全 shell
認證體系
版本控制系統工具
雜湊演算法和加密工具
以下是 Debian 系統上可用的存檔和壓縮工具的預覽。
表 10.1. 存檔和壓縮工具列表
軟件包 | 流行度 | 大小 | 副檔名 | 命令 | 描述 |
---|---|---|---|---|---|
tar
|
V:904, I:999 | 3152 | .tar |
tar (1) |
標準的歸檔工具(預設) |
cpio
|
V:392, I:998 | 1140 | .cpio |
cpio (1) |
Unix System V 風格的歸檔器,與 find (1) 一起使用 |
binutils
|
V:160, I:657 | 98 | .ar |
ar (1) |
建立靜態庫的歸檔工具 |
fastjar
|
V:2, I:23 | 183 | .jar |
fastjar (1) |
Java 歸檔工具(類似 zip) |
pax
|
V:11, I:22 | 170 | .pax |
pax (1) |
新的 POSIX 歸檔工具,介於 tar 和 cpio 之間 |
gzip
|
V:878, I:999 | 242 | .gz |
gzip (1), zcat (1), … |
GNU LZ77 壓縮工具(預設) |
bzip2
|
V:161, I:974 | 122 | .bz2 |
bzip2 (1), bzcat (1), … |
Burrows-Wheeler
block-sorting 壓縮工具有著比 gzip (1) 更高的壓縮率 (跟
gzip 有著相似的語法但速度比它慢) |
lzma
|
V:2, I:24 | 149 | .lzma |
lzma (1) |
LZMA 壓縮工具有著比 gzip (1)
更高的壓縮率(不推薦) |
xz-utils
|
V:437, I:980 | 612 | .xz |
xz (1), xzdec (1), … |
XZ 壓縮工具有著比 bzip2 (1)
更高的壓縮率(壓縮速度慢於 gzip 但是比 bzip2 快; LZMA 壓縮工具的替代品) |
zstd
|
V:5, I:29 | 1898 | .zstd |
zstd (1), zstdcat (1), … |
Zstandard 快速無失真壓縮工具 |
p7zip
|
V:84, I:471 | 987 | .7z |
7zr (1), p7zip (1) |
有著更高壓縮率的 7-zip 檔案歸檔器(LZMA 壓縮) |
p7zip-full
|
V:117, I:485 | 4664 | .7z |
7z (1), 7za (1) |
有著更高壓縮率的 7-Zip 檔案歸檔器(LZMA 壓縮和其他) |
lzop
|
V:12, I:111 | 164 | .lzo |
lzop (1) |
LZO 壓縮工具有著比 gzip (1)
更高的壓縮和解壓縮速度 (跟 gzip 有著相似的語法但壓縮率比它低) |
zip
|
V:48, I:420 | 623 | .zip |
zip (1) |
InfoZip:DOS 歸檔器和壓縮工具 |
unzip
|
V:141, I:793 | 385 | .zip |
unzip (1) |
InfoZIP:DOS 解檔器和解壓縮工具 |
![]() |
警告 |
---|---|
除非你知道將會發生什麼,否則不要設定 " |
gzipped tar
(1) 歸檔器用於副檔名是 ".tgz
" 或者
".tar.gz
" 的檔案。
xz-compressed tar
(1) 歸檔器用於副檔名是 ".txz
"
或者 ".tar.xz
" 的檔案。
FOSS 工具,例如
tar
(1),中的主流壓縮方法已經按如下所示的遷移: gzip
→
bzip2
→ xz
cp
(1),scp
(1) 和
tar
(1) 工具可能並不適用於一些特殊的檔案。cpio
(1)
工具的適用範圍是最廣的。
cpio
(1) 是被設計為與 find
(1)
和其它命令一起使用,適合於建立備份指令碼的場景,因此,指令碼的檔案選擇部分能夠被獨立測試。
Libreoffice 資料檔案的內部結構是 ".jar
" 檔案,它也可以使用
unzip
工具來開啟。
事實上跨平臺支援最好的存檔工具是 zip
。按照“zip
-rX
”的方式呼叫可以獲得最大的相容性。如果最大檔案大小需要納入考慮範圍,請同時配合“-s
”選項使用。
以下是 Debian 系統上的可用的簡單複製和備份工具的預覽。
表 10.2. 複製和同步工具列表
軟件包 | 流行度 | 大小 | 工具 | 功能 |
---|---|---|---|---|
coreutils
|
V:892, I:999 | 17372 | GNU cp | 複製本地檔案和目錄("-a" 引數實現遞迴) |
openssh-client
|
V:813, I:996 | 4754 | scp | 複製遠端檔案和目錄(客戶端,"-r " 引數實現遞迴) |
openssh-server
|
V:694, I:827 | 1690 | sshd | 複製遠端檔案和目錄(遠端伺服器) |
rsync
|
V:274, I:564 | 737 | 單向遠端同步和備份 | |
unison
|
V:3, I:16 | 14 | 雙向遠端同步和備份 |
在複製檔案的時候, rsync
(8) 比其他工具提供了更多的特性。
差分傳輸演算法只會傳送原始檔與已存在的目標檔案之間的差異部分
快速檢查演算法 (預設) 會查詢大小或者最後的修改時間有變化的檔案
"--exclude
" 和 "--exclude-from
" 選項類似於
tar
(1)
在源目錄中新增反斜槓的語法能夠避免在目標檔案中建立額外的目錄級別。
![]() |
提示 |
---|---|
在 表 10.14 “其它版本控制系統工具列表” 中的版本控制系統 (VCS) 可以被認為是多路拷貝和同步工具。 |
以下是用不同的工具壓縮和解壓縮整個 "./source
" 目錄中的內容。
GNU tar
(1):
$ tar -cvJf archive.tar.xz ./source $ tar -xvJf archive.tar.xz
或者,如下所示。
$ find ./source -xdev -print0 | tar -cvJf archive.tar.xz --null -F -
cpio
(1):
$ find ./source -xdev -print0 | cpio -ov --null > archive.cpio; xz archive.cpio $ zcat archive.cpio.xz | cpio -i
如下是用不同的工具複製整個 "./source
" 目錄中的內容。
本地複製: "./source
" 目錄 → "/dest
" 目錄
遠端複製:本地主機上的 "./source" 目錄
→
"user@host.dom
" 主機上的 "/dest
" 目錄
rsync
(8):
# cd ./source; rsync -aHAXSv . /dest # cd ./source; rsync -aHAXSv . user@host.dom:/dest
你能夠選擇使用“源目錄上的反斜槓”語法。
# rsync -aHAXSv ./source/ /dest # rsync -aHAXSv ./source/ user@host.dom:/dest
或者,如下所示。
# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest # cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . user@host.dom:/dest
GNU cp
(1) 和 openSSH scp
(1):
# cd ./source; cp -a . /dest # cd ./source; scp -pr . user@host.dom:/dest
GNU tar
(1):
# (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - ) # (cd ./source && tar cf - . ) | ssh user@host.dom '(cd /dest && tar xvfp - )'
cpio
(1):
# cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest
你能夠在所有包含 ".
" 的例子裡用 "foo
" 替代
".
",這樣就可以從 "./source/foo
" 目錄複製檔案到
"/dest/foo
" 目錄。
在所有包含 ".
" 的列子裡,你能夠使用絕對路徑
"/path/to/source/foo
" 來代替 ".
",這樣可以去掉
"cd ./source;
". 如下所示,這些檔案會根據工具的不同,拷貝到不同的位置。
"/dest/foo
": rsync
(8), GNU
cp
(1), 和 scp
(1)
"/dest/path/to/source/foo
": GNU
tar
(1), 和 cpio
(1)
![]() |
提示 |
---|---|
|
find
(1) 被用作從歸檔中篩選檔案也被用作拷貝命令 (參見第 10.1.3 节 “歸檔語法”和第 10.1.4 节 “複製語法”)
或者用於 xargs
(1) (參見第 9.4.9 节 “使用檔案迴圈來重複一個命令”)。通過 find
的命令列引數能夠使其功能得到加強。
以下是 find
(1)基本語法的總結。
find 條件引數的運算規則是從左到右。
一旦輸出是確定的,那麼運算就會停止。
“邏輯 OR" (由條件之間的 "-o
"
引數指定的)優先順序低於 "邏輯 AND" (由
"-a
" 引數指定或者條件之間沒有任何引數)。
”邏輯 NOT" (由條件前面的 "!
"
指定) 優先順序高於 “邏輯 AND”。
"-prune
" 總是返回邏輯 TRUE
並且如果這個目錄是存在的,將會搜尋除這個目錄以外的檔案。
"-name
" 選項匹配帶有 shell 萬用字元 (參見第 1.5.6 节 “Shell 萬用字元”) 的檔名但也匹配帶有類似 "*
" 和
"?
" 元字元的 .
"。(新的 POSIX 特性)
"-regex
" 匹配整個檔案路徑,預設採用 emacs 風格的 BRE (參見第 1.6.2 节 “正則表達式”)。
"-size
" 根據檔案大小來匹配 (值前面帶有 "+
"
號匹配更大的檔案,值前面帶有 "-
" 號匹配更小的檔案)
"-newer
" 引數匹配比引數名中指定的檔案還要新的檔案。
"-print0
" 引數總是返回邏輯 TRUE 並將完整檔名 (null
terminated) 列印到標準輸出裝置上。
如下是 find
(1) 語法格式。
# find /path/to \ -xdev -regextype posix-extended \ -type f -regex ".*\.cpio|.*~" -prune -o \ -type d -regex ".*/\.git" -prune -o \ -type f -size +99M -prune -o \ -type f -newer /path/to/timestamp -print0
這些命令會執行如下動作。
查詢 "/path/to
" 下的所有檔案
限定全域性查詢的檔案系統並且使用的是 ERE (參見第 1.6.2 节 “正則表達式”)
通過停止處理的方式來排除匹配 ".*\.cpio
" 或 ".*~
"
正則表示式的檔案
通過停止處理的方式來排除匹配 ".*/\.git
" 正則表示式的目錄
通過停止處理的方式來排除比 99MB (1048576位元組單元) 更大的檔案
顯示檔名,滿足以上搜索條件並且比 "/path/to/timestamp
" 新的檔案
請留心以上例子中的 "-prune -o
" 排除檔案的習慣用法。
![]() |
注意 |
---|---|
對於非 Debian 系的 Unix-like 系統,有些引數可能不被
|
為重要的資料存檔尋找 儲存裝置 時,你應該注意它們的侷限性。對於小型的個人資料備份,我使用品牌公司的 CD-R 和 DVD-R 然後把它放在陰涼、乾燥、清潔的地方。(專業的一般使用磁帶存檔介質)
![]() |
注意 |
---|---|
防火安全是對於紙質文件來說的,大多數的計算機資料儲存媒介耐熱性比紙差。我經常依賴儲存在多個安全地點的加密拷貝。 |
網上(主要是來源於供應商資訊)可以檢視儲存介質的最大使用壽命。
大於100年:用墨水的無酸紙
100年:光碟儲存(CD/DVD,CD/DVD-R)
30年:磁帶儲存(磁帶,軟盤)
20年:相變光碟儲存(CD-RW)
這不包括由於人為導致的機械故障等等。
網上(主要來源於供應商資訊)可以檢視儲存介質的最大的寫次數。
大於250,000次:硬碟驅動器
大於10,000次:快閃記憶體
1,000次:CD/DVD-RW
1次:CD/DVD-R,紙
![]() |
小心 |
---|---|
這裡的儲存壽命和寫次數的資料不應該被用來決定任何用於關鍵資料的儲存媒介,請翻閱製造商提供的特定產品的說明。 |
![]() |
提示 |
---|---|
因為 CD/DVD-R 和 紙只能寫一次,它們從根本上阻止了因為重寫導致的資料意外丟失。這是優點! |
![]() |
提示 |
---|---|
如果你需要更快更頻繁的進行大資料備份,那麼通過高速網路連線的遠端主機上的硬碟來實現備份,可能是唯一可行的方法。 |
可移動儲存裝置可能是以下的任何一種。
數碼相機
數字音樂播放器
它們可以通過以下的方式來進行連線。
像 GNOME 和 KDE 這樣的現代桌面環境能夠在 "/etc/fstab
"
檔案中沒有匹配條目的時候,自動掛載這些可移動裝置。
![]() |
提示 |
---|---|
|
![]() |
提示 |
---|---|
只有當這些可移動裝置沒有在 " |
現代桌面環境下的掛載點被選為
"/media/username/disk_label
",它可以被如下所示的來定製。
FAT 格式的檔案系統使用 mlabel
(1) 命令
ISO9660 檔案系統使用帶有 "-V
" 選項的
genisoimage
(1) 命令
ext2/ext3/ext4 檔案系統使用帶有 "-L
" 選項的
tune2fs
(1) 命令
![]() |
提示 |
---|---|
掛載時可能需要提供編碼選項(參見 第 8.1.3 节 “檔名編碼”)。 |
![]() |
提示 |
---|---|
在圖形介面選單上移除檔案系統,可能會移除它的動態裝置節點例如
" |
當你通過可移動儲存裝置與其他系統分享資料的時候,你應該先把它格式化為被兩種作業系統都支援的通用的 檔案系統。下面是檔案系統的列表。
表 10.3. 典型使用場景下可移動儲存裝置可選擇的檔案系統列表
檔案系統名 | 典型使用場景 |
---|---|
FAT12 | 軟盤(<32MiB)上跨平臺的資料分享 |
FAT16 | 在小硬碟(<2GiB)上的跨平臺的資料分享 |
FAT32 | 在大硬碟(<8TiB,被 MS Windows95 OSR2 以上的作業系統所支援) 上的跨平臺的資料分享 |
exFAT | 在大硬碟類裝置上跨平臺共享資料(<512TiB,被 WindowsXP, Mac OS X Snow Leopard 10.6.5 和 Linux 核心 5.4 版本以上的作業系統所支援) |
NTFS | 在大硬碟類裝置上的跨平臺共享資料 (在 MS Windows NT 和後續版本原生支援;在 Linux 上,通過使用 FUSE 的 NTFS-3G 支援。) |
ISO9660 | 在 CD-R 和 DVD+/-R 上的跨平臺的靜態資料分享 |
UDF | CD-R 和 DVD+/-R (新)上的增量資料寫入 |
MINIX | 軟盤上磁碟空間高利用率的 unix 檔案資料儲存 |
ext2 | 在裝有老舊 linux 系統的硬碟上的資料分享 |
ext3 | 在裝有老舊 linux 系統的硬碟上的資料分享 |
ext4 | 在裝有較新的 linux 系統的硬碟上的資料分享 |
btrfs | 使用只讀快照在裝有較新的 Linux 系統的硬碟上共享資料 |
![]() |
提示 |
---|---|
檢視第 9.9.1 节 “使用 dm-crypt/LUKS 加密移動磁碟”來獲得關於使用裝置級加密的跨平臺的資料共享的資訊。 |
FAT 檔案系統被絕大多數的現代作業系統支援,它對於通過可行動硬碟進行的資料交換是非常有用的。
當格式化像裝有 FAT 檔案系統的跨平臺資料共享的可移動裝置時,以下應該是保險的選擇。
用 fdisk
(8),cfdisk
(8) 或者
parted
(8) 命令(參見第 9.6.2 节 “硬碟分割槽配置”)把它們格式化為單個的主分割槽並對把它做如下標記。
標記小於 2GB 的 FAT 裝置為 字元"6"。
標記更大的 FAT32 裝置為字元 "c"。
如下所示是用 mkfs.vfat
(8) 命令格式化主分割槽的。
它的裝置名字,例如 "/dev/sda1
" 用於 FAT16 裝置
明確的選項和它的裝置名,例如 "-F 32 /dev/sda1
" 用於 FAT32 裝置
當使用 FAT 或 ISO9660 檔案系統分享資料時,如下是需要注意的安全事項。
用
tar
(1),或cpio
(1)命令壓縮檔案,目地是為了保留檔名,符號連結,原始的檔案許可權和檔案所有者資訊。
用 split
(1) 命令把壓縮檔案分解成若干小於 2GiB的小檔案,使其免受檔案大小限制。
加密壓縮檔案保護其內容免受未經授權的訪問。
![]() |
注意 |
---|---|
因為 FAT 檔案系統的設計,最大的檔案大小為 |
![]() |
注意 |
---|---|
微軟系統本身並不建議在超過 200MB 的分割槽或者驅動器上使用 FAT。他們的 " Overview of FAT, HPFS, and NTFS File Systems 這篇文章突出顯示了微軟系統的缺點,例如低效的磁碟空間利用。當然了,我們在 Linux 系統上還是應該使用 ext4 檔案系統。 |
![]() |
提示 |
---|---|
有關檔案系統和訪問檔案系統的更多資訊,請參考 "Filesystems HOWTO"。 |
當使用網路來分享資料的時候,你應該使用通用的服務。這裡有一些提示。
表 10.4. 典型使用場景下可選擇的網路服務列表
網路服務 | 典型使用場景描述 |
---|---|
SMB/CIFS 用 Samba 掛載網路檔案系統 | 通過 “Microsoft Windows 網路” 分享檔案,參見 smb.conf (5) 和 官方 Samba 3.x.x 指導和參考手冊(The Official
Samba 3.x.x HOWTO and Reference Guide) 或
samba-doc 軟體包 |
NFS 用 Linux 核心掛載網路檔案系統 | 通過 “Unix/Linux 網路" 分享檔案,參見 exports (5) 和 Linux NFS-HOWTO |
HTTP 服務 | 在 web 伺服器/客戶端之間分享檔案 |
HTTPS 服務 | 在有加密的安全套接層 (SSL) 或者安全傳輸層 (TLS) 的網路伺服器/客戶端中分享檔案 |
FTP 服務 | 在 FTP 伺服器/客戶端之間分享檔案 |
儘管對於檔案分享來說,通過網路掛載檔案系統和傳輸檔案是相當方便的,但這可能是不安全的。它們的網路連線必須通過如下所示的加強安全性。
我們都熟知計算機有時會出問題,或者由於人為的錯誤導致系統和資料損壞。備份和恢復操作是成功的系統管理中非常重要的一部分。可能有一天你的電腦就會出問題。
![]() |
提示 |
---|---|
保持你的備份系統簡潔並且經常備份你的系統,有備份資料比你採用的備份方法的技術先進要重要的多。 |
有3個關鍵的因素決定實際的備份和恢復策略。
知道要備份和恢復什麼。
你自己建立的資料檔案:在 "~/
" 下的資料
你使用的應用程式建立的資料檔案:在 "/var/
" 下的資料(除了
"/var/cache/
","/var/run/
" 和
"/var/tmp/
")
系統配置檔案:在 "/etc/
” 下的資料
Local programs: data in "/usr/local/
" or
"/opt/
"
系統安裝資訊:關鍵步驟 (分割槽,...) 的純文字備忘錄
驗證資料結果:通過實驗性的恢復操作來預先驗證
Cron job as a user process: files in
"/var/spool/cron/crontabs
" directory and restart
cron
(8). See 第 9.4.14 节 “定時任務安排” for cron
(8) and
crontab
(1).
Systemd timer jobs as user processes: files in
"~/.config/systemd/user
" directory. See
systemd.timer
(5) and
systemd.service
(5).
Autostart jobs as user processes: files in
"~/.config/autostart
" directory. See Desktop Application Autostart
Specification.
知道怎樣去備份和恢復。
安全的資料儲存:保護其免於覆蓋和系統故障
經常備份:有計劃的備份
冗餘備份:資料映象
傻瓜式操作:單個簡單命令備份
評估涉及的風險和成本。
Risk of data when lost
Data should be at least on different disk partitions preferably on different disks and machines to withstand the filesystem corruption. Important data are best stored on a read-only filesystem. [4]
Risk of data when breached
Sensitive identity data such as
"/etc/ssh/ssh_host_*_key
",
"~/.gnupg/*
", "~/.ssh/*
",
"~/.local/share/keyrings/*
",
"/etc/passwd
", "/etc/shadow
",
"popularity-contest.conf
",
"/etc/ppp/pap-secrets
", and
"/etc/exim4/passwd.client
" should be backed up as
encrypted. [5] (See 第 9.9 节 “資料加密提示”.)
Never hard code system login password nor decryption passphrase in any script even on any trusted system. (See 第 10.3.6 节 “密碼金鑰環”.)
資料丟失的方式及其可能性
Hardware (especially HDD) will break
Filesystem may be corrupted and data in it may be lost
Remote storage system can't be trusted for security breaches
Weak password protection can be easily compromised
File permission system may be compromised
備份所需的資源:人力,硬體,軟體,…
Automatic scheduled backup with cron job or systemd timer job
![]() |
注意 |
---|---|
除非你知道自己做的是什麼,否則不要備份 |
![]() |
注意 |
---|---|
當備份資料的時候,你可能希望停止一些應用程式的守護程序例如 MTA(參見第 6.2.4 节 “郵件傳輸代理 (MTA)”)。 |
以下是 Debian 系統上值得注意的實用備份程式套件的列表。
表 10.5. 實用備份程式套件列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
dump
|
V:1, I:6 | 351 | 4.4 BSD dump (8) 和
restore (8) 命令用於 ext2/ext3/ext4 檔案系統 |
xfsdump
|
V:0, I:8 | 854 | 在 GNU/Linux 和 IRIX 上用
xfsdump (8) 和 xfsrestore (8) 命令來備份和恢復
XFS 檔案系統 |
backupninja
|
V:3, I:4 | 367 | 輕量的可擴充套件的 meta-backup 系統 |
bacula-common
|
V:9, I:13 | 2158 | Bacula: 網路資料備份,恢復和核查-常見的支援檔案 |
bacula-client
|
I:3 | 183 | Bacula: 網路資料備份,恢復和核查-客戶端元軟體包 |
bacula-console
|
V:1, I:4 | 107 | Bacula: 網路資料備份,恢復和核查-文字終端 |
bacula-server
|
I:1 | 183 | Bacula: 網路資料備份,恢復和核查-伺服器端元軟體包 |
amanda-common
|
V:0, I:2 | 9998 | Amanda: 馬里蘭大學開發的高階自動化網路磁碟歸檔器(庫) |
amanda-client
|
V:0, I:2 | 1088 | Amanda: 馬里蘭大學開發的高階自動化網路磁碟歸檔器(客戶端) |
amanda-server
|
V:0, I:0 | 1090 | Amanda: 馬里蘭大學開發的高階自動化網路磁碟歸檔器(伺服器端) |
backup-manager
|
V:1, I:1 | 571 | 命令列備份工具 |
backup2l
|
V:0, I:1 | 114 | 用於可掛載媒介 (基於磁碟的) 的低維護的備份/恢復工具 |
backuppc
|
V:2, I:3 | 3184 | BackupPC 是用於備份 PC 機資料(基於磁碟)的高效能的企業級工具 |
duplicity
|
V:13, I:32 | 1834 | (遠端) 增量備份 |
flexbackup
|
V:0, I:0 | 243 | (遠端) 增量備份 |
rdiff-backup
|
V:5, I:13 | 733 | (遠端) 增量備份 |
restic
|
V:1, I:4 | 21080 | (遠端) 增量備份 |
slbackup
|
V:0, I:0 | 151 | (遠端) 增量備份 |
備份工具有各自的專用的用途。
Mondo Rescue 是一個備份系統,它能夠方便的從備份 CD/DVD 等裝置中快速恢復整個系統,而不需要經過常規的系統安裝過程。
定期備份使用者資料,可以透過一個簡單的指令碼實現 (第 10.2.3 节 “個人備份”)。
第 10.1.1 节 “存檔和壓縮工具” 和 第 10.1.2 节 “複製和同步工具” 描述的基礎工具能夠通過自定義指令碼來幫助系統備份。這些指令碼的功能可以通過如下的工具來增強。
restic
軟體包能夠增量備份(遠端)。
rdiff-backup
軟體包能夠增量備份(遠端)。
dump
軟體包用於高效增量的歸檔和恢復整個檔案系統。
![]() |
提示 |
---|---|
參見 " |
對於執行 testing
套件的個人 Debian
桌面系統來說,只需要保護個人資料和關鍵資料。我不管怎樣每年都會重新安裝一次系統。因此沒理由去備份整個系統或者安裝全功能的備份實用程式。
與此同時,有一定頻率的最近的個人資料和系統配置快照的備份,加上偶爾個人資料的全備份,是非常有價值的。
I usually make these snapshots and backups with a simple shell script bss. This script is a short shell which uses standard
utilities: btrfs subvolume snapshot
,
rsync
. For data encryption, disk image is created by
fallocate
(1) and configured with
cryptsetup
(8).
![]() |
提示 |
---|---|
你能夠用 " |
資料安全基礎設施是資料加密,訊息摘要和簽名工具的結合。
表 10.6. 資料安全基礎工具列表
軟件包 | 流行度 | 大小 | 命令 | 說明 |
---|---|---|---|---|
gnupg
|
V:533, I:936 | 864 | gpg (1) |
GNU 隱私衛士 - OpenPGP 加密和簽名工具 |
gpgv
|
V:874, I:999 | 882 | gpgv (1) |
GNU 隱私衛士 - 簽名驗證工具 |
paperkey
|
V:1, I:13 | 58 | paperkey (1) |
從 OpenPGP 私鑰裡面,僅僅匯出私密資訊 |
cryptsetup
|
V:21, I:78 | 444 | cryptsetup (8), … |
dm-crypt 塊裝置加密支援 LUKS 工具 |
coreutils
|
V:892, I:999 | 17372 | md5sum (1) |
計算與校驗 MD5 訊息摘要 |
coreutils
|
V:892, I:999 | 17372 | sha1sum (1) |
計算與校驗 SHA1 訊息摘要 |
openssl
|
V:806, I:994 | 1466 | openssl (1ssl) |
使用 "openssl dgst " (OpenSSL)計算資訊摘要 |
libsecret-tools
|
V:1, I:8 | 45 | secret-tool (1) |
儲存和取回密碼 (CLI) |
seahorse
|
V:77, I:253 | 7804 | seahorse (1) |
金鑰管理工具(GNOME) |
參見 第 9.9 节 “資料加密提示” 的 dm-crypt 和 fscrypt,它們透過 Linux 核心模組實現了自動資料加密架構。
如下是 GNU 隱私衛士 基本的金鑰管理命令。
表 10.7. GNU 隱私衛士金鑰管理命令的列表
命令 | 說明 |
---|---|
gpg --gen-key |
生成一副新的金鑰對 |
gpg --gen-revoke my_user_ID |
生成 my_user_ID 的一份吊銷證書 |
gpg --edit-key user_ID |
互動式的編輯金鑰,輸入 "help" 來獲得幫助資訊 |
gpg -o file --export |
把所有的金鑰輸出到檔案 |
gpg --import file |
從檔案匯入金鑰 |
gpg --send-keys user_ID |
傳送 user_ID 的公鑰到公鑰伺服器 |
gpg --recv-keys user_ID |
從公鑰伺服器下載 user_ID 的公鑰 |
gpg --list-keys user_ID |
列出 user_ID 的所有金鑰 |
gpg --list-sigs user_ID |
列出 user_ID 的簽字 |
gpg --check-sigs user_ID |
檢查 user_ID 金鑰簽字 |
gpg --fingerprint user_ID |
檢查 user_ID 的指紋 |
gpg --refresh-keys |
更新本地金鑰 |
信任碼含義.
如下命令上傳我的 "1DD8D791
" 公鑰到主流的公鑰伺服器
"hkp://keys.gnupg.net
"。
$ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791
預設良好的公鑰伺服器在 "~/.gnupg/gpg.conf
" (舊的位置在
"~/.gnupg/options
")檔案中設定,此檔案包含了以下資訊。
keyserver hkp://keys.gnupg.net
從鑰匙伺服器獲取無名鑰匙。
$ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\ cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys
有一個錯誤在 OpenPGP 公鑰伺服器 (先前的版本
0.9.6),會將鍵中斷為 2 個以上的子鍵。新的 gnupg
(>1.2.1-2)
軟體包能夠處理這些中斷的子鍵。參見 gpg
(1) 下的
"--repair-pks-subkey-bug
" 選項.
這裡有一些在檔案上使用 GNU 隱私衛士 命令的例子。
表 10.9. 在檔案上使用的 GNU 隱私衛士的命令列表
命令 | 說明 |
---|---|
gpg -a -s file |
ASCII 封裝的簽名檔案 file.asc |
gpg --armor --sign file |
同上 |
gpg --clearsign file |
生成明文簽字資訊 |
gpg --clearsign file|mail foo@example.org |
傳送一份明文簽字到 foo@example.org |
gpg --clearsign --not-dash-escaped patchfile |
明文簽名的補丁檔案 |
gpg --verify file |
驗證明文檔案 |
gpg -o file.sig -b file |
生成一份分離的簽字 |
gpg -o file.sig --detach-sig file |
同上 |
gpg --verify file.sig file |
使用 file.sig 驗證檔案 |
gpg -o crypt_file.gpg -r name -e file |
公鑰加密,從檔案裡面獲取名字,生成二進位制的 crypt_file.gpg |
gpg -o crypt_file.gpg --recipient name --encrypt file |
同上 |
gpg -o crypt_file.asc -a -r name -e file |
公鑰加密,從檔案中獲取名字,生成 ASCII 封裝的 crypt_file.asc |
gpg -o crypt_file.gpg -c file |
將檔案對稱加密到 crypt_file.gpg |
gpg -o crypt_file.gpg --symmetric file |
同上 |
gpg -o crypt_file.asc -a -c file |
對稱加密,從檔案到 ASCII 封裝的 crypt_file.asc |
gpg -o file -d crypt_file.gpg -r name |
解密 |
gpg -o file --decrypt crypt_file.gpg |
同上 |
增加下面內容到 "~/.muttrc
",在自動啟動時,避免一個慢的 GnuPG,在索引選單中按
"S
" 來允許它使用。
macro index S ":toggle pgp_verify_sig\n" set pgp_verify_sig=no
gnupg
外掛可以讓你對副檔名為 ".gpg
",
".asc
", 和 ".ppg
"的檔案可靠的執行
GnuPG。[6]
$ sudo aptitude install vim-scripts $ echo "packadd! gnupg" >> ~/.vim/vimrc
md5sum
(1) 提供了製作摘要檔案的一個工具,它使用 rfc1321 裡的方式製作摘要檔案.
$ md5sum foo bar >baz.md5 $ cat baz.md5 d3b07384d113edec49eaa6238ad5ff00 foo c157a79031e1c40f85931829bc5fc552 bar $ md5sum -c baz.md5 foo: OK bar: OK
![]() |
注意 |
---|---|
MD5 校驗和的 CPU 計算強度是比 GNU Privacy Guard (GnuPG) 加密簽名要少的.在通常情況下,只有頂級的摘要檔案才需要加密簽名來確保資料完整性. |
On GNOME system, the GUI tool seahorse
(1) manages
passwords and stores them securely in the keyring
~/.local/share/keyrings/*
.
secret-tool
(1) 能夠從命令列儲存密碼到鑰匙環。
讓我們來用 secret-tool
(1) 儲存 LUKS/dm-crypt 加密磁碟映象使用的密碼。
$ secret-tool store --label='LUKS passphrase for disk.img' LUKS my_disk.img Password: ********
這個儲存的密碼能夠被獲取並給到其它程式,比如 cryptsetup
(8)。
$ secret-tool lookup LUKS my_disk.img | \ cryptsetup open disk.img disk_img --type luks --keyring - $ sudo mount /dev/mapper/disk_img /mnt
![]() |
提示 |
---|---|
無論何時,你需要在一個腳本里面提供密碼時,使用 |
這裡有許多原始碼合併工具。如下的是我感興趣的工具。
表 10.10. 原始碼合併工具列表
軟件包 | 流行度 | 大小 | 命令 | 說明 |
---|---|---|---|---|
patch
|
V:75, I:714 | 248 | patch (1) |
給原檔案打補丁 |
vim
|
V:103, I:394 | 3498 | vimdiff (1) |
在 vim 中並排比較兩個檔案 |
imediff
|
V:0, I:0 | 169 | imediff (1) |
全屏互動式兩路/三路合併工具 |
meld
|
V:14, I:37 | 3086 | meld (1) |
比較和移植檔案(GTK) |
wiggle
|
V:0, I:0 | 174 | wiggle (1) |
應用被拒絕的補丁 |
diffutils
|
V:870, I:993 | 1598 | diff (1) |
逐行比較兩個檔案 |
diffutils
|
V:870, I:993 | 1598 | diff3 (1) |
逐行比較和合並三個檔案 |
quilt
|
V:3, I:30 | 788 | quilt (1) |
管理系列補丁 |
wdiff
|
V:8, I:65 | 644 | wdiff (1) |
在文字檔案中,顯示單詞的不同 |
diffstat
|
V:14, I:143 | 81 | diffstat (1) |
通過 diff 生成一個改變柱狀圖 |
patchutils
|
V:16, I:139 | 232 | combinediff (1) |
從兩個增量補丁建立一個積累補丁 |
patchutils
|
V:16, I:139 | 232 | dehtmldiff (1) |
從一個 HTML 頁面提取出一個 diff |
patchutils
|
V:16, I:139 | 232 | filterdiff (1) |
從一個 diff 檔案裡面提取或者排除 diff 檔案 |
patchutils
|
V:16, I:139 | 232 | fixcvsdiff (1) |
修復由 CVS patch (1) 錯誤建立的 diff 檔案 |
patchutils
|
V:16, I:139 | 232 | flipdiff (1) |
交換兩個補丁的順序 |
patchutils
|
V:16, I:139 | 232 | grepdiff (1) |
顯示哪些檔案是由匹配正則表示式的補丁修改 |
patchutils
|
V:16, I:139 | 232 | interdiff (1) |
顯示在兩個統一格式 diff 檔案(基於同一個檔案的兩個不同 diff 檔案)之間的差異 |
patchutils
|
V:16, I:139 | 232 | lsdiff (1) |
顯示哪些檔案由補丁修改 |
patchutils
|
V:16, I:139 | 232 | recountdiff (1) |
重新計算通用內容 diff 檔案的數量和偏移 |
patchutils
|
V:16, I:139 | 232 | rediff (1) |
修復手工編輯 diff 檔案的數量和偏移 |
patchutils
|
V:16, I:139 | 232 | splitdiff (1) |
隔離出增量補丁 |
patchutils
|
V:16, I:139 | 232 | unwrapdiff (1) |
識別已經被分詞的補丁 |
dirdiff
|
V:0, I:2 | 166 | dirdiff (1) |
顯示目錄樹之間的不同並移植改變 |
docdiff
|
V:0, I:0 | 555 | docdiff (1) |
逐詞逐字的比較兩個檔案 |
makepatch
|
V:0, I:0 | 102 | makepatch (1) |
生成擴充套件補丁檔案 |
makepatch
|
V:0, I:0 | 102 | applypatch (1) |
應用擴充套件補丁檔案 |
下面的操作,匯出兩個原始檔的不同,並根據檔案的位置,建立通用 diff 檔案"file.patch0
" 或
"file.patch1
".
$ diff -u file.old file.new > file.patch0 $ diff -u old/file new/file > file.patch1
diff 檔案(通常被叫作 patch 補丁檔案),用於傳送一個程式更新。通過下面的方式,接收到的部分,應用這個更新到其它檔案。
$ patch -p0 file < file.patch0 $ patch -p1 file < file.patch1
Git 是這些天選擇的用於 版本控制系統 version control system (VCS) 的工具,因為 Git 能夠同時在本地和遠端原始碼管理上,做任何事情。
透過 Debian Salsa 服務,Debian 能夠提供免費的 Git 服務。在 https://wiki.debian.org/Salsa 能找到它的說明文件。
下面是一些 Git 相關軟體包。
表 10.11. git 相關包和命令列表
軟件包 | 流行度 | 大小 | 命令 | 說明 |
---|---|---|---|---|
git
|
V:318, I:498 | 36744 | git (7) |
Git 快速、可擴展、分佈式的版本控制系統 |
gitk
|
V:6, I:40 | 1760 | gitk (1) |
有歷史功能的 Git 圖形倉庫瀏覽器 |
git-gui
|
V:1, I:22 | 2354 | git-gui (1) |
Git 圖形界面(無歷史功能) |
git-email
|
V:0, I:11 | 1006 | git-send-email (1) |
從 Git 用電子郵件發送收集到的補丁 |
git-buildpackage
|
V:1, I:11 | 4220 | git-buildpackage (1) |
用 Git 自動製作 Debian 包 |
dgit
|
V:0, I:1 | 497 | dgit (1) |
Debian 檔案庫的 git 互動操作 |
imediff
|
V:0, I:0 | 169 | git-ime (1) |
互動式的分開 git 提交的輔助工具 |
stgit
|
V:0, I:0 | 603 | stg (1) |
封裝的 git (Python) |
git-doc
|
I:14 | 12150 | N/A | Git 官方文檔 |
gitmagic
|
I:1 | 721 | N/A | "Git 魔術",易於理解的 Git 手冊 |
你可以在 "~/.gitconfig
" 裏面設置幾個 Git
接下來需要使用的全局配置,比如說你的名字和電子郵件地址。
$ git config --global user.name "Name Surname" $ git config --global user.email yourname@example.com
你也可以按如下所示定製 Git 的預設行為。
$ git config --global init.defaultBranch main $ git config --global pull.rebase true $ git config --global push.default current
如果你習慣使用 CVS 或 Subversion 命令,你也許希望設置如下幾個命令別名。
$ git config --global alias.ci "commit -a" $ git config --global alias.co checkout
你能夠通過如下方式檢查你的整體組態。
$ git config --global --list
Git 操作涉及幾個資料。
工作樹目錄保持面向使用者的檔案,你可以對它們做出改變。
需要被記錄的改變,必須明確的被選擇並暫存到索引。這是 git add
和 git
rm
命令。
索引保持暫存檔案。
在接下來的請求之前,暫存檔案將被提交到本地倉庫。這個是 git commit
命令。
本地倉庫保持已經提交的的檔案。
Git 記錄提交資料的連結歷史並在倉庫裡面將它們作為分支組織。
本地倉庫透過 git push
命令傳送資料到遠端倉庫。
本地倉庫能夠透過 git fetch
和 git pull
命令從遠端倉庫接收資料。
git pull
命令在 git fetch
後執行
git merge
或 git rebase
命令。
這裡,git merge
聯合兩個獨立分支的歷史結尾到一個點。(在沒有定製的 git
pull
,這個是預設的,同時對上游作者釋出分支到許多人時,也是好的 )
這裡,git rebase
建立一個遠端分支的序列歷史的單個分支,跟著本地分支。(這是定製
pull.rebase true
的情況,對我們其餘的用途有用。)
遠端倉庫保持已經提交的檔案。
到遠端倉庫的通訊,使用安全的通訊協議,比如 SSH 或 HTTPS。
工作樹是在 .git/
目錄之外的檔案。在 .git/
目錄裡面的檔案,包括索引、本地倉庫資料和一些 git 配置的文字檔案。
這裡是主要的 Git 命令概覽。
表 10.12. 主要的 Git 命令
Git 命令 | 功能 |
---|---|
git init |
建立(本地)儲存庫 |
git clone URL |
克隆遠端儲存庫到本地倉庫工作目錄樹 |
git pull origin main |
透過遠端倉庫 origin 更新本地 main 分支 |
git add . |
增加工作樹裡面的檔案僅作為預先存在的索引檔案 |
git add -A . |
增加工作樹裡面的所有檔案到索引(包括已經刪除的) |
git rm filename |
從工作樹和索引中刪除檔案 |
git commit |
提交在索引中的暫存改變到本地儲存庫 |
git commit -a |
新增工作樹裡的所有的改變到索引並提交它們到本地倉庫(新增 + 提交) |
git push -u origin branch_name |
使用本地 branch_name 分支更新遠端倉庫 origin (初始啟用) |
git push origin branch_name |
使用本地 branch_name 分支更新遠端倉庫 origin (隨後呼叫) |
git diff treeish1 treeish2 |
顯示 treeish1 提交和 treeish2 提交的不同 |
gitk |
VCS 儲存庫分支歷史樹的圖形介面顯示 |
下面是一些 Git 技巧。
表 10.13. Git 技巧
Git 命令列 | 功能 |
---|---|
gitk --all |
參看完整的 Git 歷史和操作,比如重置 HEAD 到另外一個提交、挑選補丁、建立標籤和分支…… |
git stash |
得到一個乾淨的工作樹,不會丟失資料 |
git remote -v |
檢查遠端設定 |
git branch -vv |
檢查分支設定 |
git status |
顯示工作樹狀態 |
git config -l |
列出 git 設定 |
git reset --hard HEAD; git clean -x -d -f |
反轉所有工作樹的改變並完全清理它們 |
git rm --cached filename |
反轉由 git add filename 改變的暫存索引 |
git reflog |
獲取參考日誌(對從刪除的分支中恢復提交有用) |
git branch new_branch_name HEAD@{6} |
從 reflog 資訊建立一個新的分支 |
git remote add new_remote URL |
增加一個由 URL 指向的遠端倉庫 new_remote |
git remote rename origin upstream |
遠端倉庫的名字從 origin 重新命名到 upstream |
git branch -u upstream/branch_name |
設定遠端跟蹤到遠端倉庫upstream 和它的分支名
branch_name 。 |
git remote set-url origin https://foo/bar.git |
改變 origin 的 URL |
git remote set-url --push upstream DISABLED |
禁止推送到 upstream (編輯 .git/config 來重新啟用) |
git checkout -b topic_branch ; git push -u topic_branch
origin |
製作一個新的 topic_branch 並把它推送到 origin |
git branch -m oldname newname |
本地分支改名 |
git push -d origin branch_to_be_removed |
刪除遠端分支(新的方式) |
git push origin :branch_to_be_removed |
刪除遠端分支(老的方式) |
git checkout --orphan unconnected |
建立一個新的 unconnected 分支 |
git rebase -i origin/main |
從 origin/main 重新排序、刪除、壓縮提交到一個乾淨的分支歷史 |
git reset HEAD^; git commit --amend |
壓縮最後兩個提交為一個 |
git checkout topic_branch ; git merge --squash topic_branch
|
壓縮整個 topic_branch 到一個提交 |
git fetch --unshallow --update-head-ok origin
'+refs/heads/*:refs/heads/*' |
反轉一個淺克隆到一個所有分支的完整克隆 |
git ime |
分開最後的提交到一系列單個逐一檔案的小提交。(要求 imediff ) |
git repack -a -d; git prune |
本地倉庫重新打包到一個單獨的包中(這可能限制從刪除分支裡面恢復丟失資料等機會) |
![]() |
警告 |
---|---|
不要使用帶空格的標簽字符串。即使一些工具,如 |
![]() |
小心 |
---|---|
如果一個本地分支推送到一個已經變基或者壓縮過的倉庫,推送這樣的分支有風險,並要求 |
![]() |
小心 |
---|---|
從命令列通過 " |
![]() |
提示 |
---|---|
如果有一個可執行檔案 |
看下面。
man 手冊: git(1)
(/usr/share/doc/git-doc/git.html
)
Git 用戶手冊
(/usr/share/doc/git-doc/user-manual.html
)
git 介紹教程
(/usr/share/doc/git-doc/gittutorial.html
)
git 介紹教程:第二部
(/usr/share/doc/git-doc/gittutorial-2.html
)
GIT 每一天 20個左右的命令
(/usr/share/doc/git-doc/giteveryday.html
)
Git 魔術
(/usr/share/doc/gitmagic/html/index.html
)
版本控制系統(VCS )有時被認為是修訂控制系統 (RCS), 或者是軟體配置管理程式 (SCM)。
這裡是 Debian 系統上著名的其它非 Git 的 VCS 彙總。
表 10.14. 其它版本控制系統工具列表
軟件包 | 流行度 | 大小 | 工具 | VCS 型別 | 描述 |
---|---|---|---|---|---|
mercurial
|
V:6, I:42 | 1059 | Mercurial | 分散式 | mercurial 主要是用 Python 寫的還有一部分是 C 寫的 |
darcs
|
V:0, I:7 | 23160 | Darcs | 分散式 | 有智慧代數補丁的 DVCS(慢) |
bzr
|
V:1, I:14 | 28 | Bazaar | 分散式 | 受 tla 啟發並且是用 Python 寫的 DVCS (歷史) |
tla
|
V:0, I:2 | 1011 | GNU arch | 分散式 | 主要由 Tom Lord 寫的 DVCS (成為歷史的) |
subversion
|
V:17, I:98 | 4874 | Subversion | 遠端 | ”比 CVS 做的好“,遠端 VCS 的新標準(歷史) |
cvs
|
V:4, I:36 | 4620 | CVS | 遠端 | 以前的遠端 VCS 標準(歷史) |
tkcvs
|
V:0, I:1 | 1498 | CVS, … | 遠端 | VCS (CVS,Subversion,RCS) 儲存庫樹的圖形介面顯示 |
rcs
|
V:3, I:17 | 562 | RCS | 本地 | "比 Unix SCCS 做的好"(歷史) |
cssc
|
V:0, I:2 | 2044 | CSSC | 本地 | Unix SCCS 的克隆(歷史) |
[4] A write-once media such as CD/DVD-R can prevent overwrite accidents. (See 第 9.8 节 “二進位制資料” for how to write to the storage media from the shell commandline. GNOME desktop GUI environment gives you easy access via menu: "Places→CD/DVD Creator".
[5] Some of these data can not be regenerated by entering the same input string to the system.
[6] 如果你使用 "~/.vimrc
" 代替
"~/.vim/vimrc
",請進行相應的取代。