章 9. 系統技巧

內容目錄

9.1. 控制檯技巧
9.1.1. 清晰的記錄 shell 活動
9.1.2. screen 程式
9.1.3. 在目錄間遊走
9.1.4. Readline 封裝
9.1.5. 掃描原始碼樹
9.2. 定製vim
9.2.1. 用內部特性定製 vim
9.2.2. 用外部軟體包定製 vim
9.3. 資料記錄和展示
9.3.1. 日誌後臺背景程式(daemon)
9.3.2. 日誌分析
9.3.3. 定製文字資料的顯示
9.3.4. 定製時間和日期的顯示
9.3.5. shell 中 echo 的顏色
9.3.6. 有顏色輸出的指令
9.3.7. 記錄編輯器複雜的重複操作動作
9.3.8. 記錄 X 應用程式的圖形
9.3.9. 記錄組態檔案的變更
9.4. 監控、控制和啟動程式活動
9.4.1. 程序耗時
9.4.2. 排程優先順序
9.4.3. ps 指令
9.4.4. top 指令
9.4.5. 列出被一個程序開啟的檔案
9.4.6. 跟蹤程式活動
9.4.7. 識別使用檔案和套接字的程序
9.4.8. 使用固定間隔重複一個指令
9.4.9. 使用檔案迴圈來重複一個指令
9.4.10. 從 GUI 啟動一個程式
9.4.11. 自定義被啟動的程式
9.4.12. 殺死一個程序
9.4.13. 單次任務時間安排
9.4.14. 定時任務安排
9.4.15. 基於事件的計劃任務
9.4.16. Alt-SysRq 鍵
9.5. 系統維護技巧
9.5.1. 誰在系統裡?
9.5.2. 警告所有人
9.5.3. 硬體識別
9.5.4. 硬體調配
9.5.5. 系統時間和硬體時間
9.5.6. 終端調配
9.5.7. 聲音基礎設施
9.5.8. 關閉螢幕保護
9.5.9. 關閉蜂鳴聲
9.5.10. 記憶體使用
9.5.11. 系統安全性和完整性檢查
9.6. 資料儲存技巧
9.6.1. 硬碟空間使用情況
9.6.2. 硬碟分割槽調配
9.6.3. 使用 UUID 存取分割槽
9.6.4. LVM2
9.6.5. 檔案系統調配
9.6.6. 檔案系統建立和完整性檢查
9.6.7. 通過掛載選項優化檔案系統
9.6.8. 通過超級塊(superblock)優化檔案系統
9.6.9. 硬碟最佳化
9.6.10. 固態硬碟最佳化
9.6.11. 使用 SMART 預測硬碟故障
9.6.12. 通過 $TMPDIR 指定臨時儲存目錄
9.6.13. 通過 LVM 擴充可用儲存空間
9.6.14. 通過掛載另一個分割槽來擴充可用儲存空間
9.6.15. 通過 “mount --bind” 掛載另一個目錄來擴充套件可用儲存空間
9.6.16. 透過 overlay 掛載(overlay-mounting)另一個目錄來擴充套件可用儲存空間
9.6.17. 使用符號連結擴充可用儲存空間
9.7. 磁碟映像
9.7.1. 製作磁碟映像檔案
9.7.2. 直接寫入硬碟
9.7.3. 掛載磁碟映像檔案
9.7.4. 清理磁碟映像檔案
9.7.5. 製作空的磁碟映像檔案
9.7.6. 製作 ISO9660 映象檔案
9.7.7. 直接寫入檔案到 CD/DVD-R/RW
9.7.8. 掛載 ISO9660 映象檔案
9.8. 二進位制資料
9.8.1. 檢視和編輯二進位制資料
9.8.2. 不掛載磁碟操作檔案
9.8.3. 資料冗餘
9.8.4. 資料檔案恢復和診斷分析
9.8.5. 把大檔案分成多個小檔案
9.8.6. 清空檔案內容
9.8.7. 樣子文件
9.8.8. 擦除整塊硬碟
9.8.9. 擦除硬碟上的未使用的區域
9.8.10. 恢復已經刪除但仍然被開啟的檔案
9.8.11. 查詢所有硬連結
9.8.12. 不可見磁碟空間消耗
9.9. 資料加密提示
9.9.1. 使用 dm-crypt/LUKS 加密移動磁碟
9.9.2. 使用dm-crypt/LUKS掛載加密的磁碟
9.10. 核心
9.10.1. 核心參數
9.10.2. 核心標頭檔案
9.10.3. 編譯核心和相關模組
9.10.4. 編譯核心原始碼:Debian 核心團隊推薦
9.10.5. 硬體驅動和韌體
9.11. 虛擬化系統
9.11.1. 虛擬化和模擬器工具
9.11.2. 虛擬化工作流
9.11.3. 掛載虛擬磁碟映像檔案
9.11.4. Chroot 系統
9.11.5. 多桌面系統

這裡,描述調配和管理系統的基本技巧,大部分在控制檯操作。

有一些工具程式來幫助你的控制檯活動。


簡單地使用 script(1) (參見 節 1.4.9, “記錄shell活動”)記錄 shell 活動會產生一個有控制字元的檔案。這些控制字元可以按下面的方式,使用 col(1) 去掉。

$ script
Script started, file is typescript

做些操作……按 Ctrl-D 退出 script.

$ col -bx < typescript > cleanedfile
$ vim cleanedfile

有替代的方式來記錄 shell 活動:

  • 使用 tee (在 initramfs 的啟動過程中可用):

    $ sh -i 2>&1 | tee typescript
  • 使用 gnome-terminal 增加行緩衝,用捲軸檢視。

  • 使用 screen 和 "^A H" (參見 節 9.1.2, “screen 程式”)來進行控制檯記錄。

  • 使用 vim 輸入 ":terminal" 進入終端模式。使用 "Ctrl-W N" 從終端模式退出到普通模式。使用 ":w typescript" 將快取寫到一個檔案。

  • 使用 emacs 和 "M-x shell", "M-x eshell", 或 "M-x term" 來進入記錄控制檯。使用 "C-x C-w" 將快取寫到檔案。

screen(1) 不但允許一個終端視窗執行多個程序,還允許遠端 shell 程序支援中斷的連線.這裡是一個典型的 screen(1) 使用場景.

  1. 登入到一個遠端機器。

  2. 在單個控制檯上啟動 screen

  3. 使用 ^A c ("Control-A" 接著 "c")在 screen 中建立的視窗執行多個程式.

  4. ^A n ("Control-A" 接著"n")來在多個 screen 視窗間轉換.

  5. 突然,你需要離開你的終端,但你不想丟掉正在做的工作,而這些工作需要連線來保持。

  6. 你可以通過任何方式分離 screen 會話。

    • 殘忍地拔掉你的網路連線

    • 輸入 ^A d ("Control-A" 接著 "d") 並手工從遠端連線退出登入

    • 輸入 ^A DD ("Control-A" 接著 "DD") 分離 screen 並退出登入

  7. 你重新登入到同一個遠處主機(即使從不同的終端)。

  8. 使用 "screen -r" 啟動 screen.

  9. screen 魔術般的重新附上先前所有的 screen 視窗和所有在活動執行的程式.

[提示] 提示

對於撥號或者按包計費的網路連線,你可以通過 screen 節省連線費用,應為你可以在斷開連線時讓一個程序繼續執行,當你稍後再次連線時重新附上它。

screen 會話裡,除了指令按鍵外的所有鍵盤輸入都會被髮送到當前視窗。 screen 所有指令按鍵是通過 ^A ("Control-A") 加單個鍵[加任何參數] 來輸入.這裡有一些重要的指令按鍵需要記住。


細節參見 screen(1).

參見 tmux(1) ,瞭解替代命令的功能。

節 1.4.2, “定製bash”, 2 個技巧允許快速在目錄間遊走,在 $CDPATHmc 描述。

如果你使用模糊文字過濾程式,你能夠不輸入精準路徑。對於fzf 軟體包,在 ~/.bashrc 裡面包括下列內容。

FZF_KEYBINDINGS_PATH=/usr/share/doc/fzf/examples/key-bindings.bash
if [ -f $FZF_KEYBINDINGS_PATH ]; then
  . $FZF_KEYBINDINGS_PATH
fi

例如:

  • 你能夠最小化的操作跳入非常深的子目錄。你首先輸入 "cd **" 後按 Tab。然後你將被提示候選路徑。輸入部分路徑字串,比如 s/d/b foo,將會縮窄候選路徑。透過有游標和回車鍵的 cd,你選擇將要使用的路徑。

  • 你可以用最小化的操作,從命令歷史裡面選擇一個命令。在命令列提示符下按 Ctrl-R 。然後你將被提示候選的命令。輸入部分命令字串,比如 vim d,將會縮窄候選項。使用游標和回車鍵選擇將要使用的命令。

在你透過 節 1.4.8, “使用 vim” 學習基本的vim(1) 後,請閱讀 Bram Moolenaar 的"Seven habits of effective text editing (2000)" 來理解 vim 應當怎樣被使用。

vim 的行為能夠被顯著的改變,透過 Ex-模式 的命令,啟用它的內部特性,比如 "set ..." 來設定 vim 選項。

這些 Ex-模式 的命令,能夠在使用者的 vimrc 檔案裡面包括,傳統的 "~/.vimrc" 或 git 友好的 "~/.vim/vimrc"。這裡有一個非常簡單的例子[2]

""" Generic baseline Vim and Neovim configuration (~/.vimrc)
"""   - For NeoVim, use "nvim -u ~/.vimrc [filename]"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let mapleader = ' '             " :h mapleader
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set nocompatible                " :h 'cp -- sensible (n)vim mode
syntax on                       " :h :syn-on
filetype plugin indent on       " :h :filetype-overview
set encoding=utf-8              " :h 'enc (default: latin1) -- sensible encoding
""" current vim option value can be verified by :set encoding?
set backspace=indent,eol,start  " :h 'bs (default: nobs) -- sensible BS
set statusline=%<%f%m%r%h%w%=%y[U+%04B]%2l/%2L=%P,%2c%V
set listchars=eol:¶,tab:⇄\ ,extends:↦,precedes:↤,nbsp:␣
set viminfo=!,'100,<5000,s100,h " :h 'vi -- bigger copy buffer etc.
""" Pick "colorscheme" from blue darkblue default delek desert elflord evening
""" habamax industry koehler lunaperche morning murphy pablo peachpuff quiet ron
""" shine slate torte zellner
colorscheme industry
"colorscheme default
set scrolloff=5                 " :h 'scr -- show 5 lines around cursor
set laststatus=2                " :h 'ls (default 1)  k
""" boolean options can be unset by prefixing "no"
set ignorecase                  " :h 'ic
set smartcase                   " :h 'scs
set autoindent                  " :h 'ai
set smartindent                 " :h 'si
set nowrap                      " :h 'wrap
"set list                        " :h 'list (default nolist)
set noerrorbells                " :h 'eb
set novisualbell                " :h 'vb
set t_vb=                       " :h 't_vb -- termcap visual bell
set spell                       " :h 'spell
set spelllang=en_us,cjk         " :h 'spl -- english spell, ignore CJK
set clipboard=unnamedplus       " :h 'cb -- cut/copy/paste with other app
set hidden                      " :h 'hid
set autowrite                   " :h 'aw

vim 的鍵盤對映能夠在使用者的 vimrc 檔案裡面修改。例如:

[注意] 注意

沒有非常好的理由,請不要嘗試改變預設的鍵繫結。

""" Popular mappings (imitating LazyVim etc.)
""" Window moves without using CTRL-W which is dangerous in INSERT mode
nnoremap <C-H> <C-W>h
nnoremap <C-J> <C-W>j
nnoremap <C-K> <C-W>k
silent! nnoremap <C-L> <C-W>l
""" Window resize
nnoremap <C-LEFT> <CMD>vertical resize -2<CR>
nnoremap <C-DOWN> <CMD>resize -2<CR>
nnoremap <C-UP> <CMD>resize +2<CR>
nnoremap <C-RIGHT> <CMD>vertical resize +2<CR>
""" Clear hlsearch with <ESC> (<C-L> is mapped as above)
nnoremap <ESC> <CMD>noh<CR><ESC>
inoremap <ESC> <CMD>noh<CR><ESC>
""" center after jump next
nnoremap n nzz
nnoremap N Nzz
""" fast "jk" to get out of INSERT mode (<ESC>)
inoremap  jk <CMD>noh<CR><ESC>
""" fast "<ESC><ESC>" to get out of TERM mode (CTRL-\ CTRL-N)
tnoremap <ESC><ESC> <C-\><C-N>
""" fast "jk" to get out of TERM mode (CTRL-\ CTRL-N)
tnoremap jk <C-\><C-N>
""" previous/next trouble/quickfix item
nnoremap [q <CMD>cprevious<CR>
nnoremap ]q <CMD>cnext<CR>
""" buffers
nnoremap <S-H> <CMD>bprevious<CR>
nnoremap <S-L> <CMD>bnext<CR>
nnoremap [b <CMD>bprevious<CR>
nnoremap ]b <CMD>bnext<CR>
""" Add undo break-points
inoremap  , ,<C-G>u
inoremap  . .<C-G>u
inoremap  ; ;<C-G>u
""" save file
inoremap <C-S> <CMD>w<CR><ESC>
xnoremap <C-S> <CMD>w<CR><ESC>
nnoremap <C-S> <CMD>w<CR><ESC>
snoremap <C-S> <CMD>w<CR><ESC>
""" better indenting
vnoremap < <gv
vnoremap > >gv
""" terminal (Somehow under Linux, <C-/> becomes <C-_> in Vim)
nnoremap <C-_> <CMD>terminal<CR>
"nnoremap <C-/> <CMD>terminal<CR>
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if ! has('nvim')
""" Toggle paste mode with <SPACE>p for Vim (no need for Nvim)
set pastetoggle=<leader>p
""" nvim default mappings for Vim.  See :h default-mappings in nvim
""" copy to EOL (no delete) like D for d
noremap Y y$
""" sets a new undo point before deleting
inoremap <C-U> <C-G>u<C-U>
inoremap <C-W> <C-G>u<C-W>
""" <C-L> is re-purposed as above
""" execute the previous macro recorded with Q
nnoremap Q @@
""" repeat last substitute and *KEEP* flags
nnoremap & :&&<CR>
""" search visual selected string for visual mode
xnoremap * y/\V<C-R>"<CR>
xnoremap # y?\V<C-R>"<CR>
endif

為了使上面的按鍵繫結正確地執行,終端程式需要配置:Backspace-鍵產生 "ASCII DEL"、Delete-鍵產生 "Escape sequence"。

其它雜項配置能夠在使用者的 vimrc 檔案裡面修改。例如:

""" Use faster 'rg' (ripgrep package) for :grep
if executable("rg")
  set grepprg=rg\ --vimgrep\ --smart-case
  set grepformat=%f:%l:%c:%m
endif
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""" Retain last cursor position :h '"
augroup RetainLastCursorPosition
  autocmd!
  autocmd BufReadPost *
    \ if line("'\"") > 0 && line ("'\"") <= line("$") |
    \   exe "normal! g'\"" |
    \ endif
augroup END
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""" Force to use underline for spell check results
augroup SpellUnderline
  autocmd!
  autocmd ColorScheme * highlight SpellBad term=Underline gui=Undercurl
  autocmd ColorScheme * highlight SpellCap term=Underline gui=Undercurl
  autocmd ColorScheme * highlight SpellLocal term=Underline gui=Undercurl
  autocmd ColorScheme * highlight SpellRare term=Underline gui=Undercurl
augroup END
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""" highlight tailing spaces except when typing as red (set after colorscheme)
highlight TailingWhitespaces ctermbg=red guibg=red
""" \s\+     1 or more whitespace character: <Space> and <Tab>
""" \%#\@<!  Matches with zero width if the cursor position does NOT match.
match TailingWhitespaces /\s\+\%#\@<!$/

下面能夠發現有趣的外部外掛軟體包:

vim-scripts 軟體包裡面的外掛軟體包,能夠使用使用者的 vimrc 檔案啟用。比如:

packadd! secure-modelines
packadd! winmanager
" IDE-like UI for files and buffers with <space>w
nnoremap <leader>w         :WMToggle<CR>

新的原生 Vim 軟體包系統同 "git" 和 "git submodule" 順利的工作。一個這樣的配置例子能夠在 我的 git 倉庫: dot-vim 找到。本質上是這樣做的:

  • 透過使用"git"和"git submodule",最新的擴充套件軟體包,比如說"name",會被放到 ~/.vim/pack/*/opt/name 和類似的地方。

  • 透過增加 :packadd! name 行到使用者的 vimrc 檔案,這些軟體包被放到 runtimepath

  • Vim 在它的初始化時載入這些軟體包到 runtimepath

  • 在它初始化的最後,安裝文件的標籤被更新,使用 "helptags ALL"。

更多資訊,請使用 "vim --startuptime vimstart.log" 啟動 vim 來檢查實際的執行順序和每一個步驟消耗的時間。

是相當迷惑的看到這麼多的方式[3] 來管理和載入這些外部的軟體包到 vim。檢查原始的資訊是最好的方法。


儘管例如 more(1) 和 less(1) 這樣的分頁程式(參見 節 1.4.5, “文件內容查看”)和用於高亮和格式的自定義工具(參見 節 11.1.8, “高亮並格式化純文字資料”)可以漂亮地顯示文字資料,但通用的編輯器 (參見 節 1.4.6, “文字編輯器”)是用途最廣的,且可定製性最高。

[提示] 提示

對於 vim(1) 和它的分頁模式別名 view(1),“:set hls” 可以啟用高亮搜尋。

大部分現代終端的 shell 中 echo 能夠使用 ANSI 轉義字元來顯示顏色(參見 “/usr/share/doc/xterm/ctlseqs.txt.gz”)。

嘗試下列例子

$ RED=$(printf "\x1b[31m")
$ NORMAL=$(printf "\x1b[0m")
$ REVERSE=$(printf "\x1b[7m")
$ echo "${RED}RED-TEXT${NORMAL} ${REVERSE}REVERSE-TEXT${NORMAL}"

你能夠記錄編輯器複雜的重複操作動作。

對於 Vim,請按下面操作。

  • "qa": 開始記錄輸入字元到有名字的暫存器 "a".

  • … 編輯器操作

  • "q": 結束記錄輸入的字元。

  • "@a":執行暫存器 "a 的內容".

對於 Emacs, 請按下面操作。

  • "C-x (": 開始定義一個鍵盤巨集.

  • … 編輯器操作

  • "C-x )":結束定義一個鍵盤巨集.

  • "C-x e": 執行一個鍵盤巨集.

程式活動能夠使用特殊的工具監控和控制。


[提示] 提示

procps 包提供了非常基礎的監控、控制程式活動功能和啟動程式功能。你應當把他們全部學會。

通過匹配某些條件的檔案來迴圈重複一個指令,有幾種方法,例如,匹配全域性模式"*.ext".

for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done
  • find(1) 和 xargs(1) 聯合:

find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command
  • find(1) 使用 "-exec" 選項並執行指令:

find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;
  • find(1) 使用 "-exec" 選項並執行一個短的 shell 指令碼:

find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;

上面的列子確保適當處理怪異的檔名(如包含空格)。 find(1) 更多高階的用法,參見 節 10.1.5, “查詢檔案的語法”.

對於 指令列介面(command-line interface,CLI)$PATH 環境變數所指定的目錄中第一個匹配相應名稱的程式會被執行。參見 節 1.5.3, “"$PATH" 變數”

對於遵從 freedesktop.org 標準的 圖形使用者介面(graphical user interface,GUI)/usr/share/applications/ 目錄中的 *.desktop 檔案給每個程式的 GUI 選單顯示提供了必要的屬性。遵從Freedesktop.org xdg 菜單系統的每一個軟體包,透過 "/usr/share/applications/"下 "*.desktop"提供的資料來安裝它的選單。 遵從 Freedesktop.org 標準的現代桌面環境,用 xdg-utils 軟體包利用這些資料生成它們的選單。參見"/usr/share/doc/xdg-utils/README"。

舉個例子,chromium.desktop 檔案中為 “Chromium 網路瀏覽器” 定義了相關屬性,例如程式名 “Name”,程式執行路徑和參數 “Exec”,所使用的圖示 “Icon” 等等(參見 桌面調配項規範)。檔案內容如下:

[Desktop Entry]
Version=1.0
Name=Chromium Web Browser
GenericName=Web Browser
Comment=Access the Internet
Comment[fr]=Explorer le Web
Exec=/usr/bin/chromium %U
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=chromium
Categories=Network;WebBrowser;
MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/https;
StartupWMClass=Chromium
StartupNotify=true

這是一個較為簡單的說明。*.desktop 檔案像下面那樣被搜尋。

桌面環境設定 $XDG_DATA_HOME$XDG_DATA_DIR 環境變數。舉個例子,在 GNOME 3 中:

  • 未設定 $XDG_DATA_HOME。(將使用預設值 $HOME/.local/share。)

  • $XDG_DATA_DIRS 被設定為 /usr/share/gnome:/usr/local/share/:/usr/share/

基準目錄(參見 XDG Base Directory Specification)和應用程式目錄如下所示。

  • $HOME/.local/share/$HOME/.local/share/applications/

  • /usr/share/gnome//usr/share/gnome/applications/

  • /usr/local/share//usr/local/share/applications/

  • /usr/share//usr/share/applications/

*.desktop 檔案將按照這個順序在這些 applications 目錄中進行搜尋。

[提示] 提示

要建立一個使用者自定義的 GUI 選單項,需要在 $HOME/.local/share/applications/ 目錄中新增一個 *.desktop 檔案。

[提示] 提示

"Exec=..." 行不會由 shell 解析。如果需要設定環境變數,使用 env(1) command。

[提示] 提示

相似地,如果在這些基準目錄下的 autostart 目錄中建立了一個 *.desktop 檔案,則 *.desktop 檔案中指定的程式會在桌面環境啟動時自動執行。參見 Desktop Application Autostart Specification

[提示] 提示

相似地,如果在 $HOME/Desktop 目錄中建立了一個 *.desktop 檔案並且桌面環境被調配為支援桌面圖示啟動器功能,則點選圖示時指定的程式會被執行。請注意,$HOME/Desktop 目錄的實際名稱與語言環境有關。參見 xdg-user-dirs-update(1)。

一些程式會被另一個程式自動啟動。下面是自定義該過程的方法。

[提示] 提示

update-mime(8) 會更新 "/etc/mailcap" 檔案,期間會用到 "/etc/mailcap.order" 檔案 (參見 mailcap.order(5)).

[提示] 提示

debianutils 軟體包提供 sensible-browser(1)、sensible-editor(1) 和 sensible-pager(1),它們可以分別對要呼叫的編輯器、分頁程式和網路瀏覽器作出明智的選擇。我建議你閱讀那些 shell 指令碼。

[提示] 提示

為了在 GUI(圖形使用者介面)下執行例如 mutt 這樣的控制檯應用程式來作為你的首選應用程式,你應該像下面那樣建立一個 GUI(圖形使用者介面)應用程式並設定 “/usr/local/bin/mutt-term” 為你想要啟動的首選應用程式。

# cat /usr/local/bin/mutt-term <<EOF
#!/bin/sh
gnome-terminal -e "mutt \$@"
EOF
# chmod 755 /usr/local/bin/mutt-term

使用 cron(8) 來進行定時任務安排。參見 crontab(1) 和 crontab(5).

你能夠作為一個普通使用者定時執行一個程序,比如, foo 使用 "crontab -e" 指令建立一個 crontab(5) 的檔案 "/var/spool/cron/crontabs/foo"。

這裡是一個 crontab(5) 檔案的列子。

# use /usr/bin/sh to run commands, no matter what /etc/passwd says
SHELL=/bin/sh
# mail any output to paul, no matter whose crontab this is
MAILTO=paul
# Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed)
# run at 00:05, every day
5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 14:15 on the first of every month -- output mailed to paul
15 14 1  * *   $HOME/bin/monthly
# run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc:
0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
23 */2 1 2 *   echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
5  4 *   * sun echo "run at 04:05 every Sunday"
# run at 03:40 on the first Monday of each month
40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args
[提示] 提示

對那些非連續執行的系統,安裝 anacron 軟體包來定時執行週期性的指令,指令在接近機器啟動的時間執行,並允許有特定的時間間隔。參見 anacron(8) 和 anacrontab(5).

[提示] 提示

對於定時系統維護指令碼,你能夠以root 帳號定時執行,把這類指令碼放入 "/etc/cron.hourly/", "/etc/cron.daily/", "/etc/cron.weekly/", 或 "/etc/cron.monthly/". 這些指令碼的執行時間,可以通過 "/etc/crontab" 和 "/etc/anacrontab" 來定製。

cron 後臺守護程序(daemon)不存在時,Systemd 也有按時間計劃執行程式的低階能力。例如, /lib/systemd/system/apt-daily.timer/lib/systemd/system/apt-daily.service 建立每天的 apt 下載行動。參見 systemd.timer(5) 。

Systemd 能夠執行計劃程式,不僅基於時間事件,還能夠基於掛載事件。參見 節 10.2.3.3, “時間事件觸發的備份”節 10.2.3.2, “掛載事件觸發的備份” 的例子。

按 Alt-SysRq (PrtScr)組合鍵跟一個字母按鍵,進行不可思議的系統應急控制。


更多資訊參見 Linux 核心使用者和管理員手冊 » Linux Magic System Request Key Hacks

[提示] 提示

從 SSH 終端等,你能夠通過向 "/proc/sysrq-trigger" 寫入內容來使用 Alt-SysRq 特性。例如,從 root shell 提示字元執行 "echo s > /proc/sysrq-trigger; echo u > /proc/sysrq-trigger" 來 syncs 和 umounts 所有已掛載的檔案系統。

目前(2021) Debian amd64 Linux 核心為 /proc/sys/kernel/sysrq=438=0b110110110:

  • 2 = 0x2 - 啟用控制檯日誌級別控制 (開啟)

  • 4 = 0x4 - 啟用鍵盤控制 (SAK, unraw) (開啟)

  • 8 = 0x8 - 啟用程序除錯轉儲(debugging dumps of processes)等。(關閉)

  • 16 = 0x10 - 啟用 sync 命令(開啟)

  • 32 = 0x20 - 啟用只讀重新掛載(開啟)

  • 64 = 0x40 - 啟用程序訊號 (term, kill, oom-kill) (關閉)

  • 128 = 0x80 - 允許重啟、關閉電源(開啟)

  • 256 = 0x100 - 允許調整所有 RT(實時) 任務優先順序(開啟)

下面設定系統的硬體時間為:MM/DD hh:mm, CCYY.

# date MMDDhhmmCCYY
# hwclock --utc --systohc
# hwclock --show

Debian 系統的時間通常顯示為本地時間,但硬體時間通常使用 UTC(GMT) 時間。

如果硬體時間設定為 UTC 時間,請在“/etc/default/rcS”裡面設定“UTC=yes”。

下面是重新調配 Debian 系統使用的時區。

# dpkg-reconfigure tzdata

如果你希望通過網路來更新系統時間,考慮使用 ntp, ntpdatechrony 這類包提供的 NTP 服務。

[提示] 提示

systemd 下,是使用 systemd-timesyncd 來替代進行網路時間同步。參見 systemd-timesyncd(8).

看下面。

[提示] 提示

ntp 包裡面的 ntptrace(8) 能夠跟蹤 NTP 服務鏈至原始源。

用於現在的 Linux 的音效卡裝置驅動程式由 高階 Linux 聲音體系(Advanced Linux Sound Architecture,ALSA) 提供。ALSA 提供了相容之前的 開放聲音系統(Open Sound System,OSS)的模擬模式。

應用軟體不僅可被配置為不僅直接訪問聲音裝置,也可以透過一些標準化聲音服務端系統來訪問它們。目前,PulseAudio、JACK 和 PipeWire 被用作聲音的服務端系統。參見 Debian 維基聲音頁面 得到最新情況。

每個流行的桌面環境通常都有一個通用的聲音引擎。每個被應用程式使用的聲音引擎都可以選擇連線到不同的聲音伺服器。

[提示] 提示

使用 “cat /dev/urandom > /dev/audio” 或 speaker-test(1) 來測試揚聲器(^C 停止)。

[提示] 提示

如果你無法聽到聲音,那你的揚聲器可能連線到了一個靜音輸出。現代的聲音系統有許多輸出。alsa-utils 軟體包中的 alsamixer(1) 可以很好地調配聲音和靜音設定。


糟糕的系統維護可能會暴露你的系統,導致它被外部非法使用。

對於系統安全性和完整性的檢查,你需要從下面這些方面開始。


下面是一個簡單的指令碼,用來檢測典型的所有人可寫的錯誤檔案許可權。

# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)
[注意] 注意

由於 debsums 軟體包使用本地儲存的 MD5 校驗碼,因此面對惡意攻擊,也不能完全相信系統安全性檢測工具。

使用 live CDdebian-installer CD 以救援模式啟動你的系統,可以讓你簡單地重新調配你的啟動裝置的資料儲存。

如果裝置在 GUI(圖形使用者介面)桌面系統下被自動掛載,在對它們進行操作前,你可能需要從命令列手工 umount(8) 這些裝置。

對於硬碟分割槽調配,儘管 fdisk(8) 被認為是標準的調配,但是 parted(8) 工具還是值得注意的。

老的 PC 使用經典的主引導記錄(Master Boot Record,MBR)方案,將硬碟分割槽資料儲存在第一個扇區,即 LBA 扇區 0(512 位元組)。

一些帶有統一可擴充套件韌體介面(Unified Extensible Firmware Interface,UEFI)的近代 PC,包括基於 Intel 的 Mac,使用 全域性唯一標識分割槽表(GUID Partition Table,GPT)方案,硬碟分割槽資料不儲存在第一個扇區。

儘管 fdisk(8) 一直是硬碟分割槽的標準工具,但現在 parted(8) 替代了它。


[注意] 注意

儘管 parted(8) 聲稱也能用來建立和調整檔案系統,但使用維護最好的專門工具來做這些事會更為安全,例如 mkfs(8)(mkfs.msdos(8)、mkfs.ext2(8)、mkfs.ext3(8)、mkfs.ext4(8)……)和 resize2fs(8)。

[注意] 注意

為了在 GPTMBR 之間切換,你需要直接刪除開頭的幾個塊中的內容(參見 節 9.8.6, “清空檔案內容”)並使用 “parted /dev/sdx mklabel gpt” 或 “parted /dev/sdx mklabel msdos” 來設定它。請注意,這裡使用的 “msdos” 是用於 MBR

儘管重新配置你的分割槽或可移動儲存介質的啟用順序可能會給分割槽產生不同的名字,但你可以使用同一個 UUID 來訪問它們。如果你有多個硬碟並且你的 BIOS/UEFI 沒有給它們一致的裝置名的話,使用 UUID 是不錯的選擇。

[提示] 提示

你可以使用 blkid(8) 來檢視一個特定塊裝置的 UUID

你也可以使用 "lsblk -f"來檢測 UUID 並檢視其它資訊。

LVM2 是一個用於 Linux 核心的邏輯卷管理器。使用 LVM2 的話,硬碟分割槽可以建立在邏輯捲上來替代物理硬碟。

LVM 有下列需求。

  • Linux 核心中的裝置對映支援(Debian 核心預設支援)

  • 使用者自定義裝置對映支援庫(libdevmapper* 軟體包)

  • 使用者自定義 LVM2 工具(lvm2 軟體包)

請從下面的 man 手冊開始瞭解 LVM2。

  • lvm(8):LVM2 機制的基礎知識(列出了所有 LVM2 指令)

  • lvm.conf(5):LVM2 的組態檔案

  • lvs(8):報告邏輯卷的相關資訊

  • vgs(8):報告卷組的相關資訊

  • pvs(8):報告物理卷的相關資訊

對於 ext4 檔案系統, e2fsprogs 包提供下面的工具。

  • mkfs.ext4(8) 建立新的 ext4 檔案系統

  • fsck.ext4(8) 檢查和修復現有 ext4 檔案系統

  • tune2fs(8) 調配 ext4 檔案系統的超級塊

  • debugfs(8) 互動式的除錯 ext4 檔案系統. (它有 undel 指令來恢復已經刪除的檔案.)

mkfs(8) 和 fsck(8) 指令是由 e2fsprogs 包提供的,是各種檔案系統相關程式的前端。(mkfs.fstypefsck.fstype). 對於 ext4 檔案系統,它們是 mkfs.ext4(8) 和 fsck.ext4(8) (它們被符號連結到 mke2fs(8) 和 e2fsck(8)).

Linux 支援的每一個檔案系統,有相似的指令。


[提示] 提示

Ext4 檔案系統是 Linux 系統上預設的檔案系統,強烈推薦使用這個檔案系統,除非你有特殊的理由不使用。

Btrfs 狀態能夠在 Debian wiki on btrfskernel.org wiki on btrfs 發現。它被期望作為 ext4 檔案系統之後的下一個預設檔案系統。

一些工具可以在沒有 Linux 核心支援的情況下存取檔案系統(參見 節 9.8.2, “不掛載磁碟操作檔案”).

固態硬碟(Solid state drive,SSD) 目前可以被自動檢測。

/etc/fstab 裡面,將易失性資料路徑掛載為 "tmpfs",可以減少不必要的磁碟訪問來阻止磁碟損耗。

你可以使用相容 SMARTsmartd(8) 後臺背景程式(daemon)來監控和記錄你的硬碟。

  1. BIOS 中啟用 SMART 功能。

  2. 安裝 smartmontools 軟體包。

  3. 通過 df(1) 列出硬碟驅動並識別它們。

    • 讓我們假設要監控的硬碟為 “/dev/hda”。

  4. 檢查 “smartctl -a /dev/hda” 的輸出,看 SMART 功能是否已啟用。

    • 如果沒有,通過 “smartctl -s on -a /dev/hda” 啟用它。

  5. 通過下列方式執行 smartd(8) 後臺背景程式(daemon)。

    • 消除 /etc/default/smartmontools” 檔案中 “start_smartd=yes” 的註釋。

    • 透過 “sudo systemctl restart smartmontools” 重新啟動 smartd(8) 後臺守護程序(daemon)。

[提示] 提示

smartd(8) 後臺背景程式(daemon)可以使用 /etc/smartd.conf 檔案進行自定義,檔案中包含了相關的警告。

在安裝時建立在 Logical Volume Manager 邏輯儲區管理(LVM) (Linux 特性) 上的分割槽,它們可以容易的通過合併擴充或刪除擴充的方式改變大小,而不需要在多個儲存裝置上進行大量的重新調配。

我們在這裡討論磁碟影響的操作。

一個未掛載裝置(例如,第二個 SCSI 或 序列 ATA 裝置 “/dev/sdb”)的磁碟映像檔案 “disk.img” 可以使用 cp(1) 或 dd(1) 通過下列方式建立。

# cp /dev/sdb disk.img
# dd if=/dev/sdb of=disk.img

傳統 PC 中位於主 IDE 硬碟第一扇區的主引導記錄(MBR)(參見 節 9.6.2, “硬碟分割槽調配”)的磁碟映像可以使用 dd(1) 通過下列方式建立。

# dd if=/dev/hda of=mbr.img bs=512 count=1
# dd if=/dev/hda of=mbr-nopart.img bs=446 count=1
# dd if=/dev/hda of=mbr-part.img skip=446 bs=1 count=66
  • mbr.img”:帶有分割槽表的 MBR

  • mbr-nopart.img”:不帶分割槽表的 MBR

  • mbr-part.img”:僅 MBR 的分割槽表

如果你使用 SCSI 或 序列 ATA 裝置作為啟動硬碟,你需要使用 “/dev/sda” 替代 “/dev/hda”。

如果你要建立原始硬碟的一個硬碟分割槽的映像,你需要使用 “/dev/hda1” 等替代 “/dev/hda”。

可以使用迴圈裝置通過下列方式掛載和解除安裝包含單個分割槽映像的磁碟映像 “partition.img”。

# losetup --show -f partition.img
/dev/loop0
# mkdir -p /mnt/loop0
# mount -t auto /dev/loop0 /mnt/loop0
...hack...hack...hack
# umount /dev/loop0
# losetup -d /dev/loop0

可以簡化為如下步驟。

# mkdir -p /mnt/loop0
# mount -t auto -o loop partition.img /mnt/loop0
...hack...hack...hack
# umount partition.img

可以使用 迴圈裝置 掛載包含多個分割槽的磁碟映像 “disk.img” 的每個分割槽。

# losetup --show -f -P disk.img
/dev/loop0
# ls -l /dev/loop0*
brw-rw---- 1 root disk   7,  0 Apr  2 22:51 /dev/loop0
brw-rw---- 1 root disk 259, 12 Apr  2 22:51 /dev/loop0p1
brw-rw---- 1 root disk 259, 13 Apr  2 22:51 /dev/loop0p14
brw-rw---- 1 root disk 259, 14 Apr  2 22:51 /dev/loop0p15
# fdisk -l /dev/loop0
Disk /dev/loop0: 2 GiB, 2147483648 bytes, 4194304 sectors
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: 6A1D9E28-C48C-2144-91F7-968B3CBC9BD1

Device         Start     End Sectors  Size Type
/dev/loop0p1  262144 4192255 3930112  1.9G Linux root (x86-64)
/dev/loop0p14   2048    8191    6144    3M BIOS boot
/dev/loop0p15   8192  262143  253952  124M EFI System

Partition table entries are not in disk order.
# mkdir -p /mnt/loop0p1
# mkdir -p /mnt/loop0p15
# mount -t auto /dev/loop0p1 /mnt/loop0p1
# mount -t auto /dev/loop0p15 /mnt/loop0p15
# mount |grep loop
/dev/loop0p1 on /mnt/loop0p1 type ext4 (rw,relatime)
/dev/loop0p15 on /mnt/loop0p15 type vfat (rw,relatime,fmask=0002,dmask=0002,allow_utime=0020,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
...hack...hack...hack
# umount /dev/loop0p1
# umount /dev/loop0p15
# losetup -d /dev/loop0

或者,你也可以使用 kpartx 軟體包中的 kpartx(8) 建立 裝置對映裝置來達到相同的效果。

# kpartx -a -v disk.img
add map loop0p1 (253:0): 0 3930112 linear 7:0 262144
add map loop0p14 (253:1): 0 6144 linear 7:0 2048
add map loop0p15 (253:2): 0 253952 linear 7:0 8192
# fdisk -l /dev/loop0
Disk /dev/loop0: 2 GiB, 2147483648 bytes, 4194304 sectors
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: 6A1D9E28-C48C-2144-91F7-968B3CBC9BD1

Device         Start     End Sectors  Size Type
/dev/loop0p1  262144 4192255 3930112  1.9G Linux root (x86-64)
/dev/loop0p14   2048    8191    6144    3M BIOS boot
/dev/loop0p15   8192  262143  253952  124M EFI System

Partition table entries are not in disk order.
# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 236 Apr  2 22:45 control
lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p1 -> ../dm-0
lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p14 -> ../dm-1
lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p15 -> ../dm-2
# mkdir -p /mnt/loop0p1
# mkdir -p /mnt/loop0p15
# mount -t auto /dev/mapper/loop0p1 /mnt/loop0p1
# mount -t auto /dev/mapper/loop0p15 /mnt/loop0p15
# mount |grep loop
/dev/loop0p1 on /mnt/loop0p1 type ext4 (rw,relatime)
/dev/loop0p15 on /mnt/loop0p15 type vfat (rw,relatime,fmask=0002,dmask=0002,allow_utime=0020,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
...hack...hack...hack
# umount /dev/mapper/loop0p1
# umount /dev/mapper/loop0p15
# kpartx -d disk.img

按下面的方式使用 dd(1) ,可以製作一個大小為 5GiB 的空磁碟映像檔案。

$ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G

專業的 fallocate(8) 可以在這裡被使用,用來替代使用 dd(1)。

按下面的方式使用環回裝置,你能夠在這個磁碟映像"disk.img"上建立 ext4 檔案系統。

# losetup --show -f disk.img
/dev/loop0
# mkfs.ext4 /dev/loop0
...hack...hack...hack
# losetup -d /dev/loop0
$ du  --apparent-size -h disk.img
5.0G  disk.img
$ du -h disk.img
83M disk.img

對於 "disk.img",它的檔案大小是5.0 GiB,而它實際磁碟使用僅僅是 83MiB.這個差距可能是由於 ext4 裡面有稀疏檔案.

[提示] 提示

稀疏檔案的實際磁碟使用會隨著資料的寫入而增加。

迴環裝置裝置對映 裝置上使用類似的操作,在這些裝置按 節 9.7.3, “掛載磁碟映像檔案” 掛載後, 你能夠使用 parted(8) 或 fdisk(8)對這個磁碟映像"disk.img"進行分割槽,能夠使用 mkfs.ext4(8), mkswap(8)在上面建立檔案系統等.

"源目錄"下的目錄樹可以通過如下所示的 cdrkit 提供的 genisoimage(1) 指令來製作 ISO9660 映象檔案,"cd.iso"。

#  genisoimage -r -J -T -V volume_id -o cd.iso source_directory

類似的,可引導的 ISO9660 映象檔案,"cdboot.iso", 能夠從 debian-installer 類似目錄樹 "source_directory" 製作,方式如下。

#  genisoimage -r -o cdboot.iso -V volume_id \
   -b isolinux/isolinux.bin -c isolinux/boot.cat \
   -no-emul-boot -boot-load-size 4 -boot-info-table source_directory

這裡的 Isolinux boot loader (參見 節 3.1.2, “第二階段:引載加載程序”) 是用於啟動的.

按下面的方式,你可以直接從光碟機裝置計算 md5sum 值,並製作 ISO9660 映象。

$ isoinfo -d -i /dev/cdrom
CD-ROM is in ISO 9660 format
...
Logical block size is: 2048
Volume size is: 23150592
...
# dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum
# dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso
[警告] 警告

為了得到正確結果,你必須小心避免 Linux ISO9600 檔案系統預讀 bug。

這裡,我們討論直接操作儲存介質上的二進位制資料。

有硬連結的檔案,能夠使用 "ls -li" 確認。

$ ls -li
total 0
2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 bar
2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 baz
2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 foo

"baz" 和 "foo" 的連結數為 "2" (>1),表示他們有硬連結。它們的 inode 號都是"2738404".這表示它們是同樣的硬連結檔案。如果你不想偶然碰巧發現硬連結檔案,你可以通過 inode 號來查詢它。比如說, 按下面的方式查詢 "2738404" 。

# find /path/to/mount/point -xdev -inum 2738404

在可以物理存取您的 PC的情況下,任何人都可以輕易獲得 root 許可權,存取您的 PC 上的所有檔案 (見 節 4.6.4, “root 密碼安全”)。 這意味著登入密碼系統在您的PC被偷盜時並不能保證您私人和敏感資料的安全。您必須部署資料加密技術來實現。儘管 GNU 隱私守護 (見 節 10.3, “資料安全基礎”) 可以對檔案進行加密,但它需要一些使用者端的工作。

Dm-crypt 透過原生的 Linux 核心模組,使用 device-mapper,用很少的使用者操作實現本地自動資料加密。


[注意] 注意

資料加密會消耗 CPU 時間等資源,如果它的密碼丟失,加密的資料會變成無法訪問。請權衡其利弊。

[注意] 注意

通過 debian-installer (lenny 或更新版),整個 Debian 系統能夠被安裝到一個加密的磁碟上,使用 dm-crypt/LUKS 和 initramfs.

[提示] 提示

請參閱 節 10.3, “資料安全基礎” 使用者空間加密實用程式: GNU Privacy Guard

您可以用dm-crypt/LUKS加密大容量可移動裝置上資料,例如掛載在“/dev/sdx”上的USB 記憶棒。你只需按如下步驟簡單地把它格式化。

# fdisk /dev/sdx
... "n" "p" "1" "return" "return" "w"
# cryptsetup luksFormat /dev/sdx1
...
# cryptsetup open /dev/sdx1 secret
...
# ls -l /dev/mapper/
total 0
crw-rw---- 1 root root  10, 60 2021-10-04 18:44 control
lrwxrwxrwx 1 root root       7 2021-10-04 23:55 secret -> ../dm-0
# mkfs.vfat /dev/mapper/secret
...
# cryptsetup close secret

然後,它就可以正常的在現代桌面環境下使用 udisks2 軟體包,掛載到 "/media/username/disk_label",只不過它會要求輸入密碼 (參見 節 10.1.7, “可移動儲存裝置”)。不同的是寫入的資料都是加密的。密碼條目可以自動使用鑰匙環(參見 節 10.3.6, “密碼金鑰環”)。

你可以把它格式化成其他格式的檔案系統,例如用 "mkfs.ext4 /dev/mapper/sdx1" 把它格式化為 ext4。如果使用 btrfs,則需要安裝 udisks2-btrfs 軟體包。對於這些檔案系統,可能需要配置檔案的所有者和許可權。

對於支援的架構,Debian 使用軟體包來分發模組化的 Linux核心.

如果你正在閱讀本文件,你可能不需要親自編譯核心。

Debian 有它自己的方式來編譯核心和相關模組。


如果你在 節 3.1.2, “第二階段:引載加載程序” 使用 initrd , 請一定閱讀 initramfs-tools(8), update-initramfs(8), mkinitramfs(8) 和initramfs.conf(5) 裡的相關資訊。

[警告] 警告

在編譯 Linux 核心原始碼時,請不要放置從"/usr/include/linux" 和 "/usr/include/asm" 到原始碼樹(比如:"/usr/src/linux*") 裡目錄的符號連結。(一些過期的文件建議這樣做.)

[注意] 注意

當在 Debian stable 版裡編譯最新的 Linux 核心時, 可能需要使用一些從Debian unstable 版裡 backported 向後移植的最新版本的工具。

module-assistant(8) (或者它的短形式 m-a) 幫助使用者,從一個或多個定製的核心,容易的構建和安裝模組軟體包。

dynamic kernel module support (DKMS)動態核心模組支援 是一個新的分散式獨立框架,被設計用來允許單個的核心模組在不改變整個核心的情況下升級。這可以用於維護核心程式碼樹外部的模組。這也使你升級核心時,重新編譯模組變得非常簡單。

硬體驅動是執行在目標系統上主 CPU 上的程式碼。大部分硬體驅動現在是自由軟體,已經包含在普通的 Debian 核心軟體包裡,放在 main 區域。

  • GPU 驅動

    • Intel GPU 驅動 (main)

    • AMD/ATI GPU 驅動 (main)和/

    • NVIDIA GPU 驅動 (nouveau 驅動放在 main , 由廠家支援的二進位制驅動,放在 non-free.)

韌體是載入在連線在目標系統裝置上的程式碼或資料(比如說,CPU microcode、 GPU 執行的渲染程式碼 或 FPGA / CPLD 資料……)部分韌體包是作為自由軟體存在,但是很多韌體包由於包含有沒有原始碼的資料,二進位制不是作為自由軟體存在。安裝這些韌體資料是必需的,這樣裝置才能按期望執行。

  • 韌體資料軟體包,含有載入到目標裝置易失性儲存器上的資料。

    • firmware-linux-free (main)

    • firmware-linux-nonfree (non-free-firmware)

    • firmware-linux-* (non-free-firmware)

    • *-firmware (non-free-firmware)

    • intel-microcode (non-free-firmware)

    • amd64-microcode (non-free-firmware)

  • 韌體更新程式軟體包,更新在目標裝置非易失性儲存器上的資料。

    • fwupd (main):從 Linux Vendor Firmware Service 下載韌體資料的韌體更新後臺守護程序(daemon)。

    • gnome-firmware (main): fwupd 的 GTK 前端

    • plasma-discover-backend-fwupd (main): fwupd 的 Qt 前端

請注意,從 Debian 12 Bookworm 開始,使用者使用由官方安裝介質裡面提供的 non-free-firmware 軟體包來提供完善的安裝體驗。 non-free-firmware 區域在 節 2.1.5, “Debian 檔案庫基礎” 裡面描述。

也請注意到, fwupdLinux Vendor Firmware Service 下載的韌體資料並載入到正在執行的 Linux 核心,可能是 non-free

通過使用虛擬系統,我們能在單個機器上同時執行多個系統。

有幾個 虛擬化 和模擬器工具平臺。

  • 完全的 硬體模擬 軟體包,比如透過 games-emulator 元軟體包安裝的軟體包

  • 大部分 CPU 層的模擬,加上一些 I/O 裝置的模擬,比如 QEMU

  • 大部分 CPU 層的虛擬化,加上一些 I/O 裝置的模擬,比如 Kernel-based Virtual Machine (KVM)

  • 作業系統級的容器虛擬化,加上核心級的支援,比如 LXC (Linux Containers), Docker, systemd-nspawn(1), ...

  • 作業系統級的檔案系統訪問虛擬化,加上在檔案路徑上的系統庫呼叫,比如 chroot

  • 作業系統級的檔案系統訪問虛擬化,加上在檔案所有者許可權上的系統庫呼叫,比如 fakeroot

  • 作業系統 API 模擬器,比如 Wine

  • 直譯器級的虛擬化,加上它的執行選擇和執行時庫忽略,比如 Python 的 virtualenvvenv

容器虛擬化使用 節 4.7.5, “Linux 安全特性”,是 節 7.7, “沙盒” 的後端技術。

這裡有一些幫你搭建虛擬化系統的軟體包。

表格 9.27. 虛擬化工具列表

軟體包 流行度 大小 說明
coreutils V:880, I:999 18307 GNU 核心工具包含 chroot(8)
systemd-container V:53, I:61 1330 systemd container/nspawn 工具包含 systemd-nspawn(1)
schroot V:5, I:7 2579 在 chroot 下執行 Debian 二進位制包的特異工具
sbuild V:1, I:3 243 從 Debian 原始碼構建 Debian 二進位制包的工具
debootstrap V:5, I:54 314 搭建一個基本的 Debian 系統 (用 sh 寫的)
cdebootstrap V:0, I:1 115 搭建一個 Debian 系統 (用 C 寫的)
cloud-image-utils V:1, I:17 66 雲映象管理工具
cloud-guest-utils V:3, I:13 71 雲客戶機工具
virt-manager V:11, I:44 2296 虛擬機器管理器: 用於管理虛擬機器的桌面應用
libvirt-clients V:46, I:65 1241 libvirt 的庫程式
incus V:0, I:0 56209 Incus:系統容器和虛擬機器管理器(在 Debian 13 "Trixie")
lxd V:0, I:0 52119 LXD:系統容器和虛擬機器管理器(在 Debian 12 "Bookworm" )
podman V:14, I:16 41948 podman:在 Pods 裡面執行基於 OCI 容器的引擎
podman-docker V:0, I:0 249 在 Pods 裡面執行基於 OCI 容器的引擎 -- docker 封裝器
docker.io V:41, I:43 150003 docker: Linux 容器執行時
games-emulator I:0 21 games-emulator: Debian 的遊戲模擬器
bochs V:0, I:0 6956 Bochs: IA-32 PC 模擬器
qemu I:14 97 QEMU: 快速的通用處理器模擬器
qemu-system I:22 66 QEMU: 全功能系統的模擬二進位制
qemu-user V:1, I:6 93760 QEMU: 使用者模式的模擬二進位制
qemu-utils V:12, I:106 10635 QEMU: 工具集
qemu-system-x86 V:33, I:91 58140 KVM: x86 硬體上有 硬體輔助虛擬化的全虛擬化
virtualbox V:6, I:8 130868 VirtualBox:i386 和 amd64 上 x86 的虛擬化解決方案
gnome-boxes V:1, I:7 6691 Boxes:用於訪問虛擬機器系統的簡單的 GNOME 應用程式
xen-tools V:0, I:2 719 用於管理 debian XEN 虛擬伺服器的工具
wine V:13, I:60 132 Wine: Windows 應用程式程式設計介面實現(標準套件)
dosbox V:1, I:15 2696 DOSBox:有 Tandy/Herc/CGA/EGA/VGA/SVGA 顯示卡,聲音和 DOS 的 x86 模擬器
lxc V:9, I:12 25890 Linux 容器使用者層工具
python3-venv I:88 6 venv 建立虛擬的 python 環境(系統庫)
python3-virtualenv V:9, I:50 356 virtualenv 建立隔離的虛擬 python 環境
pipx V:3, I:19 3324 pipx 在隔離的環境中安裝 python 應用程式

參見維基百科 Comparison of platform virtual machines 來獲得不同平臺的虛擬化解決方案的詳細比較資訊。

[注意] 注意

自從 lenny 之後,預設的 Debian 核心就是支援 KVM 的。

典型的虛擬化工作流涉及以下幾個步驟。

對於原始磁碟映像檔案,參見 節 9.7, “磁碟映像”.

對於其它虛擬磁碟映像檔案,你能夠用使用 network block device網路塊裝置 協議的 qemu-nbd(8) 來匯出他們,並使用核心模組 nbd 來掛載它們.

qemu-nbd(8) 支援 QEMU 所支援的磁碟格式: QEMU 支援下列磁碟格式: raw, qcow2, qcow, vmdk, vdi, bochs, cow (user-mode Linux copy-on-write), parallels, dmg, cloop, vpc, vvfat (virtual VFAT)和主機裝置.

網路塊裝置 能夠用和迴環裝置一樣的方式支援分割槽 (參見 節 9.7.3, “掛載磁碟映像檔案”). 你能夠按下面的方式掛載 "disk.img" 的第一個分割槽.

# modprobe nbd max_part=16
# qemu-nbd -v -c /dev/nbd0 disk.img
...
# mkdir /mnt/part1
# mount /dev/nbd0p1 /mnt/part1
[提示] 提示

你可以給 qemu-nbd(8) 使用 "-P 1" 選項來匯出"disk.img"的第一個分割槽.

如果你希望從終端控制檯嘗試一個新的 Debian 環境,我推薦你使用 chroot。這使你能夠執行 unstabletesting 的控制檯應用程式,不會有通常的相關風險,並且不需要重啟。chroot(8) 是最基礎的方法。

[注意] 注意

下面的列子假設根源系統和 chroot 系統都共享相同的 amd64 CPU 架構。

雖然你能夠手工使用 debootstrap(1)來建立一個 chroot(8) 環境,這要求瑣碎的工作。

sbuild 軟體包從原始碼構建一個 Debian 軟體包,使用 schroot 軟體包管理的 chroot 環境。它和幫助指令碼 sbuild-createchroot(1) 一起。讓我們按如下所示的方式執行它,來學會它是怎樣工作的。

$ sudo mkdir -p /srv/chroot
$ sudo sbuild-createchroot -v --include=eatmydata,ccache unstable /srv/chroot/unstable-amd64-sbuild http://deb.debian.org/debian
 ...

你能夠看到 debootstrap(8) 是如何在 "/srv/chroot/unstable-amd64-sbuild" 下部署 unstable 環境的系統資料,用於一個最小的構建系統。

你可以使用 schroot(1) 來登入到這個環境。

$ sudo schroot -v -c chroot:unstable-amd64-sbuild

你可以看到一個執行在 unstable 環境的系統 shell 是如何建立的。

[注意] 注意

"/usr/sbin/policy-rc.d" 檔案總是用 101 退出,阻止在 Debian 系統上自動啟動後臺守護程式。參見 "/usr/share/doc/init-system-helpers/README.policy-rc.d.gz"。

[注意] 注意

一些在 chroot 下的程式,需要訪問比上面根源系統上的 sbuild-createchroot 能夠提供的檔案之外的更多檔案才能夠執行。例如,"/sys", "/etc/passwd", "/etc/group", "/var/run/utmp", "/var/log/wtmp"等等.也許需要使用 bind-mounted 或複製.

[提示] 提示

sbuild 軟體包幫助建立一個 chroot 系統來構建一個軟體包,在 chroot 內使用 schroot 作為它的後端。它是一個檢查構建依賴(build-dependencies)的理想系統。更多資訊參見 sbuild at Debian wiki在"Guide for Debian Maintainers"中的 sbuild 配置樣例

[提示] 提示

systemd-nspawn(1) 命令使用 chroot 類似的方法幫助執行一個命令,或者輕量級容器內的作業系統。它更強大,因為它使用名稱空間來完全虛擬化程序樹、程序間通訊、主機名、域名,並可選網路和使用者資料庫。 參見 systemd-nspawn

如果你希望嘗試任一作業系統的一個新的 GUI 桌面環境,我推薦在 Debian 穩定版 系統上使用 QEMU或者KVM ,這些軟體應用虛擬化技術安全的執行多桌面系統。這能讓你執行任何桌面應用,包括 Debian 不穩定版測試版上的桌面應用,並且沒有與之相關的通常意義上的風險,並且不需要重啟。

因為單純的 QEMU 工具是非常慢的,當主機系統支援 KVM 的時候,建議使用它來加速。

虛擬機器管理器,也被稱為 virt-manager,它是一個便利的管理 KVM 虛擬機器的 GUI(圖形使用者介面)工具,它呼叫 libvirt

按下面的方法,能夠建立一個可以用於QEMU 的包含有 Debian 系統的虛擬磁碟映像 "virtdisk.qcow2",這個 Debian 系統使用 debian 安裝器:小 CD安裝。

$ wget https://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso
$ qemu-img create -f qcow2 virtdisk.qcow2 5G
$ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256
...
[提示] 提示

虛擬化下執行 UbuntuFedora 之類的其它 GNU/Linux 發行版,是一個不錯的學習其調配技巧的方法。其它專有作業系統也可以在這個 GNU/Linux 虛擬化下很好的執行。

Debian wiki: SystemVirtualization 參看更多技巧。



[2] 更多精心製作的定製例子: "Vim Galore", "sensible.vim", ...

[3] vim-pathogen 也很流行。