# 6.14\. Coreutils-5.96
Coreutils 軟件包包括一套顯示、設置基本系統屬性的工具。
**預計編譯時間:** 1.1 SBU**所需磁盤空間:** 58.3 MB
## 6.14.1\. 安裝 Coreutils
通常 `uname` 程序總是有點毛病的,比如 _`-p`_unknown 的結果。下面的補丁對 Intel 平臺的機器能修正這個問題:
```
patch -Np1 -i ../coreutils-5.96-uname-1.patch
```
阻止 Coreutils 安裝后面將由別的包安裝的程序:
```
patch -Np1 -i ../coreutils-5.96-suppress_uptime_kill_su-1.patch
```
POSIX 要求 Coreutils 的程序即使在多字節環境下也能夠識別出字符的邊界。下面的這個patch能夠解決這個問題以及其他的一些國際化相關的問題:
```
patch -Np1 -i ../coreutils-5.96-i18n-1.patch
```
為了測試應用的patch能夠運行,修改文件的權限:
```
chmod +x tests/sort/sort-mb-tests
```
### 注意
過去,在這個patch里面發現了很多bug。當你向 Coreutils 的維護者發送錯誤報告的時候,首先確認不應用這個patch錯誤會不會出現。
現在已經發現在使用`who -Hu`時,轉換的信息有時會導致緩沖區溢出。增大緩沖區大小:
```
sed -i 's/_LEN 6/_LEN 20/' src/who.c
```
為編譯 Coreutils 做準備:
```
./configure --prefix=/usr
```
編譯軟件包:
```
make
```
Coreutils 軟件包的測試套件對系統進行了某些假設,比如要求有非 root 用戶和組,但是我們目前的系統中尚不存在。如果你不想運行測試套件,就直接跳過下面將要進行的測試,直接從"安裝軟件包"那里繼續。
下面的命令為我們做測試前的準備,創建兩個 dummy(偽) 組和一個 dummy(偽) 用戶:
```
echo "dummy1:x:1000:" >> /etc/group
echo "dummy2:x:1001:dummy" >> /etc/group
echo "dummy:x:1000:1000::/root:/bin/bash" >> /etc/passwd
```
現在已經準備好可以運行測試套件了,首先運行那些需要以 `root` 運行的測試:
```
make NON_ROOT_USERNAME=dummy check-root
```
然后以 `dummy` 用戶運行剩余的測試:
```
src/su dummy -c "make RUN_EXPENSIVE_TESTS=yes check"
```
測試結束后,刪除 dummy 組和用戶:
```
sed -i '/dummy/d' /etc/passwd /etc/group
```
安裝軟件包:
```
make install
```
把一些程序移動到合適的位置以符合 FHS 標準:
```
mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
mv -v /usr/bin/{false,hostname,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
mv -v /usr/bin/chroot /usr/sbin
```
一些 LFS-Bootscripts 包中的腳本依賴于 `head`, `sleep`,和 `nice` 。由于 /usr 目錄有可能在系統啟動過程的早期不可用(比如尚未掛載),所以這些二進制程序需要放置在根分區上:
```
mv -v /usr/bin/{head,sleep,nice} /bin
```
## 6.14.2\. Coreutils 的內容
**安裝的程序:** basename, cat, chgrp, chmod, chown, chroot, cksum, comm, cp, csplit, cut, date, dd, df, dir, dircolors, dirname, du, echo, env, expand, expr, factor, false, fmt, fold, groups, head, hostid, hostname, id, install, join, link, ln, logname, ls, md5sum, mkdir, mkfifo, mknod, mv, nice, nl, nohup, od, paste, pathchk, pinky, pr, printenv, printf, ptx, pwd, readlink, rm, rmdir, seq, sha1sum, shred, sleep, sort, split, stat, stty, sum, sync, tac, tail, tee, test, touch, tr, true, tsort, tty, uname, unexpand, uniq, unlink, users, vdir, wc, who, whoami, yes
### 簡要描述
| | |
| --- | --- |
| `basename` | 去掉文件名中的目錄和后綴 |
| `cat` | 把文本文件的內容發送到標準輸出 |
| `chgrp` | 改變文件和目錄屬組,屬組可以使用組名或者組識別號表示 |
| `chmod` | 改變文件和目錄的權限,權限可以使用符號或者八進制兩種表達方式 |
| `chown` | 改變文件和目錄的所有權(包括用戶和/或組) |
| `chroot` | 使用特定的目錄作為執行某個命令或者交互 shell 的根目錄(/)。在多數系統中,只有 root 用戶能運行這個命令 |
| `cksum` | 輸出指定的每個文件的CRC(循環冗余校驗)校驗和與字節數 |
| `comm` | 一行一行對兩個已經排序的文件進行比較,在第三列中顯示同一行是否相同 |
| `cp` | 復制文件 |
| `csplit` | 把一個文件按照給定的模式或者行號分成幾塊 |
| `cut` | 從指定的文件中提取特定的列送到標準輸出 |
| `date` | 以特定的格式顯示當前時間,或者設置系統日期 |
| `dd` | 以可選塊長度復制文件,默認情況下從標準輸入設備輸出到標準輸出設備。復制過程中,還可以對文件進行一些轉換 |
| `df` | 顯示參數中的文件所在分區磁盤空間的使用情況,如果沒有給出文件參數就顯示所有已經安裝的文件系統的可用空間數量。 |
| `dir` | 列出給定目錄的內容 (同 `ls` 命令) |
| `dircolors` | 設置 LS_COLOR 環境變量(用來改變 `ls` 及相關工具默認顏色組合) |
| `dirname` | 顯示從文件名去掉非目錄后綴之后的內容 |
| `du` | 顯示參數使用的磁盤空間的數量,對于參數為目錄還會列出每個子目錄磁盤空間占用情況。 |
| `echo` | 顯示給定字符串或變量值 |
| `env` | 在一個被修改的環境中運行一個程序 |
| `expand` | 把 tab 轉換為空格符 |
| `expr` | 執行表達式計算 |
| `factor` | 輸出所有指定整數的質因數 |
| `false` | 返回一個不成功或者邏輯假的結果 |
| `fmt` | 重新格式化指定文件的段落 |
| `fold` | 斷開指定文件(默認是標準輸入)較長的行,在屏幕上顯示 |
| `groups` | 顯示一個用戶所在的組 |
| `head` | 顯示每個指定文件的前幾行(默認是10) |
| `hostid` | 以16進制方式,顯示當前主機的數字標志符 |
| `hostname` | 顯示或設置主機名 |
| `id` | 顯示某個用戶或者當前用戶的真實和有效的 UID、GID 。 |
| `install` | 復制文件,設置它們的權限,如果可能還設置擁有它們的用戶和組 |
| `join` | 合并兩個文件的行 |
| `link` | 創建從指定文件到指定名稱的硬鏈接 |
| `ln` | 創建文件之間的硬/軟(符號)連接 |
| `logname` | 顯示當前用戶的登錄名 |
| `ls` | 列出指定目錄的所有內容。缺省是將文件和子目錄按字母順序排列。 |
| `md5sum` | 顯示或者校驗 MD5 校驗碼。 |
| `mkdir` | 建立目錄,使用給定的參數作為目錄名。 |
| `mkfifo` | 以給定的參數作為名字建立FIFO(又叫"命名管道")文件。 |
| `mknod` | 使用給出的文件名,建立一個設備節點,也就是:FIFO、字符特殊文件(special file)或者塊特殊文件(special file)。 |
| `mv` | 根據所給參數的不同,把文件或者目錄移動到另外的目錄或者將其改名 |
| `nice` | 修改某個進程的調度優先級 |
| `nl` | 把每個指定文件的內容寫到標準輸出,在每行加上行號 |
| `nohup` | 使某個命令不被掛起,并將輸出重定向到一個日志文件。 |
| `od` | 以數字方式顯示指定文件的內容,默認為八進制。 |
| `paste` | 將字段連接在一起,在字段之間自動插入分割符,默認的分割符是 Tab 。 |
| `pathchk` | 檢查文件名是否是有效的或者是可移植的 |
| `pinky` | 一個輕量級的 finger 客戶端,用來得到某個用戶的信息。 |
| `pr` | 將文件分成適當大小的頁送到打印機 |
| `printenv` | 顯示環境變量 |
| `printf` | 根據給定的參數格式化輸出數據,與 C 語言中的該函數相似。 |
| `ptx` | 為指定的文件提供一個排序索引 |
| `pwd` | 顯示當前工作目錄 |
| `readlink` | 顯示指定符號鏈接的值 |
| `rm` | 刪除文件或者目錄 |
| `rmdir` | 刪除目錄(目錄必需為空) |
| `seq` | 以指定的步長輸出一個數列 |
| `sha1sum` | 顯示或校驗 160 位的 SHA1 校驗碼 |
| `shred` | 安全刪除一個文件,重寫其占用的磁盤空間,使其無法恢復。 |
| `sleep` | 延遲一段時間 |
| `sort` | 對文件進行排序 |
| `split` | 把文件分成固定大小(字節或行數)的片斷 |
| `stat` | 顯示文件或者文件系統的狀態 |
| `stty` | 改變和顯示終端行的設置 |
| `sum` | 顯示指定文件的校驗和及塊數 |
| `sync` | 刷新文件系統緩沖區,使磁盤和內存的數據同步。 |
| `tac` | 逆向顯示指定的文件,最后一行在最前。 |
| `tail` | 顯示每個指定文件的最后幾行(默認是10)。 |
| `tee` | 從標準輸入讀取數據,輸出到標準輸出和指定的文件。 |
| `test` | 檢查文件類型,以及進行變量的比較。 |
| `touch` | 把參數指定的文件的訪問和修改時間改為當前的時間。如果文件不存在,它就建立一個空文件。 |
| `tr` | 從標準輸入讀入正文,對字符進行轉換、壓縮或者刪除,然后寫到標準輸出 |
| `true` | 返回一個成功或者邏輯真的結果 |
| `tsort` | 對給定的文件進行拓撲排序 |
| `tty` | 顯示標準輸出設備連接終端的文件名 |
| `uname` | 打印系統信息 |
| `unexpand` | 把空格符轉換成 tab |
| `uniq` | 拋棄指定文件或者標準輸入中內容重復的行 |
| `unlink` | 刪除指定文件 |
| `users` | 顯示在當前主機登錄的用戶名 |
| `vdir` | 同 **ls -l** |
| `wc` | 統計文件中包含的字節數、單詞數、行數 |
| `who` | 顯示有哪些用戶登錄 |
| `whoami` | 打印當前用戶的有效用戶標志符 |
| `yes` | 重復輸出"y"字符,直到被殺死。 |
- Linux From Scratch
- 序言
- i. 前言
- ii. 目標讀者
- iii. 先決條件
- iv. 對宿主系統的要求
- v. 排版約定
- vi. 本書的組織結構
- vii. 勘誤表
- I. 簡介
- 1. 簡介
- 1.1. 如何構建一個 LFS 系統?
- 1.2. 與上一版本有何不同?
- 1.3. 更新日志
- 1.4. 資源
- 1.5. 幫助
- 2. 準備一個新分區
- 2.1. 簡介
- 2.2. 創建一個新分區
- 2.3. 在新分區上創建文件系統
- 2.4. 掛載新分區
- 3. 軟件包和補丁
- 3.1. 簡介
- 3.2. 全部軟件包
- 3.3. 需要的補丁
- 4. 最后的準備工作
- 4.1. 關于環境變量 $LFS
- 4.2. 創建 $LFS/tools 目錄
- 4.3. 添加 LFS 用戶
- 4.4. 設置工作環境
- 4.5. 關于 SBU
- 4.6. 關于軟件包測試套件
- 5. 構建臨時編譯環境
- 5.1. 簡介
- 5.2. 工具鏈技術說明
- 5.3. Binutils-2.16.1 - 第一遍
- 5.4. GCC-4.0.3 - 第一遍
- 5.5. Linux-Libc-Headers-2.6.12.0
- 5.6. Glibc-2.3.6
- 5.7. 調整工具鏈
- 5.8. Tcl-8.4.13
- 5.9. Expect-5.43.0
- 5.10. DejaGNU-1.4.4
- 5.11. GCC-4.0.3 - 第二遍
- 5.12. Binutils-2.16.1 - 第二遍
- 5.13. Ncurses-5.5
- 5.14. Bash-3.1
- 5.15. Bzip2-1.0.3
- 5.16. Coreutils-5.96
- 5.17. Diffutils-2.8.1
- 5.18. Findutils-4.2.27
- 5.19. Gawk-3.1.5
- 5.20. Gettext-0.14.5
- 5.21. Grep-2.5.1a
- 5.22. Gzip-1.3.5
- 5.23. M4-1.4.4
- 5.24. Make-3.80
- 5.25. Patch-2.5.4
- 5.26. Perl-5.8.8
- 5.27. Sed-4.1.5
- 5.28. Tar-1.15.1
- 5.29. Texinfo-4.8
- 5.30. Util-linux-2.12r
- 5.31. 清理系統
- 5.32. 改變所有者
- III. 構建 LFS 系統
- 第六章 安裝系統基礎軟件
- 6.1. 簡介
- 6.2. 掛載虛擬內核文件系統
- 6.3. 包管理
- 6.4. 進入 Chroot 環境
- 6.5. 創建系統目錄結構
- 6.6. 創建必需的文件與符號連接
- 6.7. Linux-Libc-Headers-2.6.12.0
- 6.8. Man-pages-2.34
- 6.9. Glibc-2.3.6
- 6.10. 再次調整工具鏈
- 6.11. Binutils-2.16.1
- 6.12. GCC-4.0.3
- 6.13. Berkeley DB-4.4.20
- 6.14. Coreutils-5.96
- 6.15. Iana-Etc-2.10
- 6.16. M4-1.4.4
- 6.17. Bison-2.2
- 6.18. Ncurses-5.5
- 6.19. Procps-3.2.6
- 6.20. Sed-4.1.5
- 6.21. Libtool-1.5.22
- 6.22. Perl-5.8.8
- 6.23. Readline-5.1
- 6.24. Zlib-1.2.3
- 6.25. Autoconf-2.59
- 6.26. Automake-1.9.6
- 6.27. Bash-3.1
- 6.28. Bzip2-1.0.3
- 6.29. Diffutils-2.8.1
- 6.30. E2fsprogs-1.39
- 6.31. File-4.17
- 6.32. Findutils-4.2.27
- 6.33. Flex-2.5.33
- 6.34. GRUB-0.97
- 6.35. Gawk-3.1.5
- 6.36. Gettext-0.14.5
- 6.37. Grep-2.5.1a
- 6.38. Groff-1.18.1.1
- 6.39. Gzip-1.3.5
- 6.40. Inetutils-1.4.2
- 6.41. IPRoute2-2.6.16-060323
- 6.42. Kbd-1.12
- 6.43. Less-394
- 6.44. Make-3.80
- 6.45. Man-DB-2.4.3
- 6.46. Mktemp-1.5
- 6.47. Module-Init-Tools-3.2.2
- 6.48. Patch-2.5.4
- 6.49. Psmisc-22.2
- 6.50. Shadow-4.0.15
- 6.51. Sysklogd-1.4.1
- 6.52. Sysvinit-2.86
- 6.53. Tar-1.15.1
- 6.54. Texinfo-4.8
- 6.55. Udev-096
- 6.56. Util-linux-2.12r
- 6.57. Vim-7.0
- 6.58. 關于調試符號
- 6.59. 再次清理系統
- 6.60. 最終的清理
- 7. 配置系統啟動腳本
- 7.1. 簡介
- 7.2. LFS-Bootscripts-6.2
- 7.3. 啟動腳本是如何工作的?
- 7.4. LFS 系統的設備和模塊處理
- 7.5. 配置 setclock 腳本
- 7.6. 配置 Linux 控制臺
- 7.7. 配置 sysklogd 腳本
- 7.8. 創建 /etc/inputrc 文件
- 7.9. Bash Shell 啟動文件
- 7.10. 配置 localnet 腳本
- 7.11. 定制 /etc/hosts 文件
- 7.12. 為設備創建慣用符號連接
- 7.13. 配置網絡腳本
- 8. 使 LFS 系統能夠啟動
- 8.1. 簡介
- 8.2. 創建 /etc/fstab 文件
- 8.3. Linux-2.6.16.27
- 8.4. 使 LFS 系統能夠啟動
- 9. 結束
- 9.1. 結束
- 9.3. 重啟系統
- 9.4. 現在做什么?
- IV. 附錄
- A. 縮寫和名詞
- B. 致謝
- C. 依賴關系
- 長索引