Docker —— 隔離的基本操作(1)
- 1. 用戶和權限隔離
- 2. 進程隔離
- 3. 文件系統隔離
- 4. 資源隔離(Cgroups)
- 5. 網絡隔離
- 6. 安全增強(SELinux/AppArmor)
- 7. 容器技術(Docker/LXC)
- 總結
- dd
- 基本語法
- 常見用途示例
- 1. 磁盤/分區備份(克隆)
- 2. 創建空文件(預分配空間)
- 3. 銷毀磁盤數據(安全擦除)
- 4. 復制 ISO 到 U 盤(制作啟動盤)
- 5. 修改文件部分內容
- 6. 測試磁盤讀寫速度
- 注意事項
- 總結
- mkfs
- 基本語法
- 常見文件系統類型
- `mkfs` 命令參數詳解
- 常見文件系統專用參數示例
- 1. ext4 文件系統
- 2. FAT/VFAT 文件系統
- 3. XFS 文件系統
- 常用操作示例
- 1. 格式化分區為 ext4(Linux 常用)
- 2. 格式化 U 盤為 FAT32(兼容 Windows/macOS)
- 3. 格式化并啟用 XFS(適合大文件)
- 4. 檢查設備后再格式化
- 高級選項
- 1. 調整 inode 數量(適用于大量小文件)
- 2. 啟用文件系統加密(ext4)
- 3. 指定塊大小(block size)
- 注意事項
- 總結
- df
- `df` 命令詳解
- 基本語法
- 常用選項
- 常用示例
- 輸出字段說明
- 實用技巧
- mount
- `mount` 命令詳解
- 基本語法
- 常用選項
- 常用掛載選項 (`-o`)
- 常用示例
- `/etc/fstab` 文件格式
- 卸載文件系統
- 常見問題解決
我們之前已經了解了Docker技術架構演進的一個基本路線,如果還沒有了解的小伙伴可以點擊這里:
https://blog.csdn.net/qq_67693066/article/details/147678726
今天我們在學習Docker之前,我們先來了解一下操作系統自帶的隔離,主要是要大家意識到,隔離并不是Docker的獨家,操作系統自己早就實現了隔離,并且這些命令對于之后的Docker學習也是有幫助的。
Linux 操作系統通過多種機制實現進程、用戶、文件系統、網絡等資源的隔離,確保安全性和穩定性。以下是 Linux 的主要隔離技術及其實現方式:
1. 用戶和權限隔離
Linux 使用 用戶(User)和組(Group) 進行權限控制,確保不同用戶只能訪問授權資源:
uid
(用戶ID)和gid
(組ID):每個進程和文件都有所屬用戶和組。chmod
、chown
:控制文件訪問權限(rwx
)。sudo
和su
:限制普通用戶執行特權操作。/etc/passwd
和/etc/shadow
:存儲用戶信息,密碼加密存儲。
示例:
# 查看當前用戶信息
id
# 修改文件權限
chmod 600 /path/to/file # 僅所有者可讀寫
chown user:group /path/to/file
2. 進程隔離
Linux 內核通過 命名空間(Namespaces) 實現進程間的隔離:
命名空間類型 | 作用 |
---|---|
PID | 進程ID 獨立(不同命名空間的進程看不到彼此) |
Mount (mnt ) | 文件系統掛載點隔離 |
Network (net ) | 獨立網絡棧(IP、端口、路由表等) |
UTS | 主機名和域名隔離 |
IPC | 進程間通信(消息隊列、共享內存等)隔離 |
User | 用戶和組ID 隔離(容器內 root ≠ 宿主機 root) |
Cgroup (cgroup ) | 控制資源使用(CPU、內存等) |
示例:查看進程的命名空間
ls -l /proc/$$/ns # 查看當前進程的命名空間
3. 文件系統隔離
chroot
:修改進程的根目錄,限制其訪問范圍(早期容器技術)。- OverlayFS:聯合文件系統(Docker 使用),實現分層存儲。
mount --bind
:掛載特定目錄,實現文件訪問控制。
示例:使用 chroot
創建隔離環境
# 創建一個簡單的隔離環境
mkdir -p /jail/{bin,lib64}
cp /bin/bash /jail/bin/
cp /lib64/{ld-linux-x86-64.so.2,libc.so.6} /jail/lib64/
chroot /jail /bin/bash # 進入隔離環境
4. 資源隔離(Cgroups)
Control Groups (cgroups) 限制進程的資源使用:
- CPU:分配 CPU 時間片。
- Memory:限制內存使用。
- I/O:控制磁盤讀寫帶寬。
- Network:限制網絡帶寬。
示例:使用 cgroups v2
限制進程內存
# 創建 cgroup
mkdir /sys/fs/cgroup/memory/mycgroup
echo 100000000 > /sys/fs/cgroup/memory/mycgroup/memory.limit_in_bytes
# 將進程加入 cgroup
echo $$ > /sys/fs/cgroup/memory/mycgroup/cgroup.procs
5. 網絡隔離
- Network Namespace:每個容器/進程有獨立的網絡棧。
iptables
/nftables
:防火墻規則隔離流量。veth
虛擬設備:連接不同網絡命名空間。bridge
:虛擬交換機管理容器網絡。
示例:創建網絡命名空間
ip netns add mynetns # 創建網絡命名空間
ip netns exec mynetns ip a # 在命名空間內執行命令
6. 安全增強(SELinux/AppArmor)
- SELinux(Security-Enhanced Linux):強制訪問控制(MAC),限制進程權限。
- AppArmor:基于配置文件限制進程能力。
示例:查看 SELinux 狀態
sestatus
7. 容器技術(Docker/LXC)
容器是上述隔離技術的組合:
- Docker:使用
Namespaces + Cgroups + OverlayFS
實現輕量級虛擬化。 - LXC:Linux 原生容器,直接調用內核功能。
示例:運行一個 Docker 容器
docker run -it --rm alpine sh
總結
隔離類型 | 技術 | 作用 |
---|---|---|
用戶隔離 | uid/gid , sudo | 限制用戶權限 |
進程隔離 | Namespaces | 進程間資源隔離 |
文件系統隔離 | chroot , OverlayFS | 限制文件訪問 |
資源隔離 | Cgroups | 限制 CPU、內存等 |
網絡隔離 | Network Namespace , iptables | 獨立網絡環境 |
安全增強 | SELinux , AppArmor | 防止提權攻擊 |
容器 | Docker , LXC | 綜合隔離 |
我們今天主要來看進程隔離和文件隔離,但是在這之前,我們先了解幾個命令:
dd
dd
是 Linux/Unix 系統中一個強大的 磁盤和文件操作工具,主要用于 數據復制、轉換和備份。它可以直接訪問設備文件,適用于磁盤克隆、創建鏡像文件、數據擦除等場景。
基本語法
dd if=輸入文件 of=輸出文件 [選項]
if
(input file):輸入源(文件或設備,如/dev/sda
)of
(output file):輸出目標(文件或設備)- 其他常用選項:
bs
:塊大小(默認 512B,建議設為1M
或4K
提高效率)count
:復制的塊數skip
:跳過輸入文件開頭的塊seek
:跳過輸出文件開頭的塊status=progress
:顯示進度(GNUdd
支持)
常見用途示例
1. 磁盤/分區備份(克隆)
# 備份整個磁盤到鏡像文件
sudo dd if=/dev/sda of=/backup/sda.img bs=4M status=progress# 恢復鏡像到磁盤
sudo dd if=/backup/sda.img of=/dev/sda bs=4M status=progress
- 適用場景:全盤備份、系統遷移。
2. 創建空文件(預分配空間)
# 創建一個 1GB 的空文件
dd if=/dev/zero of=testfile bs=1M count=1024
/dev/zero
:提供空字符流。
我們來試試這個,這個比較方便:
我們打開testfile,寫一行hello world:
然后我們可以將所有的小寫字母轉換成大寫:
dd if=testfile of=testfile_2 conv=ucase
3. 銷毀磁盤數據(安全擦除)
# 用零填充整個磁盤(不可恢復)
sudo dd if=/dev/zero of=/dev/sdb bs=4M status=progress# 隨機數據填充(更安全)
sudo dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
- 注意:操作不可逆,務必確認目標設備!
4. 復制 ISO 到 U 盤(制作啟動盤)
sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress conv=fsync
/dev/sdb
是 U 盤設備(用lsblk
確認)。conv=fsync
:確保數據完全寫入。
5. 修改文件部分內容
# 替換文件開頭 1KB 為 0
dd if=/dev/zero of=file.bin bs=1K count=1 conv=notrunc
notrunc
:不截斷原文件,僅覆蓋指定部分。
6. 測試磁盤讀寫速度
# 寫入速度測試
dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct# 讀取速度測試
dd if=./testfile of=/dev/null bs=1G count=1 iflag=direct
oflag=direct
/iflag=direct
:繞過緩存,測真實速度。
注意事項
-
謹慎操作:
dd
直接操作設備,輸入錯誤可能導致數據丟失!- 務必確認
if
和of
參數(如誤將of=/dev/sda
寫成if=/dev/sda
會覆蓋系統盤)。
-
進度查看:
- 較新版本的
dd
支持status=progress
。 - 舊版本可通過發送
USR1
信號查看進度:kill -USR1 $(pgrep ^dd) # 另開終端執行
- 較新版本的
-
替代工具:
pv
:顯示進度條(需安裝):pv /dev/sda > sda.img
rsync
:更安全的文件同步。
總結
用途 | 命令示例 |
---|---|
磁盤備份 | dd if=/dev/sda of=/backup/sda.img bs=4M status=progress |
制作啟動盤 | dd if=ubuntu.iso of=/dev/sdb bs=4M conv=fsync |
安全擦除磁盤 | dd if=/dev/urandom of=/dev/sdb bs=4M status=progress |
創建大文件 | dd if=/dev/zero of=largefile bs=1M count=1024 |
測試磁盤速度 | dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct |
dd 的核心功能就是“從輸入源(if)讀取原始數據,原封不動地寫入輸出目標(of)”,像一個二進制搬運工。
mkfs
mkfs
(Make Filesystem)是 Linux 中用于 創建文件系統 的命令,相當于對磁盤或分區進行“格式化”。它會在目標設備(如分區、磁盤、鏡像文件)上寫入文件系統的元數據,使其能夠被操作系統識別和使用。
基本語法
mkfs [選項] 設備或文件
或通過指定文件系統類型:
mkfs.文件系統類型 [選項] 設備或文件
例如:
mkfs.ext4 /dev/sdb1 # 將 /dev/sdb1 格式化為 ext4
mkfs.vfat /dev/sdc1 # 格式化為 FAT32
常見文件系統類型
文件系統 | 命令 | 適用場景 |
---|---|---|
ext4 | mkfs.ext4 | Linux 默認文件系統(推薦) |
ext3 | mkfs.ext3 | 舊版 Linux 兼容 |
ext2 | mkfs.ext2 | 極簡需求(無日志功能) |
XFS | mkfs.xfs | 大文件、高性能(企業級) |
Btrfs | mkfs.btrfs | 支持快照、壓縮(現代文件系統) |
FAT32 | mkfs.vfat | U盤、跨平臺(Windows/macOS/Linux) |
NTFS | mkfs.ntfs | Windows 專用(需 ntfs-3g 包) |
mkfs
命令參數詳解
參數 | 說明 | 示例 |
---|---|---|
-t fstype | 指定要創建的文件系統類型(如 ext3 , ext4 , xfs , vfat 等) | mkfs -t ext4 /dev/sdb1 |
filesys | 目標設備文件名(如 /dev/sdb1 )或鏡像文件 | mkfs.ext4 /dev/sdb1 |
blocks | 指定文件系統的磁盤塊數(一般自動計算,手動指定較少使用) | mkfs.ext4 /dev/sdb1 204800 (20萬塊) |
-V | 詳細模式(顯示操作過程) | mkfs -V -t ext4 /dev/sdb1 |
fs-options | 傳遞給具體文件系統的參數(需在 filesys 前指定) | mkfs.ext4 -b 4096 /dev/sdb1 |
常見文件系統專用參數示例
1. ext4 文件系統
參數 | 說明 | 示例 |
---|---|---|
-b block-size | 指定塊大小(如 1024 , 4096 ) | mkfs.ext4 -b 4096 /dev/sdb1 |
-L volume-label | 設置卷標 | mkfs.ext4 -L "mydata" /dev/sdb1 |
-m reserved-blocks-percent | 保留空間百分比(默認5%) | mkfs.ext4 -m 1 /dev/sdb1 (設為1%) |
-O feature | 啟用特性(如 encrypt , quota ) | mkfs.ext4 -O encrypt /dev/sdb1 |
2. FAT/VFAT 文件系統
參數 | 說明 | 示例 |
---|---|---|
-F fat-size | 指定 FAT 類型(12 , 16 , 32 ) | mkfs.vfat -F 32 /dev/sdc1 |
-I | 強制格式化整個設備(無分區表) | mkfs.vfat -I /dev/sdd |
3. XFS 文件系統
參數 | 說明 | 示例 |
---|---|---|
-f | 強制覆蓋現有文件系統 | mkfs.xfs -f /dev/sdb2 |
-d agcount=N | 設置分配組數量(性能調優) | mkfs.xfs -d agcount=4 /dev/sdb2 |
常用操作示例
1. 格式化分區為 ext4(Linux 常用)
sudo mkfs.ext4 /dev/sdb1
- 選項:
-L
:設置卷標(如-L "mydata"
)-m 0
:減少保留空間(默認 5%,-m 0
設為 0% 以最大化可用空間)
我們將剛剛的testfile格式化為ext4格式:
2. 格式化 U 盤為 FAT32(兼容 Windows/macOS)
sudo mkfs.vfat -F 32 /dev/sdc1
-F 32
:強制 FAT32 格式(默認可能格式化為 FAT16)
3. 格式化并啟用 XFS(適合大文件)
sudo mkfs.xfs -f /dev/sdb2
-f
:強制覆蓋現有文件系統
4. 檢查設備后再格式化
lsblk # 確認設備路徑(如 /dev/sdb1)
sudo blkid /dev/sdb1 # 查看當前文件系統類型
sudo umount /dev/sdb1 # 先卸載(如果已掛載)
sudo mkfs.ext4 /dev/sdb1 # 再格式化
高級選項
1. 調整 inode 數量(適用于大量小文件)
sudo mkfs.ext4 -N 1000000 /dev/sdb1 # 分配 100 萬個 inode
2. 啟用文件系統加密(ext4)
sudo mkfs.ext4 -O encrypt /dev/sdb1
3. 指定塊大小(block size)
sudo mkfs.ext4 -b 4096 /dev/sdb1 # 4KB 塊(適合 SSD)
注意事項
-
數據會丟失!
格式化會清空目標設備的所有數據,操作前務必確認設備路徑。 -
必須先卸載分區
sudo umount /dev/sdb1 # 卸載 sudo mkfs.ext4 /dev/sdb1
-
SSD 優化
對 SSD 建議使用ext4
或f2fs
,并啟用 TRIM:sudo mkfs.ext4 -E discard /dev/nvme0n1p1
-
修復誤格式化
如果誤格式化,可嘗試用testdisk
或photorec
恢復數據(但不保證成功)。
總結
操作 | 命令示例 |
---|---|
格式化 ext4 | sudo mkfs.ext4 /dev/sdb1 |
格式化 FAT32 | sudo mkfs.vfat -F 32 /dev/sdc1 |
強制覆蓋現有文件系統 | sudo mkfs.xfs -f /dev/sdb2 |
設置卷標 | sudo mkfs.ext4 -L "mydata" /dev/sdb1 |
優化 SSD | sudo mkfs.ext4 -E discard /dev/nvme0n1p1 |
df
df
命令詳解
df
(Disk Filesystem) 命令用于顯示 Linux 系統中文件系統的磁盤空間使用情況。它可以顯示所有已掛載文件系統的可用空間和已用空間。
基本語法
df [選項] [文件或目錄]
常用選項
選項 | 說明 |
---|---|
-a | 顯示所有文件系統,包括虛擬文件系統 |
-h | 以人類可讀格式顯示 (KB, MB, GB) |
-H | 類似 -h ,但以 1000 為換算單位而非 1024 |
-i | 顯示 inode 使用情況而非塊使用情況 |
-k | 以 KB 為單位顯示 |
-l | 只顯示本地文件系統 |
-P | 使用 POSIX 輸出格式 |
-T | 顯示文件系統類型 |
-t <類型> | 只顯示指定類型的文件系統 |
-x <類型> | 排除指定類型的文件系統 |
常用示例
-
顯示所有文件系統使用情況:
df
-
以人類可讀格式顯示:
df -h
輸出示例:
Filesystem Size Used Avail Use% Mounted on /dev/sda1 20G 5.2G 14G 28% / tmpfs 1.9G 0 1.9G 0% /dev/shm
-
顯示指定文件系統的使用情況:
df -h /dev/sda1
-
顯示文件系統類型:
df -T
-
顯示 inode 使用情況:
df -i
-
只顯示 ext4 文件系統:
df -t ext4
-
排除特定文件系統類型:
df -x tmpfs
輸出字段說明
字段 | 說明 |
---|---|
Filesystem | 文件系統對應的設備文件 |
Size | 文件系統總大小 |
Used | 已用空間 |
Avail | 可用空間 |
Use% | 使用百分比 |
Mounted on | 掛載點 |
實用技巧
-
快速查看磁盤使用情況:
df -h --output=source,size,used,avail,pcent,target
-
按使用百分比排序:
df -h | sort -k5 -n -r
-
監控特定掛載點:
watch -n 1 'df -h /home'
-
結合 grep 過濾結果:
df -h | grep -v tmpfs
這個命令比較簡單,我們舉一個簡單的例子:
df
命令是 Linux 系統管理員監控磁盤使用情況的重要工具,經常與 du
命令配合使用來分析和解決磁盤空間問題。
mount
mount
命令詳解
mount
命令用于掛載文件系統到 Linux 目錄樹中的指定掛載點。它是 Linux 系統管理中最基礎且重要的命令之一。
基本語法
mount [-選項] [設備] [掛載點]
mount [-選項] [-t 文件系統類型] [-o 掛載選項] 設備 掛載點
常用選項
選項 | 說明 |
---|---|
-a | 掛載 /etc/fstab 中所有文件系統 |
-t | 指定文件系統類型 (ext4, ntfs, vfat 等) |
-o | 指定掛載選項 (多個選項用逗號分隔) |
-l | 顯示已掛載設備及其標簽 |
-v | 顯示詳細執行過程 |
-r | 以只讀模式掛載 |
-w | 以讀寫模式掛載 (默認) |
常用掛載選項 (-o
)
選項 | 說明 |
---|---|
ro /rw | 只讀/讀寫掛載 |
remount | 重新掛載已掛載的文件系統 |
noexec | 不允許執行二進制文件 |
nosuid | 忽略 suid/sgid 位 |
nodev | 不解釋設備文件 |
sync /async | 同步/異步 I/O 操作 |
defaults | 使用默認選項 (rw, suid, dev, exec, auto, nouser, async) |
user | 允許普通用戶掛載 |
nouser | 只允許 root 掛載 (默認) |
loop | 掛載鏡像文件 |
常用示例
-
顯示當前已掛載的文件系統:
mount
或
mount -l
-
掛載設備到目錄:
mount /dev/sdb1 /mnt/data
我們來試試:
-
指定文件系統類型掛載:
mount -t ext4 /dev/sdb1 /mnt/data
-
掛載 ISO 鏡像文件:
mount -o loop ubuntu.iso /mnt/iso
-
掛載 USB 設備 (FAT32):
mount -t vfat /dev/sdc1 /mnt/usb
-
掛載 Windows 共享 (CIFS/SMB):
mount -t cifs //server/share /mnt/share -o username=user,password=pass
-
重新掛載為只讀:
mount -o remount,ro /dev/sdb1
-
掛載所有
/etc/fstab
中的文件系統:mount -a
-
掛載帶特殊選項:
mount -o noexec,nosuid /dev/sdb1 /mnt/data
/etc/fstab
文件格式
/etc/fstab
文件用于定義自動掛載的文件系統,格式如下:
設備/UUID 掛載點 文件系統類型 掛載選項 dump fsck
示例:
/dev/sdb1 /mnt/data ext4 defaults 0 2
UUID=1234-5678 /mnt/usb vfat defaults 0 0
卸載文件系統
使用 umount
命令卸載:
umount /mnt/data
或
umount /dev/sdb1
常見問題解決
-
設備忙無法卸載:
fuser -vm /mnt/data # 查看哪個進程在使用 fuser -km /mnt/data # 終止使用該掛載點的進程 umount /mnt/data
-
掛載 NTFS 分區:
mount -t ntfs-3g /dev/sdb1 /mnt/ntfs
-
掛載時修復錯誤:
fsck /dev/sdb1 mount /dev/sdb1 /mnt/data
mount
命令是 Linux 系統管理中不可或缺的工具,合理使用可以靈活管理各種存儲設備和網絡共享。