Compare commits

..

51 Commits

Author SHA1 Message Date
cxykevin c9c72f323e 格式化
Build and Publish / Run (push) Successful in 7m51s Details
2024-08-30 23:21:05 +08:00
ZXL-Q a670ad62d6 VMware 错别字修改 (#24)
Build and Publish / Run (push) Successful in 13m13s Details
Reviewed-on: study-area-cn/study-area-cn#24
Co-authored-by: ZXL-Q <zxlq114514@gmail.com>
Co-committed-by: ZXL-Q <zxlq114514@gmail.com>
2024-08-30 22:34:36 +08:00
cxykevin 124e4a0308 更新 src/learn_linux_basic/shell_and_shell_script/learn_shell.md
Build and Publish / Run (push) Successful in 8m28s Details
2024-08-30 10:40:12 +08:00
cxykevin d3ac3e700e 更新sh
Build and Publish / Run (push) Successful in 6m45s Details
2024-08-30 10:20:41 +08:00
cxykevin 6e25b485ff 格式化,补充内容
Build and Publish / Run (push) Has been cancelled Details
2024-08-30 10:18:15 +08:00
cxykevin 4711a45569 改错别字
Build and Publish / Run (push) Successful in 6m45s Details
2024-08-30 09:56:34 +08:00
Hmtsai 8bf629d140 完成章节:”学习Shell”
Build and Publish / Run (push) Successful in 6m28s Details
2024-08-29 13:06:59 +08:00
cxykevin c0fd2c82be 包含字体
Build and Publish / Run (push) Successful in 6m47s Details
2024-08-29 12:07:14 +08:00
cxykevin 83fa4d4b03 更新 src/SUMMARY.md
Build and Publish / Run (push) Has been cancelled Details
2024-08-29 12:05:01 +08:00
cxykevin 4a07a842f5 更新 src/learn_linux_basic/file_and_path/backup.md
Build and Publish / Run (push) Has been cancelled Details
2024-08-29 12:03:40 +08:00
cxykevin 91e766aea2 更新 src/learn_linux_basic/file_and_path/backup.md
Build and Publish / Run (push) Has been cancelled Details
2024-08-29 12:03:15 +08:00
Hmtsai 8b3c8339fc 更正部分内容
Build and Publish / Run (push) Has been cancelled Details
2024-08-29 11:58:08 +08:00
Hmtsai 7cca05c26c 新增备份相关内容
Build and Publish / Run (push) Successful in 6m17s Details
2024-08-29 11:44:39 +08:00
Hmtsai 20b6cc1b62 修改部分用词
Build and Publish / Run (push) Successful in 6m30s Details
2024-08-29 11:07:52 +08:00
cxykevin 0eba964a5a 主题小优化 (#23)
Build and Publish / Run (push) Successful in 6m15s Details
Reviewed-on: study-area-cn/study-area-cn#23
2024-08-27 22:39:25 +08:00
cxykevin f77e79a58c 删除vim的高亮
Build and Publish / Run (push) Successful in 12m17s Details
2024-08-27 20:15:44 +08:00
cxykevin baacf2a231 更新 src/learn_linux_basic/shell_and_shell_script/vim_editor.md
Build and Publish / Run (push) Successful in 6m24s Details
2024-08-27 20:07:51 +08:00
cxykevin 0fb5946b8e 完成 Vim Editor (#22)
Build and Publish / Run (push) Successful in 6m22s Details
Reviewed-on: study-area-cn/study-area-cn#22
2024-08-27 19:58:01 +08:00
cxykevin 532d6b9948 更新 src/learn_linux_basic/linux_common_sense.md
Build and Publish / Run (push) Successful in 6m11s Details
2024-08-27 19:12:06 +08:00
cxykevin d0a0eb6479 更新 src/conventions.md
Build and Publish / Run (push) Has been cancelled Details
2024-08-27 19:10:49 +08:00
cxykevin dd798247e2 更新主题 (#21)
Build and Publish / Run (push) Successful in 6m35s Details
Reviewed-on: study-area-cn/study-area-cn#21
2024-08-25 17:42:57 +08:00
cxykevin 4880cfff76 完成磁盘 (#20)
Build and Publish / Run (push) Successful in 5m51s Details
Reviewed-on: study-area-cn/study-area-cn#20
2024-08-24 21:10:50 +08:00
Hmtsai e787a0aae7 修改错别字
Build and Publish / Run (push) Successful in 5m55s Details
2024-08-21 19:24:14 +08:00
cxykevin 4c6b3b8687 完成gzip (#19)
Build and Publish / Run (push) Successful in 5m53s Details
Reviewed-on: study-area-cn/study-area-cn#19
2024-08-18 15:19:43 +08:00
cxykevin 9429325196 更新 README.md
Build and Publish / Run (push) Successful in 5m38s Details
2024-08-13 16:34:28 +08:00
cxykevin 532ff126b6 更新 src/intro.md
Build and Publish / Run (push) Has been cancelled Details
2024-08-13 16:34:00 +08:00
cxykevin 4291024933 更改badgeapi
Build and Publish / Run (push) Has been cancelled Details
2024-08-13 16:32:33 +08:00
cxykevin ff8ffa0fd1 修复懒加载菜单展开问题
Build and Publish / Run (push) Successful in 5m42s Details
2024-08-12 14:48:24 +08:00
cxykevin 37cfe1b31e 完成tar (#17)
Build and Publish / Run (push) Failing after 13m48s Details
Reviewed-on: study-area-cn/study-area-cn#17
Co-authored-by: cxykevin <cxykevin@yeah.net>
Co-committed-by: cxykevin <cxykevin@yeah.net>
2024-08-12 13:15:47 +08:00
cxykevin 8908dd550a 更新 theme/js/page.js
Build and Publish / Run (push) Successful in 5m16s Details
2024-08-12 09:09:16 +08:00
cxykevin 45b959e6ef 更新 theme/index.hbs
Build and Publish / Run (push) Waiting to run Details
2024-08-12 09:07:37 +08:00
cxykevin 55a044a670 更新 theme/js/page.js
Build and Publish / Run (push) Successful in 5m29s Details
2024-08-12 08:50:41 +08:00
cxykevin 6f2a135b4b 修复无刷新忘记更新的bug
Build and Publish / Run (push) Successful in 5m38s Details
2024-08-12 06:26:41 +08:00
cxykevin c866e5f47a 修复底部上一章下一章的bug
Build and Publish / Run (push) Waiting to run Details
2024-08-12 06:23:30 +08:00
cxykevin a7e4fa1424 修复favicon
Build and Publish / Run (push) Successful in 5m30s Details
2024-08-11 22:17:39 +08:00
cxykevin ffbb8de10d 实现“无刷新” (#16)
Build and Publish / Run (push) Successful in 5m16s Details
Reviewed-on: study-area-cn/study-area-cn#16
2024-08-11 21:10:42 +08:00
Hmtsai deddf2407c 修改部分用词
Build and Publish / Run (push) Successful in 5m27s Details
2024-08-11 16:48:42 +08:00
cxykevin 6bd928d8db 修复手机端自动展开菜单的问题 (#15)
Build and Publish / Run (push) Successful in 5m35s Details
Reviewed-on: study-area-cn/study-area-cn#15
2024-08-11 15:02:16 +08:00
cxykevin d791a0b76d SACP2: 完成大部分美化 (#14)
Build and Publish / Run (push) Successful in 5m20s Details
Reviewed-on: study-area-cn/study-area-cn#14
2024-08-10 21:39:31 +08:00
Hmtsai 837d290e8a 优化 study env 的实现细节
Build and Publish / Run (push) Successful in 5m5s Details
2024-08-09 22:17:21 +08:00
cxykevin f0081dd7ff 删除 hash.txt
Build and Publish / Run (push) Successful in 5m16s Details
2024-08-09 15:12:31 +08:00
cxykevin d16dfeb414 更新 .gitea/workflows/build.yaml
Build and Publish / Run (push) Waiting to run Details
2024-08-08 17:23:24 +08:00
studyareacn-format-bot afe0f8ca35 Auto format
Build and Publish / Build (push) Successful in 5m3s Details
2024-08-08 08:04:31 +00:00
Hmtsai 8cbd777568 规范用词
Build and Publish / Build (push) Has been cancelled Details
2024-08-08 16:03:26 +08:00
Hmtsai ae67fc3d6b 更新主题,使其符合Material Design风格
Build and Publish / Build (push) Successful in 5m5s Details
2024-08-08 15:08:32 +08:00
studyareacn-format-bot 6afcb9cdf9 Auto format
Build and Publish / Build (push) Successful in 5m3s Details
2024-08-02 03:42:05 +00:00
Hmtsai 0b0176c6fe 更新许可证
Build and Publish / Build (push) Has been cancelled Details
2024-08-01 16:20:31 +08:00
Hmtsai 6b7ffaac99 完成章节“文件权限管理”
Build and Publish / Build (push) Has been cancelled Details
2024-07-26 20:11:00 +08:00
Hmtsai 612121ebfc 增加对`~`的解释
Build and Publish / Build (push) Has been cancelled Details
2024-07-21 20:01:00 +08:00
Hmtsai 6080a4fb81 一些零碎修改
Build and Publish / Build (push) Waiting to run Details
2024-07-21 19:50:40 +08:00
cxykevin bdc9054201 调整目录并触发actions
Build and Publish / Build (push) Successful in 7m51s Details
2024-07-15 14:35:09 +08:00
140 changed files with 3441 additions and 2851 deletions

79
.gitea/workflows/build.yaml Normal file → Executable file
View File

@ -3,85 +3,11 @@ run-name: Build and Publish book (${{ gitea.actor }})
on: [push]
jobs:
Build:
Run:
runs-on: ubuntu-latest
steps:
- name: Info
run: echo "OS=${{ runner.os }} NAME=${{ gitea.event_name }} REPO=${{ gitea.repository }} BRANCH=${{ gitea.ref }} ST=${{ job.status }} RUNID=${{ gitea.run_id }}"
- name: Checkout
uses: https://git.hmtsai.cn/actions/checkout@v4
- name: Get Hash
id: src_hash
run: echo "::set-output name=src_hash::$(if [[ $(find src -type f -exec sha256sum {} \; | sha256sum | cut -d ' ' -f 1) = $(cat hash.txt) ]]; then echo run; else echo next; fi)"
- name: Cache Node
if: ${{ steps.src_hash.outputs.src_hash != 'run' }}
uses: https://git.hmtsai.cn/actions/cache@v4
id: cache-node
env:
cache-name: cache-node
with:
key: ${{ runner.os }}-node
path: |
/node
- name: Prepare node
if: ${{ steps.src_hash.outputs.src_hash != 'run' && steps.cache-node.outputs.cache-hit != 'true' }}
run: |
git clone https://git.hmtsai.cn/cxykevin/study-area-home-action-deps
mv study-area-home-action-deps/node-$(uname -m).tar.xz study-area-home-action-deps/node.tar.xz
tar xvJf study-area-home-action-deps/node.tar.xz
mv node-*-linux-* /node
export PATH=/node/bin:$PATH
echo $PATH
- name: Get npm root
if: ${{ steps.src_hash.outputs.src_hash != 'run' }}
id: npm_root
run: echo "::set-output name=npmroot::$(npm root -g)"
- name: Cache Node Moudles
if: ${{ steps.src_hash.outputs.src_hash != 'run' }}
id: cache-node-moudles
uses: https://git.hmtsai.cn/actions/cache@v4
env:
cache-name: cache-node-moudles
with:
key: ${{ runner.os }}-node_moudles
path: |
${{ steps.npm_root.outputs.npmroot }}
- name: Check node
if: ${{ steps.src_hash.outputs.src_hash != 'run' }}
run: |
node -v
npm -v
- name: Prepare NPM source
if: ${{ steps.src_hash.outputs.src_hash != 'run' }}
run: |
export PATH=/node/bin:$PATH
npm config set registry https://registry.npmmirror.com
- name: npm install
if: ${{ steps.src_hash.outputs.src_hash != 'run' && steps.cache-node-moudles.outputs.cache-hit != 'true' }}
run: |
export PATH=/node/bin:$PATH
npm install -g @lint-md/cli
- name: Format
if: ${{ steps.src_hash.outputs.src_hash != 'run' }}
run: |
export PATH=/node/bin:$PATH
lint-md src/**/* --threads=8 --fix --suppress-warnings
- name: Set hash cache
if: ${{ steps.src_hash.outputs.src_hash != 'run' }}
run: |
echo "$(find src -type f -exec sha256sum {} \; | sha256sum | cut -d ' ' -f 1)" > hash.txt
- name: Commit files
if: ${{ steps.src_hash.outputs.src_hash != 'run' }}
run: |
git config --global user.name "studyareacn-format-bot"
git config --global user.email "studyareacn-format@noreply.localhost"
git remote set-url origin https://${{ secrets.GIT_USER }}:${{ secrets.GIT_PASSWD }}@git.hmtsai.cn/study-area-cn/study-area-cn
git add .
git commit -m "Auto format"
echo "__import__(\"os\").system(\"sh -c \\\"git push\\\"\")" > ezpush.py && python3 ezpush.py
- name: "-------------"
id: src_hash
run: echo "-------------"
- name: Prepare Source
run: |
echo "--- write source ---"
@ -95,6 +21,8 @@ jobs:
- name: Prepare Lftp
run: |
apt-get install lftp -y
- name: Checkout
uses: https://git.hmtsai.cn/actions/checkout@v4
- name: Cache mdbook
uses: https://git.hmtsai.cn/actions/cache@v4
id: cache-mdbook
@ -138,3 +66,4 @@ jobs:
run: |
mv book index
lftp ${{ secrets.FTP_SITE }} -u ${{ secrets.FTP_USERNAME }},${{ secrets.FTP_PWD }} -e "mirror -R index index"

0
.gitignore vendored Normal file → Executable file
View File

0
.lintmdrc Normal file → Executable file
View File

0
LICENSE-APACHE Normal file → Executable file
View File

0
LICENSE-MIT Normal file → Executable file
View File

7
README.md Normal file → Executable file
View File

@ -1,8 +1,10 @@
# Study Area CN [learn.study-area.org.cn](learn.study-area.org.cn)
# Study Area CN
### URL : [learn.study-area.org.cn](https://learn.study-area.org.cn)
![stars](https://img.shields.io/badge/dynamic/json?url=http%3A%2F%2Fgit.hmtsai.cn%2Fapi%2Fv1%2Frepos%2Fstudy-area-cn%2Fstudy-area-cn&query=%24.stars_count&style=for-the-badge&logo=gitea&label=stars&labelColor=%23F0F0F0&color=%231080FF&cacheSeconds=120&link=http%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn&link=http%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn)
![forks](https://img.shields.io/badge/dynamic/json?url=http%3A%2F%2Fgit.hmtsai.cn%2Fapi%2Fv1%2Frepos%2Fstudy-area-cn%2Fstudy-area-cn&query=%24.forks_count&style=for-the-badge&logo=git&logoColor=%23303030&label=forks&labelColor=%23F0F0F0&color=%2350B250&cacheSeconds=120&link=http%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn&link=http%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn)
![CI](https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.hmtsai.cn%2Fbadgeapi%2Factions%3Furl%3Dhttp%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn%2Factions%26label%3DCI&style=for-the-badge&cacheSeconds=0&labelColor=%23F0F0F0)
![CI](https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.study-area.org.cn%2Fbadgeapi%2Factions%3Furl%3Dhttp%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn%2Factions%26label%3DCI&style=for-the-badge&cacheSeconds=0&labelColor=%23F0F0F0)
## 概述
这里是www.study-area.org的半克隆
@ -19,6 +21,7 @@
## 如何帮助开发?
如果您想要协助我们的开发,请参阅[百科](https://git.hmtsai.cn/study-area-cn/study-area-cn/wiki)
如果你对本项目做出了贡献,就请在`/src/contributors.md`中写上你的名字吧!

19
book.toml Normal file → Executable file
View File

@ -4,3 +4,22 @@ language = "zh-cn"
multilingual = false
src = "src"
title = "Study Area CN"
[output.html]
additional-css = [
"theme/css/icons.css",
"theme/css/mdui.css",
"theme/css/highlight.min.css",
"theme/css/page.css",
"theme/css/font.css",
"theme/font/icons.woff2",
"theme/font/noto.otf",
"theme/font/sourcecodepro.woff2",
]
additional-js = [
"theme/js/mdui.global.js",
"theme/js/highlight.min.js",
"theme/js/mathjax.js",
"theme/js/tocrender.js",
"theme/js/page.js",
]

View File

@ -1 +0,0 @@
6b4b63e9987c736a6ac82200412b04262fef127cdcfbb78cd7264306df80eda5

25
src/SUMMARY.md Normal file → Executable file
View File

@ -34,16 +34,18 @@
- [在你的电脑(实体机)上安装](./learn_linux_basic/install_rocky_linux/install_in_your_pc.md)
- [安装 Rocky Linux](./learn_linux_basic/install_rocky_linux/install_rocky_linux.md)
- [Linux 常识](./learn_linux_basic/linux_common_sense.md)
- [文件与路径](./file_and_path/file_and_path.md)
- [文件目录管理]()
- [文件权限管理]()
- [磁盘分区以及文件系统]()
- [gzip与xz]()
- [tar打包软件]()
- [备份]()
- [Shell与Shell Script]()
- [Vim编辑器]()
- [学习Shell]()
- [文件与路径](./learn_linux_basic/file_and_path/file_and_path.md)
- [文件权限管理](./learn_linux_basic/file_and_path/manage_file_premissons.md)
- [磁盘分区以及文件系统](./learn_linux_basic/file_and_path/diskpart_and_filesystem.md)
- [在 VMWare Workstation 上创建虚拟磁盘](./learn_linux_basic/file_and_path/diskpart_and_filesystem/create_disk_on_vmware.md)
- [在 VirtualBox 上创建虚拟磁盘](./learn_linux_basic/file_and_path/diskpart_and_filesystem/create_disk_on_vbox.md)
- [tar打包软件](./learn_linux_basic/file_and_path/tar_command.md)
- [gzip与xz](./learn_linux_basic/file_and_path/gzip_and_xz.md)
- [备份](./learn_linux_basic/file_and_path/backup.md)
- [Shell与Shell Script](./learn_linux_basic/shell_and_shell_script/shell_and_shell_script.md)
- [学习Shell](./learn_linux_basic/shell_and_shell_script/learn_shell.md)
- [Job]()
- [Vim编辑器](./learn_linux_basic/shell_and_shell_script/vim_editor.md)
- [Shell Script基本语法]()
- [条件判断语句]()
- [循环]()
@ -55,7 +57,6 @@
- [程序、线程和进程]()
- [什么是程序]()
- [线程和进程]()
- [Job]()
- [进程与线程的管理]()
- [特殊的进程和文件]()
- [SELinux]()
@ -65,5 +66,5 @@
- [SELinux错误的处理]()
- [系统服务的管理]()
- [Systemd与init]()
- [systemctl的使用]()
- [service和target]()
- [systemctl的使用]()

0
src/contributors.md Normal file → Executable file
View File

22
src/conventions.md Normal file → Executable file
View File

@ -1,11 +1,27 @@
# 约定
本文中如有转载文章,均已与原站取得授权,如有疑问请联系 “<rarmicrozip@outlook.com>
本站对一些文章进行了适当的修改和删减,以适合当下的环境。
## 内容
章节之间可能会出现「笔者」的部分类似于配置的信息不一致的问题,这是因为「笔者」不是一个人,而是指代整个贡献这列表中的所有直接编辑过本书的人,所以会出现该问题,敬请谅解。
在本教程中,快捷键使用以下格式表示:
`Ctrl`键使用`^`(如 `^C`)或者`C`表示,`Alt`键使用`M`表示,`Super`(即`Windows`键)使用`S`表示。
它们的排列顺序是这样的:`C-M-S-<Other Key>`。
你可能会看到这种内容:`<Esc>:q!<Enter>`,其中 `<按键名>` 表示按下对应的按键(包括上面的快捷键)。
例如上面的内容,就表示:
1. 按一下键盘上的 `[Esc]`
2. 输入 `:q!`
3. 再按一下 `[Enter]`
## 授权
本文中如有转载文章,均已与原站取得授权,如有疑问请联系 “<rarmicrozip@outlook.com>
且转载文章会在末尾处注明作者与出处。
本站对一些文章进行了适当的修改和删减,以适合当下的环境。
本站原创文章若无特别说明均在 [MIT](./licenses/LICENSE-MIT.md) 与 [Apache2](./licenses/LICENSE-APACHE.md) 的双重许可下发布,转载请遵守相关规定。

0
src/how_to_use_studyenv.md Normal file → Executable file
View File

2
src/intro.md Normal file → Executable file
View File

@ -4,7 +4,7 @@
[![stars](https://img.shields.io/badge/dynamic/json?url=http%3A%2F%2Fgit.hmtsai.cn%2Fapi%2Fv1%2Frepos%2Fstudy-area-cn%2Fstudy-area-cn&query=%24.stars_count&style=for-the-badge&logo=gitea&label=stars&labelColor=%23F0F0F0&color=%231080FF&cacheSeconds=120&link=http%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn&link=http%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn)](https://git.hmtsai.cn/study-area-cn/study-area-cn)
[![forks](https://img.shields.io/badge/dynamic/json?url=http%3A%2F%2Fgit.hmtsai.cn%2Fapi%2Fv1%2Frepos%2Fstudy-area-cn%2Fstudy-area-cn&query=%24.forks_count&style=for-the-badge&logo=git&logoColor=%23303030&label=forks&labelColor=%23F0F0F0&color=%2350B250&cacheSeconds=120&link=http%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn&link=http%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn)](https://git.hmtsai.cn/study-area-cn/study-area-cn)
[![CI](https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.hmtsai.cn%2Fbadgeapi%2Factions%3Furl%3Dhttp%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn%2Factions%26label%3DCI&style=for-the-badge&cacheSeconds=0&labelColor=%23F0F0F0)](https://git.hmtsai.cn/study-area-cn/study-area-cn/actions)
[![CI](https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.study-area.org.cn%2Fbadgeapi%2Factions%3Furl%3Dhttp%3A%2F%2Fgit.hmtsai.cn%2Fstudy-area-cn%2Fstudy-area-cn%2Factions%26label%3DCI&style=for-the-badge&cacheSeconds=0&labelColor=%23F0F0F0)](https://git.hmtsai.cn/study-area-cn/study-area-cn/actions)
## 缘起

0
src/learn_computer_basic/cpu.md Normal file → Executable file
View File

0
src/learn_computer_basic/input_and_output.md Normal file → Executable file
View File

0
src/learn_computer_basic/memory.md Normal file → Executable file
View File

0
src/learn_computer_basic/motherboard.md Normal file → Executable file
View File

0
src/learn_computer_basic/operating_system.md Normal file → Executable file
View File

2
src/learn_computer_basic/storage_device.md Normal file → Executable file
View File

@ -116,7 +116,7 @@
| Linux 兼容性 | 中 _i_| 中 _i_ | 好 | 好 |
| MacOS 兼容性 | 不支持 | 好 | 不支持 | 不支持 |
> _i_: Linux 内核仅支持读取,写入需要使用第三方软件包。但大部分发行版已经自带,不过 Ubuntu 并没有自带 exfat 支持
> _i_: Linux 内核仅支持读取,写入需要使用第三方软件包。但除了 Ubuntu 以外的大部分发行版已经自带 ntfs 和 ExFAT 的驱动
---

0
src/learn_computer_basic/what_is_computer.md Normal file → Executable file
View File

0
src/learn_linux_basic/assets/2.1.1.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

0
src/learn_linux_basic/assets/2.3.1.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 526 KiB

After

Width:  |  Height:  |  Size: 526 KiB

0
src/learn_linux_basic/assets/2.3.2.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

View File

@ -0,0 +1,79 @@
# 备份
## 概念
备份是计算机使用中非常重要的操作。原则上来说,进行任何重大修改(比如更新系统、更新生产环境中的软件。)之前都需要备份。
按照备份的范围来分,常用的备份方式有以下几种:
- 全量备份:指把硬盘等存储介质中的所有文件**一次性完整复制**到其他介质上。
- 增量备份:对上一次备份后的数据后修改的数据进行备份。
- 差异备份:在完整备份之后,修改备份中与当前数据有差别的数据。
- 选择性备份:仅对系统中的一部分进行备份。
按照备份的时间来分,常用的备份方式分为以下两种:
- 计划性备份:比如一周一备份、一天一备份等。
- 操作前备份:在重大操作前备份,以便在操作后出现问题时可以快速回滚,减少损失。
> 有的人可能会说:“我们自己用电脑,备份有什么意义呢?” 2017年勒索病毒WannaCry的肆虐为我们敲响了警钟。这个病毒用AES加密用户电脑上的所有文件以勒索钱财。没有人知道下一个被勒索的究竟是不是自己我们只能通过备份将损失降到最低。
## 备份软件
Linux下常用的备份工具有以下几种
- dd直接克隆整个分区。
- tar将需要备份的文件打包压缩。
- rsync可以进行增量备份、全量备份以及可以将备份传输到远程。
### `dd`命令
> 这个小节的内容,了解即可。
备份整块`sda`硬盘到`sdb`只需要以下命令。
```sh
dd if=/dev/sda of=/dev/sda
```
> 注意这里的sdb物理容量必须大于sda并且sdb上所有的文件都会被覆盖**无法找回!**
### `tar`命令
Linux中可以直接使用`tar`打包需要的文件,比如备份`/etc`
```sh
cd /
sudo tar -zcvf etc_backup.gz etc
```
## `rsync`命令
在之前的章节中,我们创建了一个新的虚拟磁盘。现在,让我们挂载它到`/mnt/backup`进行备份。
> 如果你完成了之前的课后作业那么sdb上应该有唯一的一个xfs分区占满了整个磁盘。如果你已经持久挂载了磁盘本步骤可以跳过。
```sh
sudo mkdir /mnt/backup
sudo mount /dev/sdb1 /mnt/backup
sudo mkdir /mnt/backup/etc
```
现在,我们使用`rsync`命令,将虚拟磁盘中的文件复制到新的虚拟磁盘上。
```sh
sudo rsync -avz /etc /mnt/backup/etc
```
`rsync`命令的参数如下:
- `-a`:递归模式,表示以递归方式传输文件,并保持所有文件属性。
- `-v`:显示详细输出。
- `-z`:压缩传输的数据。
- `/etc`:源文件。
- `/mnt/backup/etc`:目标文件。
`rsync`命令会自动判断源文件和目标文件是否相同,如果相同,则不会进行复制。如果不同,则会复制不同的文件。
> `rsync`命令是一个非常强大的命令,它不仅可以进行文件复制,还可以联网进行文件的同步、文件的删除等操作。如果你需要备份大量的文件,那么`rsync`命令是一个非常好的选择。

View File

@ -0,0 +1,473 @@
# 磁盘分区以及文件系统
我们之前学习了关于硬盘的知识,并且知道了在硬盘上还有着文件系统。那么就让我们来学习在 Linux 上的硬盘分区以及文件系统的知识吧!
> 本章东西较多,请做好心理准备,建议学一部分练一部分,边看边练。
## 基本知识
### 磁盘设备
我们前文提到了 Linux 上的 `/dev` 是大部分设备对应的文件,当然也包括磁盘设备。
> 在 Linux 上,不仅磁盘本身是文件,磁盘的每一个分区也都对应着一个文件。
在 Linux 上常见的磁盘设备有以下几种:
> 在下面的内容中:
>
> - `X`: 表示 `a` - `z` 的小写字母
> - `@`: 表示从 0 开始的自然数
- `/dev/sdX`: 最常见的一种磁盘类型,你通常见到的也是这种,例如 `/dev/sda`
- `/dev/sdX@` 表示这个磁盘的每一个分区。
- `/dev/nvme@n@`: 表示 NVME 上的磁盘,第一个数字表示设备名,第二个是命名空间,通常是 1例如 `/dev/nvme0n1`
- `/dev/nvme@n@p@` 表示这个磁盘的每一个分区。
- `/dev/loop@`: 被称为回环设备,为模拟出来的,通常作为 `img` 等镜像文件的挂载点,可以是一个硬盘也可以仅仅是一个分区,例如 `/dev/loop0`
- `/dev/loop@p@` 表示作为整个磁盘时的每一个分区。
- `/dev/mmblk@`: 为嵌入式的存储,这种比较少见,我们一般不会遇到。
### 文件系统
Linux 兼容大部分的文件系统(前面有提到一个表格):
| 项目 | NTFS | exFat | ext2/3/4 | xfs |
| -------------- | ---- | ----- | -------- | ------- |
| Windows 兼容性 | 好 | 好 | 不支持 | 不支持 |
| Linux 兼容性 | 中 | 中 | 好 | 好 |
| MacOS 兼容性 | 不支持 | 好 | 不支持 | 不支持 |
通常可以被 Linux 用作系统磁盘的文件系统格式的是:
- `ext2/3/4`
扩展日志文件系统,是最常见的系统磁盘的文件系统,也可以用作数据磁盘。现在 ext2/3 已经用的比较少了。
- `xfs`
一种高性能的文件系统,被 RockyLinux 等新的 Linux 发行版用作默认文件系统。
- `btrfs`
新兴的文件系统,自带了快照和压缩等十分方便的功能,不过目前还不太稳定。
还有一些其它的被 Linux 支持的格式:
- `ntfs`
是 Windows 上的默认文件系统,可以使用 `ntfs-3g` 包实现读取和写入。但是在 Linux 下有权限问题,并且不太稳定。
- `exfat/fat32`
比较老的文件系统,在 Linux 上也需要额外的包才可以写入。
还有一些特殊用途的文件系统:
- `swap`
交换分区,不可被用于存储数据,前面提到过。
## 在虚拟机上创建硬盘
我们要学习如何分区,那么就肯定要有一个硬盘。如果你按照上文的方法创建了虚拟机,请按照你使用的虚拟机软件,选择下面的文章完成创建虚拟磁盘的操作,然后再回到本篇继续学习。
1. [在 VirtualBox 上创建虚拟磁盘](./diskpart_and_filesystem/create_disk_on_vbox.md)
2. [在 VMWare Workstation 上创建虚拟磁盘](./diskpart_and_filesystem/create_disk_on_vmware.md)
## 使用命令行工具进行分区
进行分区需要具有 `root` 权限!
分区是一个非常危险的操作!进行操作前最好备份!如果你要调整系统磁盘分区,可以使用一个恢复镜像,例如一个 Linux 的安装磁盘或是 LiveCD。所以最好不要删除你安装系统的ISO文件或者是U盘
> 除了下文的 `parted``fdisk` 等工具,还有 `gdisk`(命令行)、`cfdisk`(命令行,方向键交互)、`gparted` 等工具,本文在此不过多介绍。
>
> `parted``fdisk` 已经被绝大多数 Linux 发行版包含,你通常无需额外安装。但是可能会有少部分发行版缺少其中任何一个软件包。
### parted 和 fdisk 的基本命令格式
> 下面标注有 parted 和 fdisk 的命令,表示这个命令需要在对应工具的命令行模式下执行
#### parted
parted 有两种使用模式,一种是参数模式,一种是命令行模式。这两种模式区别不大,执行的命令都是相同的。下文均以命令行模式(非交互式)下的命令为展示。
```bash
# 参数模式
parted [设备文件] [你要执行的命令]
# 命令行模式
parted [设备文件]
# 然后再输入你的命令,输入完成后和终端一样需要回车
# 可使用 'quit'('q') 命令退出
```
parted 的命令也有两种模式:交互模式和非交互模式。
- 交互模式就是输入一个命令,后面不带任何的参数,然后程序会要求你输入这个命令的每一个参数。
- 非交互模式就是把这个命令的参数都以空格的形式填写在这个命令后,你不需要填写任何内容。
#### fdisk
fdisk 只有一种模式:交互式命令行模式。
fdisk 的使用和 parted 的使用方式几乎差不多,除了命令不同。
fdisk 可以使用 `q` 退出。
注意fdisk 默认不会保存到磁盘,需要执行 `w` 命令才会真正写入磁盘。引用软件的提示: **使用写入命令前请三思**
下面的命令中 `<Enter>` 表示无需输入任何内容直接回车即可。
### 查看所有硬盘
当我们需要进行分区时,我们肯定要知道有哪些硬盘。下面的任意一个指令均可:
- `lsblk`
执行效果: ~~(个人最喜欢用的一种)~~
```text
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 800M 0 part
├─sda2 8:2 0 79.2G 0 part
└─sda3 8:3 0 845M 0 part
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 500M 0 part /boot
├─sdb2 8:18 0 524M 0 part [SWAP]
├─sdb3 8:19 0 60G 0 part /
sdc 8:32 0 238.5G 0 disk
├─sdc1 8:33 0 174.4G 0 part
├─sdc2 8:34 0 32M 0 part
└─sdc3 8:35 0 60G 0 part
sr0 11:0 1 1024M 0 rom
```
最左侧一列是设备名称,第三列是大小,第五列是设备的类型,第六列是挂载点(下面会说到)。
- `fdisk -l`
执行效果:
```text
...
Disk /dev/sdb931.51 GiB1000204886016 字节1953525168 个扇区
磁盘型号WDC WD10EZEX-22M
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理)512 字节 / 4096 字节
I/O 大小(最小/最佳)4096 字节 / 4096 字节
磁盘标签类型gpt
磁盘标识符7690BA4B-E69F-4431-B4E6-XXXXXXXXXXXX
设备 起点 末尾 扇区 大小 类型
/dev/sdb1 2048 1026047 1024000 500M EFI 系统
/dev/sdb2 1026048 2099199 1073152 524M Linux swap
/dev/sdb3 2099200 127928319 125829120 60G Linux 文件系统
/dev/sdb4 127928320 1282436494 1154508175 550.5G Microsoft 基本数据
/dev/sdb5 1282437120 1953523711 671086592 320G Linux 文件系统
...
```
每一个磁盘都会有这么一些内容,第一行有磁盘的设备文件和大小,下面是磁盘的其它信息,可以清晰看到磁盘的每一个分区的大小和类型。
- `df -h`
执行效果:
```text
文件系统 大小 已用 可用 已用% 挂载点
dev 5.7G 0 5.7G 0% /dev
run 5.7G 1.7M 5.7G 1% /run
efivarfs 128K 89K 35K 73% /sys/firmware/efi/efivars
/dev/sdb3 59G 33G 24G 59% /
tmpfs 5.7G 258M 5.5G 5% /dev/shm
...
tmpfs 5.7G 39M 5.7G 1% /tmp
/dev/sdb5 320G 35G 285G 11% /mnt/xdata
/dev/sdb1 499M 174M 326M 35% /boot
/dev/sdb4 551G 90G 461G 17% /mnt/data
```
### 创建分区表
如前面所说,我们刚刚添加了一块硬盘,需要创建一个分区表才能进行分区。创建分区表需要使用 `parted``fdisk` 命令。
parted
```bash
mklabel [gpt/mbr]
```
fdisk
```bash
g # 创建 GPT 分区表
# 或者
o # 创建 MBR 分区表
```
如果没有特殊需求建议选择 GPT 分区表。
### 创建新分区
有了分区表,我们可以开始分区了。
parted
```bash
mkpart primary [文件系统] [起始位置] [结束位置]
```
> 这里的 primary 表示分区类型一般GPT分区表下无需修改。
>
> 文件系统可以是 ext4、ext3、ext2、xfs、fat32、ntfs 等等,也可不填。
>
> 起始位置和结束位置可以写数字,表示扇区数,也可以写单位,如 1G 表示 1GB
> 也可以写百分比,如 100% 表示使用剩余的所有空间
fdisk
```bash
n # 创建新分区
p # 设置为主分区
<Enter>
<Enter> # 起始扇区号,默认会接在上一个分区后面
+[大小] # 分区大小,可以是数字,也可以是单位,如 +1G 表示 1GB
```
### 格式化分区
创建完分区后我们需要对分区进行格式化才能使用。Linux 并不像 Windows 那么贴心,会主动提示你格式化,但是也给了你更多的控制能力。
格式化要使用 `mkfs` 命令,但是格式是:
```bash
mkfs.[文件系统] [设备文件] [更多可选参数]
# 等价于
mkfs -t [文件系统] [设备文件] [更多可选参数]
```
注意文件系统和 mkfs 中间的 **“.”** ,如 `mkfs.ext4`等。
不同文件系统可以使用的参数也有些许不同。下面是一个列表:
- `mkfs.ext4`
- `-L` 可以设置卷标,可以看作磁盘的名字。
- `-N` 可以设置 inode 的大小。inode 可以看作存储文件或目录的基本信息的东西。这个参数就决定了你的最大文件的数量。
- `-F` 强制格式化,不过只有部分版本需要。
- `mkfs.vfat`
> VFat 可以看作是 `fat16`、`fat32` 等数据类型的总和,默认会自动选择格式。
- `-n` 设置卷标
- `-F [版本]` 可以设置格式化的 `fat` 文件系统的版本,如 `16`、`32` 等。
- `mkfs.exfat` 格式化成 `exfat`
- `-n` 设置卷标
- `mkfs.xfs`
- `-L` 设置卷标
- `-f` 强制格式化,会清空原有的分区
- `mkfs.btrfs`
- `-L` 设置卷标
- `-f` 强制格式化
> btrfs 可用的参数很多,许多参数是为 raid(一种可以将多块硬盘模拟成一块的方法) 准备的,这里就不一一列举了。
### 查看分区列表
分区完成后,我们可以使用 `parted``fdisk` 命令查看分区列表。
parted
```bash
print
```
fdisk
```bash
p
```
在这里我们就可以看到每个分区对应的设备文件了,一会我们要用到。
### 删除分区
如果我们不再需要一个分区,或者分区方案有误,我们可以使用 `parted``fdisk` 命令删除分区。
parted
```bash
rm [分区号]
```
fdisk
```bash
d [分区号]
```
这里的分区号可以使用上一条查看分区列表的方式查看,其实就是 `/dev/sdX@``@` 所对应的数字(在其它类型的磁盘中是 `p` 后面的数字)。
### 其它技巧
`parted``fdisk` 还有一些其它的技巧,下面列举了一小部分:
parted
```bash
resizepart [分区号] [起始位置] [结束位置] # 可以修改分区的大小
rescue [起始位置] [结束位置] # 可以查找丢失的分区
```
更多的技巧这里就不一一列举了。
## 挂载分区
创建了分区,我们该如何访问呢?答案就是挂载。
> 事实上Windows 中的C盘、D盘等盘符也是挂载的只不过 Windows 会自动为我们完成。Windows 也同样支持挂载到一个目录。
在下面,我们称挂载的目标路径为“挂载点”。挂载点通常约定俗称使用 `/mnt` 目录下的子目录(挂载整个系统时除外)
### `mount``umount` 命令
Linux 中挂载分区可以使用 `mount` 命令,卸载分区使用 `umount` 命令。
> 事实上,在图形化的文件管理器中,我们可以直接点击磁盘进行挂载(需要输入 root 密码验证身份),右面向下的箭头上面还有条横线的就是卸载按钮。
`mount` 命令的格式如下:
```bash
mount -t [文件系统] [设备文件] [挂载点]
```
> `-t` 参数可以省略Linux 会自动识别文件系统。
>
> `-o [挂载参数]` 可以设置挂载参数,下面会列举出来。
然后我们就可以使用你设置的挂载点访问磁盘了。
可以指定 `--mkdir` 参数,会在挂载的时候自动创建对应的文件夹。
`umount` 命令的格式如下:
```bash
umount [挂载点/设备文件]
```
### 自动挂载
每次开机都要手动挂载分区是一件很麻烦的事情,我们可以使用 `/etc/fstab` 文件让系统自动挂载。
如果你查看这个文件,你会看到以下内容(不同系统默认的内容可能不同):
```text
# Static information about the filesystems.
# See fstab(5) for details.
# <file system> <dir> <type> <options> <dump> <pass>
# /dev/sda3
UUID=25236755-bc8f-4ee4-a733-fc71ed33c408 / ext4 rw,relatime 0 1
# /dev/sda1
UUID=D0EE-69A5 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2
# /dev/sda2
UUID=94a6c32f-c2d2-4401-8749-689b005ac9f0 none swap defaults 0 0
```
每一行代表一个挂载点,每一列代表一个参数。每一列之间应该用 `<tab>` 和一个空格分隔。通常第一条就是你的系统。
整理起来就是这样:
| 分区的UUID | 挂载点 | 文件系统的类型 | 挂载选项 | 是否自动运行 dump | 是否自动运行 fsck |
| :-------- | :------- | :---------- | :------------ | :-------------- | :--------------- |
| UUID=XXXX | / | ext4 | rw,relatime | 0 | 1 |
| UUID=XXXX | /boot | vfat | rw,relatime...| 0 | 2 |
| UUID=XXXX | none | swap | defaults | 0 | 0 |
其中:
- `#` 开头的行是注释
- UUID 可以使用查看分区的方法查看
- 挂载点在处理 swap 的时候需要填 `none`
- 不同文件系统挂载选项不同,使用逗号分隔,以下是常见的选项:
- `defaults` 默认选项
- `ro` 只读模式
- `rw` 读写模式,默认的挂载模式
- `nofail` 忽略挂载时的错误,常用于可移动设备
- dump 是一个自动备份程序,后面会使用 crontab 实现自动备份
- fsck 是一个磁盘健康检查程序,可以自动修复错误,推荐开启,可以填写为 1
> 如果你在更改 fstab 文件的时候出现了问题,系统会卡死,稍等会陷入恢复模式,此时会提示你输入 root 密码,然后便可以使用 nano 或者 vim 命令编辑 fstab 文件,使用 `#` 临时注释掉出现问题的那一行再重启便可以正常进入系统了。
## dd 命令
在 Linux 中,有个非常好用的命令 `dd`,这个命令可以从一个文件或者磁盘复制到另一个文件或者磁盘。
基本用法如下:
```bash
dd if=[输入文件/设备] of=[输出文件/设备]
```
其中 `if``of` 后面可以填硬盘的设备文件,也可以填写一个 .img 文件的路径。`if` 后还可以填写 `/dev/zero`,这是一个特殊的设备文件,表示一直输出 0 (需要指定复制的大小,下面会说)。
> dd 命令默认不显示进度,可以通过添加 `status=progress` 参数显示进度。还可以切换到别的终端,使用 `kill -USR1 [pid]` 命令pid 可以使用 `ps -ef | grep "[你运行dd的具体命令]"` 获取,从左往右第二列就是),此时 dd 命令就会显示一个进度。`kill` 命令后面会讲到。
下面是 `dd` 命令其它常用的参数:
- `bs=[块大小]` 指定每次复制的大小,可使用单位如 `M` 等,常配合 count
- `count=[块个数]` 指定复制多少块,通常可设置 `bs=1M` 然后个数就是以 MB(MiB) 为单位的文件大小
## 回环设备
我们前面提到了像 `/dev/loop0` 这样的设备属于回环设备。
回环设备同样需要 root 才能操作。
回环设备通常指向一个镜像文件(如 img 格式)。要操作回环设备,我们需要使用 `losetup` 命令。
我们可以使用下面的命令查看空闲的loop设备这里其实还不存在对应的设备文件
```bash
losetup -f
```
会返回一个设备名,然后可以使用下面的方法进行关联:
```bash
losetup [设备文件] [你的img文件]
```
然后,我们可以使用上面的 `mount` 挂载回环设备。
要查看挂载的所有设备,可以使用
```bash
losetup -a
```
用完记得卸载(请先 `umount`
```bash
losetup -d [设备文件]
```
## 课后作业
由于这章长且十分重要,所以设置以下作业:
1. 在虚拟机中创建一个虚拟磁盘,大小大于等于系统磁盘
2. 给这个磁盘初始化分区表并且创建一个 xfs 分区,分区大小为整个磁盘的容量。
3. 尝试把这个磁盘挂载到 `/mnt/test`
4. 使用 dd 命令从 `/dev/zero` 读取,写入大小为 20MB 的空文件到 `/mnt/test/hello.img`
5. 卸载这个磁盘
6. 编辑 `/etc/fstab`,持久挂载这个磁盘到 `/mnt/backup` **(以后会用到)** 并重启
7. 使用 `losetup` 挂载刚刚创建的 `/mnt/backup/hello.img` 到一个回环设备
8. 格式化这个回环设备,并且往里写上一些留言
9. 可以把这个制作好的 img 文件发到论坛,让其它小伙伴看看你的成果
10. 你可以选择留下这个文件,也可以删除
---
> study-area-cn

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -0,0 +1,55 @@
# 在 VirtualBox 上创建虚拟磁盘
> 上级目录:[磁盘分区以及文件系统](../diskpart_and_filesystem.md)
按照上篇文件,我们接下来需要创建一个虚拟磁盘。
## 打开虚拟机
首先,打开你的 VirtualBox 并选择你的虚拟机。
![Open VM](./assets/2.2.2.vbox.1.png)
## 配置磁盘
我们打开设置
![Open Settings](./assets/2.2.2.vbox.2.png)
在左边找到 `存储`
![Choose Storage](./assets/2.2.2.vbox.3.png)
选择 `控制器: SATA`,如果你这里看不见这个选项,那么就选择 `xxx.vdi` 那一项所在的那一栏。
![Choose Item SATA](./assets/2.2.2.vbox.4.png)
然后我们点击右面添加磁盘的图标
![Add Disk](./assets/2.2.2.vbox.5.png)
选择创建
![Create Disk](./assets/2.2.2.vbox.6.png)
## 创建磁盘
我们就来到了创建磁盘的界面。
我们点击最下面的 `专家模式`
![Pro Mode](./assets/2.2.2.vbox.7.png)
然后我们设置磁盘大小,为了后面的学习,我们需要设置磁盘的大小 >= 原来的系统磁盘的大小。
![Set Size](./assets/2.2.2.vbox.8.png)
## 完成创建
我们点击 `完成`,然后会来到下面的界面。我们点击 `选择`,再点击一下 `确定`
![Finish Create](./assets/2.2.2.vbox.9.png)
恭喜你,磁盘创建完成!
---
请继续学习接下来的内容:[磁盘分区以及文件系统](../diskpart_and_filesystem.md)
---
> study-area-cn

View File

@ -0,0 +1 @@
# 在 VMWare Workstation 上创建虚拟磁盘

10
src/learn_linux_basic/file_and_path/file_and_path.md Normal file → Executable file
View File

@ -26,13 +26,17 @@
- `/boot` 存放系统启动信息
- `/dev` 大部分设备对应的文件,上文中提到了
- `/proc` 所有的进程信息(Linux 中“一切皆文件”的思想)
- `/lib` 存放所有重要的被软件调用的以来。有时会有`lib64`
- `/proc` 所有的进程信息(*nix 中“一切皆文件”的思想)
- `/lib` 存放所有的静态链接库和动态链接库。有时会有`lib64`
- `/etc` 存放软件配置文件(其实很乱,相当于杂项)
- `/opt` 扩展软件目录,少部分软件会装到这里
- `/tmp` 存放一些临时文件,通常被挂载到了内存
- `/usr` 包含系统核心文件,其中的`bin`目录包含的上述除`cd`外的所有命令,`sbin`也是(仅限 root 的命令),这两个文件夹还被映射到了根目录同名文件夹。
- `/var` 经常变动的一些重要的文件,也包含日志
- `/var` 可变动的文件(variable)
- `/var/mail` (本地邮件信箱)
- `/var/spool/news` (新闻组)
- `/var/run` (程序相关文件)
- `/var/lock` (程序锁相關)
- `/sys` 也是一个重要的设备目录
- `/home` 用户目录,相当于 `C:\Users`MacOS`/Users`

View File

@ -0,0 +1,72 @@
# GZip 与 XZ
上篇文章中,我们介绍了 `tar` 命令,它可以将多个文件打包成一个文件。但是,文件的总体积并没有改变。我们还提到了 `tar` 命令可以调用 `gzip``xz` 进一步压缩这个文件,使其占用更小的磁盘空间。现在我们就来看看 `gzip``xz` 命令本身吧。
> 这两个命令只能压缩单个文件,而不能压缩目录。
## GZip
> gzip是若干种文件压缩程序的简称通常指GNU计划的实现此处的gzip代表GNU zip。也经常用来表示gzip这种文件格式。gzip是一种在Linux系统中常见的命令行压缩工具。它使用DEFLATE压缩算法来减小文件的大小使文件更易于存储和传输。
>
> 事实上在许多软件中包括在你浏览互联网的过程中gzip已经被广泛使用。说不定你现在正在阅读的网页就是gzip压缩过的。
使用 `gzip` 命令压缩的文件的后缀和前面提到的 `.tar.gz` 一样,都是 `.gz` 结尾的压缩文件。
下面是 `gzip` 命令的一些常用选项:
- `-c`:将压缩后的数据输出到终端(但是你看不懂的乱码),而不是覆盖原始文件。通常配合后面会讲到的 `>``|` 使用。
- `-r`:递归压缩目录,包括子目录中的文件。注意:这里的递归是对每一个文件单独压缩,而不是对整个目录压缩成一个文件。
- `-v`:显示压缩或解压缩的详细信息。
- `-d`:解压缩文件。`gunzip` 命令等同于 `gzip -d`
- `-f`:强制压缩或解压缩,会覆盖原有的文件。
- `-k`:不删除原始文件。
- `-1``-9`:表示压缩等级,`-1` 表示最低压缩等级,速度快,`-9` 表示最高压缩等级,压缩率高。默认是 `-6`
> `gzip` 命令默认会删除原始文件,所以使用 `-f` 选项可以强制保留原始文件。
例如,我们可以使用以下命令来压缩一个文件:
```bash
gzip file.txt
```
这将会生成一个名为 `file.txt.gz` 的压缩文件,原始的 `file.txt` 文件将被删除。
要解压缩一个 `gzip` 压缩的文件,可以使用下面的命令:
```bash
gzip -d file.txt.gz
```
> 之前学习的 `tar` 命令的 `-z` 选项就等价于先用 tar 命令打包,再执行一遍 gzip 命令。
## XZ
> xz是一种压缩文件格式采用LZMA SDK压缩目标文件较gzip压缩文件(.gz或)小30%,较.bz2小15%。
>
> 前段时间 XZ 命令被爆出存在后门,差一点就进入了正式的发行版,这次漏洞如果成功会危害到数以万计的 Linux 设备,但成功被开源社区的人发现 ~~还是因为SSH程序启动慢了0.5秒)~~ 这也侧面体现出了XZ应用的广泛与 Linux 社区支持的安全性。
使用 `xz` 命令压缩的文件的后缀和前面提到的 `.tar.xz` 一样,都是 `.xz` 结尾的压缩文件。
`xz` 的基本选项和 `gzip` 基本一致,但是提供了以下几个提高性能的额外选项:
- `-T <线程数>` 可以使用多线程进行压缩,提高压缩速度。
- `-e` 可以使用更多的时间来提高压缩率
例如,我们可以使用以下命令来压缩一个文件:
```bash
xz file.txt
```
这将会生成一个名为 `file.txt.xz` 的压缩文件,原始的 `file.txt` 文件将被删除。
要解压缩一个 `xz` 压缩的文件,可以使用下面的命令:
```bash
xz -d file.txt.xz
```
---
> study-area-cn

View File

@ -0,0 +1,271 @@
# 文件权限管理
## 用户?用户组?
### 多用户操作系统的概念
不同于Windows这种基本上是单用户的操作系统而Linux这种Unix-like系统因为是集成了Unix概念的原因所以是实打实的多用户多任务分时操作系统。
Unix刚发明的时候电脑十分笨重且昂贵一台电脑不可能让一个用户独占必须同时分给多个用户使用。即便是最基本的电脑也能分出32个终端同时使用。这时候完善的用户与权限的管理就是十分必要的了。
Unix-like 系统的用户被组织成了一个类树状结构,看起来就像这样:
```text
All Users
|- root
| |- root
|
|- wheel
|- manager1
|- user1
```
### UID & GID
每个用户都有一个独一无二的编号,称作`UID`。每个用户组也有一个独一无二的编号,称为`GID`。
Unix-like使用UID而不是用户名区分用户如果你试着把两个账户的UID互相调换你会神奇的发现这两个用户的权限和所拥有的文件也被互换了。
UID的各个号段都已经被预先分配好了分配如下- 0 root权限最高的用户 - 1-999 系统服务保留UID下分两种 - 1-200 发行版自带软件所需帐号的UID - 201-999 用户自行创建的或用户所安装软件创建的账户的UID - 1000-60000 普通账户
除了root意外其他账户的权限基本没有区别。
GID基本就是用户组的ID此处不再赘述。
### `/etc/passwd`
所有用户的列表存储在`/etc/passwd`中这个文件在传统的Unix系统中同样存储所有用户的密码但是现在密码的存储已经分到了`/etc/shadow`中,让我们一起来看看这个两个文件的结构吧。
当你通过命令查看`/etc/passwd`的内容时,你应该会看到类似下面的内容:
```text
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
// ...
hmtsai:x:1000:1000:hmtsai:/home/hmtsai:/bin/bash
vboxadd:x:979:1::/var/run/vboxadd:/bin/false
```
> 注:查看文件更推荐使用`cat`命令,而不是各类编辑器,因为有些文件在被写入之后会出一些问题。
这个文件每行分为几个部分,格式如下:
```text
用户名:密码:UID:GID:其他信息:家目录位置:登录Shell
```
密码字段现在有三种可能性:- `x`表示密码在`/etc/shadow`中 - 留空表示密码为空,无需密码即可登录 - `!`表示该账户已经被禁用,无法登录
其他信息默认存储用户名,这个也可以存储其他信息,但是现在很少用到。
登录Shell指的是该账户登录后执行的程序默认为`/bin/bash`
你可能会发现有的用户的登录Shell是`/bin/nologin`或`/bin/false`,这代表这些用户不能登录。
> 你可以在终端里面执行`nologin`,会发现他会提示“该用户无法登录”,而`false`只是简单地返回一个错误返回值。
>
> 有关Shell的知识我们在后面会系统介绍简单来说Shell就是一个让用户交互来执行操作的程序。
### root用户
root顾名思义就是“根”它代表了Unix-like系统中的最高权限他的UID是0因为他是Unix-like系统中的第一个用户。
root有的时候也被称为“超级用户”这更表明了root在Unix-like系统中最高权限的地位。
> 虽然用root进行操作很方便但是我们还是更推荐使用其他的普通用户避免误操作导致系统GG。
## 所有者?同用户组?其他人?
### 所有者
文件的所有者默认是创建文件的人,一般来说也是对文件有最大权限的人。
所有者权限意义在于,你可以把像日记本这种较为隐私的信息设置为仅可自己读写,其他人只有读取的权限,这样就能达到防止篡改的目的。
### 同用户组
同用户组的权限设置在协同工作的时候比较有用,比如共同开发一个项目,我们就可以将这个项目文件夹的文件的权限设置为同用户组可以读写,这样就可以方便共同开发。
### 其他人
字面意思,不再赘述。
但是,由于`root`是系统的最高权限,所以`root`对所有文件都拥有读写的权限。
## 文件管理命令
### `ls`命令
之前对于`ls`只是简单介绍,接下来,我们将要仔细介绍`ls`的各个常用参数。
- `-a`参数a就是all的意思代表输出所有文件包括隐藏文件。
- `-l`参数l是long list的意思即长列表。
输出类似下面这样。
```text
总计 96
drwxr-xr-x 2 hmtsai hmtsai 4096 7月 4日 09:49 公共
drwxr-xr-x 2 hmtsai hmtsai 4096 7月 4日 09:49 模板
drwxr-xr-x 3 hmtsai hmtsai 4096 7月 9日 10:38 视频
drwxr-xr-x 3 hmtsai hmtsai 4096 7月15日 20:03 图片
drwxr-xr-x 4 hmtsai hmtsai 4096 7月10日 13:32 文档
drwxr-xr-x 2 hmtsai hmtsai 4096 7月16日 19:20 下载
drwxr-xr-x 2 hmtsai hmtsai 4096 7月 4日 09:49 音乐
drwxr-xr-x 2 hmtsai hmtsai 4096 7月 4日 09:49 桌面
```
- `-d`参数d表示direoctry表示仅列出目录不列出目录中的文件
### `less`命令
`less`用来分页查看文件内容,它从标准输入流或者指定的文件读入内容,然后分页在屏幕上显示。
> 什么是标准输入流呢?实际上就是`/dev/stdin`这个文件而已,与之对应的有标准输出和标准错误,分别是`/dev/stdout`和`/dev/stderr`.
### `chown`命令
chown命令光看名字就知道他是干什么的ch就是change嘛own自然就是owner所有者嘛。连起来就是修改所有者的意思啦
但是,光知道是干什么的可没有用,要想真正的用起来,还得知道这命令的格式之类的,接下来我们就来介绍一些常用的格式和参数吧!
```text
用法:/usr/bin/chown [选项]... [所有者][:[组]] 文件...
```
也就是如果我想要吧一个名叫`foo`的文件的所有者变为`wheel`组的`hmtsai`,我就得执行下面的命令:
```sh
chown hmtsai:wheel foo
```
如果你不想关心用户组的话,也可以直接执行:
```sh
chown hmtsai foo
```
`chown`这命令还有一些比较有意思的参数:
#### `-R`:递归操作文件或目录
> 首先,在主目录创建一些文件,来让我们继续学习这些命令。
>
> ```sh
> mkdir foo1
> cd foo1
> touch bar1
> mkdir test_chown
> cd test_chown
> touch bar2
> touch bar3
> ```
>
> 接下来,返回家目录:
>
> ```sh
> cd ~
> ```
指定`-R`选项后,将会遍历目录下的每一个文件(包括子目录下的文件),并执行指定的操作。
#### `-v`(`--verbose`)打印出更详细的信息
`-R`选项一般配合`-v`选项使用,毕竟递归操作属于较为危险的操作,最好保留详细的日志信息。
让我们观察一下这些选项会导致的结果,比如把这些文件和目录的所有者从`hmtsai`组的`hmtsai`改为`wheel`组的`hmtsai`用户试试?
```sh
chown -Rv hmtsai:wheel foo1
```
你将看见以下输出信息:
```text
'foo1/bar1' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel
'foo1/test_chown/bar3' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel
'foo1/test_chown/bar2' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel
'foo1/test_chown' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel
'foo1' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel
```
> 与`chown`命令类似的还有`chgrp`命令,不过专门用于修改文件的用户组属性,这里不再赘述,可以通过`chgrp --help`来查看详细的用法。
### `chmod` 命令
`chmod`命令用于修改文件的“模式”(可以直接理解为权限)。主要有两种用法:
1. `chmod [选项]... 模式[,模式]... 文件...`
2. `chmod [选项]... 八进制模式 文件...`
#### 普通模式格式
第一种用法中的“模式”由三个部分组成,如下表:
|操作对象|操作|权限|
|--------|--------|--------|
|u,g,o|+,-|r,w,x|
这里面的u代表user所有者g代表group同用户组o代表others其他人。操作无非就是两种——增加和减少。权限三种读取写入执行。
> 文件的执行很好理解,但是目录的执行权限就比较特殊了,它代表的是“用户进入目录的权限”。但是不能进入目录不代表用户不能访问目录中的文件,用户仍然可以通过完整的路径访问文件就是了。
比如,我想要把`foo1`目录的权限设置为仅文件所有者可以执行、读取和写入,我们可以使用如下命令:
```sh
chmod go-rwx foo1
```
这时候再使用`ls -l`命令查看`foo1`目录的权限就可以看到g,o的所有权限都被取消了
```text
drwx------ 3 hmtsai wheel 4096 7月26日 18:33 foo1
```
接下来让我们考虑一个其他场景——如果我需要为不同的用户类别设置不同的权限怎么办?`chmod`的开发者们也考虑到了这个问题,于是我们可以通过逗号同时设置多个类别用户的权限。
比如,让`foo1`文件夹同用户组可以读写进入,其他人只可读取进入怎么样?
```sh
chmod g+rwx,o+rx foo1
```
再用`ls -l`命令去看,`foo1`目录的权限又变化了:
```text
drwxrwxr-x 3 hmtsai wheel 4096 7月26日 18:33 foo1
```
> 有些眼尖的同学可能会发现,目录的权限前面多了一个`d`,这是代表该权限所对应的是目录的象征,是`direoctry`的简写,很多软件也是这样区分目录和文件的!
#### 八进制模式格式
其实八进制模式也不是很难,只不过每个权限变成了三个数字相加的和,如下表所示:
|r|w|x|
|-|-|-|
|4|2|1|
八进制模式主要用于快速修改模式。比如我想让一个文件的模式变成rwxrwxrwx只需要`chmod 777 file`,而不是`chmod ugo+rwx file`。
> 为什么是421这三个数字呢这是因为他们的组合能够不重不信你试试看。
>
> 还有一个比较有意思的格式叫做“参考模式”,非常简单,格式就是`chmod [选项]... --reference=参考文件 文件...`。~~这个主要在懒得看模式的时候用(划掉)~~。因为比较简单,所以这里不再赘述。
#### 参数
`chmod`的参数与`chown`比较类似,于是在此不再赘述,详情可以通过`chmod --help`了解。
> 几乎所有命令都有一个`--help`参数,可以通过这个参数大概了解这个命令的用法。
## 课后任务
由于这篇的内容比较复杂,于是我们建议您完成以下任务进行练习:
- 将`foo1`文件夹的权限设置为`drwxrwxrwx`,并将完整日志打印到屏幕上。
- 将`test_chown`目录下的所有文件的权限设置为`755`,并且解释`755`在这里的含义,然后给出功能相同的使用字符模式的命令。
- 递归删除`foo1`文件夹,并且打印出`rm`命令每一步的操作。(可以参考`rm`命令的手册或者`rm --help`命令的输出)
---
> study-area-cn

View File

@ -0,0 +1,176 @@
# `tar` 打包软件
在使用Linux的过程中你可能会看见各种各样的压缩包文件比如`tar.gz`(最常见的 tar 压缩包格式)、`tar.bz2`、`tar.xz`、`tar`等等。这些文件都可以使用`tar`命令打包。
> 在linux上也有些常见的图形化压缩包管理器比如 `Ark`,但是它们远不及命令行工具的快速和稳定性。
tar压缩包都有一个显著的特征文件名中都带有一个 `.tar`tgz 等部分格式除外),但是后面的 `.gz` 等等又是什么呢其实tar 本身并不是一个压缩格式,它只是简单的把所有文件和文件夹打包到一起,而后面的 `.gz`、`.bz2`、`.xz` 等等才是压缩的格式。
> 关于其它格式的压缩包,比如`zip`、`rar`等,可以使用其它命令,比如`unzip`、`unrar`等。
绝大部分的linux发行版都预置了这个命令你通常无需额外安装直接使用便可。
## `tar` 命令
`tar`命令用于打包文件和目录,可以将多个文件和目录打包成一个文件,也可以将一个打包文件解压成多个文件和目录。
`tar`命令的基本语法如下:
```bash
tar [选项] [文件或目录]
```
下面是常见的选项:
- `-c`:创建新的压缩文件。
- `-x`:解压文件。
- `-t`:列出压缩文件中的所有文件。
- `-z`使用gzip压缩或解压 `.tar.gz` 格式)。
- `-j`使用bzip2压缩或解压 `.tar.bz2` 格式)。
- `-v`:显示操作的详细信息。
- `-f`:指定压缩包的文件名。
- `-C`:指定解压目录。
上面的内容看不懂也没关系,下面会一一介绍用法。
## 常见用法
### 打包文件为 .tar.gz
```bash
tar -zcvf archive.tar.gz file_or_dir1 [file_or_dir2 ...]
```
上面的命令会将 `file_or_dir1`、`file_or_dir2` 等文件或者目录打包成一个名为 `archive.tar.gz` 的压缩包。
> 在 tar 中,是可以把多个 `-` 选项连用的,例如 `-z``-c` 可以写成 `-zc`(顺序无所谓),但是需要保证像 `-f` 这样带有参数的选项放在最后。除了 tar 命令很多linux的基本命令都可以这么用包括我们之前学习的 cp, ls 等命令。
### 解压 .tar.gz 文件
```bash
tar -zxvf archive.tar.gz
```
上面的命令会将 `archive.tar.gz` 压缩包解压到当前目录。
> 这两个用法应该和是我们平时见得最多的用法了。熟练掌握这几个用法你就可以安装绝大部分的压缩包形式的linux软件了。
## 完整用法
接下来,我们来一起看看 tar 都有什么魔力吧。
> 下面会有一个常见的参数 `-v`,表示显示操作的详细信息。它会列出操作的所有文件。如果不加上这个参数,我们就看不到任何输出。当然,你也可以省略。
首先,我们进行压缩包操作,都要有个压缩包吧,所以下面的所有命令,都要加入 `-f 你的压缩包名字` 这个选项指定操作的压缩包文件。
### 压缩格式
我们前面提到了tar只是个打包的格式并不能压缩。但是tar可以调用其它的压缩工具比如gzip、bzip2、xz等来对打包的文件进行压缩。
下面是一些常用的参数:
- `-z`使用gzip压缩或解压 `.tar.gz` 格式)。
- `-j`使用bzip2压缩或解压 `.tar.bz2` 格式)。
- `-J`使用xz压缩或解压 `.tar.xz` 格式)。
> 若列出文件,可以省略压缩格式,后面会讲到。
### 创建压缩包
要创建压缩包,我们可以使用 `-c` 选项。
例如上文的
```bash
tar -zcvf archive.tar.gz file_or_dir1 [file_or_dir2 ...]
```
就是创建一个名为 `archive.tar.gz` 的压缩包,使用 gzip 压缩格式。
### 列出压缩包中的文件
有了压缩包,我们该怎么验证,或者别人发来了一个压缩文件,我们怎么查看里面的内容呢?
我们可以使用 `-t` 选项。
```bash
tar -ztvf archive.tar.gz
```
上面的命令会列出 `archive.tar.gz` 压缩包中的所有文件。
### 解压压缩包
解压压缩包,我们可以使用 `-x` 选项。
例如上文的
```bash
tar -zxvf archive.tar.gz
```
上面的命令会将 `archive.tar.gz` 压缩包解压到当前目录。
> 值得注意的是,这个操作不会新建一个文件夹。所以在解压之前,建议先看一看压缩包内是否有一层文件夹。尤其是当前目录文件比较多时,容易把文件解压到错误的位置。
### 指定解压目录
如果我们需要改变解压的位置,我们可以使用 `-C` 选项,例如解压到新建的文件夹。
例如上文的
```bash
tar -zxvf archive.tar.gz -C ./archive
```
上面的命令会将 `archive.tar.gz` 压缩包解压到当前目录下的 `archive` 文件夹中。
### 添加文件
如果我们需要向压缩包中添加文件,我们可以使用 `-r` 选项。
例如上文的
```bash
tar -rvf archive.tar.gz file_or_dir1 [file_or_dir2 ...]
```
上面的命令会将 `file_or_dir1`、`file_or_dir2` 等文件或者目录添加到 `archive.tar.gz` 压缩包中。
### 删除文件
如果我们需要从压缩包中删除文件,我们可以使用 `--delete` 选项。
```bash
tar -vf archive.tar.gz --delete file_or_dir
```
上面的命令会从 `archive.tar.gz` 压缩包中删除 `file_or_dir`
### 更新文件
如果我们需要更新压缩包中的文件,我们可以使用 `-u` 选项。这个选项类似于 `-r`,只不过是替换。
```bash
tar -uf archive.tar.gz file_or_dir1 [file_or_dir2 ...]
```
> tar 的用法很多,但是常见的用法也就那么几种。多看,多用,你很快就能掌握。
## 课后作业
tar 是一个非常强大的工具。这个命令使用十分复杂,这里也难以介绍完全。下面的课后作业可以让你基本理解这个命令:
1. 使用前文提到的 `nano` 新建两三个个文件,文件名和内容都随意。
2. 使用 tar 命令以 gzip 格式压缩到一个压缩文件。
3. 把这个文件发给小伙伴,当然也可以发到论坛里。
4. 使用 tar 命令查看并且解压这个压缩包里的文件
5. 使用 cat 命令,看看文件里写的是什么
---
> study-area-cn

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 166 KiB

View File

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 158 KiB

View File

Before

Width:  |  Height:  |  Size: 306 KiB

After

Width:  |  Height:  |  Size: 306 KiB

View File

Before

Width:  |  Height:  |  Size: 306 KiB

After

Width:  |  Height:  |  Size: 306 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 412 KiB

After

Width:  |  Height:  |  Size: 412 KiB

View File

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 119 KiB

View File

Before

Width:  |  Height:  |  Size: 652 KiB

After

Width:  |  Height:  |  Size: 652 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 294 KiB

After

Width:  |  Height:  |  Size: 294 KiB

View File

Before

Width:  |  Height:  |  Size: 312 KiB

After

Width:  |  Height:  |  Size: 312 KiB

View File

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 314 KiB

View File

Before

Width:  |  Height:  |  Size: 262 KiB

After

Width:  |  Height:  |  Size: 262 KiB

View File

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 191 KiB

View File

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 218 KiB

View File

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 97 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 314 KiB

View File

Before

Width:  |  Height:  |  Size: 498 KiB

After

Width:  |  Height:  |  Size: 498 KiB

View File

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

View File

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 137 KiB

View File

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

View File

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

View File

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

View File

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -4,7 +4,7 @@
在进行安装前我们需要去下载一份 Rocky Linux 的镜像,在[Rocky Linux 初见](../rocky_first_met.md)中有说明,此处不再赘述。
## 0x00 下载并安装 VirtualBox
## 下载并安装 VirtualBox
我们要在虚拟机上安装 Linux首先我们得要有个虚拟机软件。本篇文章选择了一个免费并且十分好用的虚拟机——VirtualBox。
@ -30,7 +30,7 @@
然后我们启动 vbox进行下一步安装。
## 0x01 新建虚拟机
## 新建虚拟机
软件我们有了,接下来我们要给虚拟机注入灵魂——操作系统了
@ -98,7 +98,7 @@ CPU数通常只需要填你的CPU核心数的一半就可以了。现在的电
接下来点击`完成`就大功告成啦!
![Finish](./assets/2.4.vbox.8.png)
## 0x02 设置网络
## 设置网络
先不要急性子启动虚拟机,这样启动的虚拟机是没有网络的。
@ -120,7 +120,7 @@ CPU数通常只需要填你的CPU核心数的一半就可以了。现在的电
至此,我们终于可以启动虚拟机了!
## 0x03 启动虚拟机
## 启动虚拟机
然后我们点击绿色的`启动`按钮
![Start VM](./assets/2.4.vbox.13.png)
@ -132,7 +132,7 @@ CPU数通常只需要填你的CPU核心数的一半就可以了。现在的电
接下来请继续阅读[安装 Rocky Linux](./install_rocky_linux.md)进行安装。
## 0x04 安装增强功能
## 安装增强功能
> 注:请安装完系统再进行本段内容

View File

@ -1,56 +1,54 @@
# 在 VMWare Workstation 上安装
> 上级目录:[Rocky Linux 初见](../rocky_first_met.md)
> 上级目录:[Rocky Linux 初见](./install_rocky_linux_intro.md)
在进行安装前我们需要去下载一份 Rocky Linux 的镜像,在[Rocky Linux 初见](../rocky_first_met.md)中有说明,此处不再赘述。
在进行安装前我们需要去下载一份 Rocky Linux 的镜像,在[Rocky Linux 初见](./install_rocky_linux_intro.md)中有说明,此处不再赘述。
## 0x00 下载并安装 VMWare Workstation Pro
## 下载并安装 VMWare Workstation Pro
假设说你要安装 Linux 的话,你需要一个虚拟机软件,本部分将使用 VMWare Workstation Pro,一款十分好的多平台虚拟机软件.
假设说你要安装 Linux 的话,你需要一个虚拟机软件,本部分将使用 VMWare Workstation Pro一款十分优秀的跨平台虚拟机软件。
> 当然,[VirtualBox](install_in_vbox.md)也一样
假如说你已经安装过了,你完全可以跳过这一段。
假如说你已经安装过了,你完全可以跳过这一段.
> 这里可能有朋友问VMWare Workstation Pro不是付费的吗?你这样难道想让我们去用盗版?
>
> 这点不用担心,因为在 VMware 被博通 Broadcom 收购了之后,博通就宣布 VMWare WorkStation Pro 的 17.5.2 版本对个人用户免费&ensp;~~(什么资本家大发慈悲)~~,所以盗版的事情各位大可不必担心。
这里可能有朋友问,VMWare Workstation Pro(下文简称 VMWW)不是付费的吗?你这样难道想让我们去用盗版?
原本你应该去注册一个博通的账号并且去到 Broadcom Support Portal 搞一大堆麻烦事情,但是我相信各位的精力是有限的,所以说这里直接贴出提取到的下载链接`https://softwareupdate.vmware.com/cds/vmw-desktop/ws/17.5.2/23775571/windows/core/VMware-workstation-17.5.2-23775571.exe.tar`
这点不用担心,因为在 VMware 被博通 Broadcom 收购了之后,博通就宣布 VMWW 的 17.5.2 版本对个人用户免费&ensp;~~(什么资本家大发慈悲)~~,所以盗版的事情各位大可不必担心.
在你下载下来之后是一个 tar 文件,如果说你的电脑没有可以解压这种格式的软件,那请你去下载一个名为 7-Zip 的软件 `https://7-zip.org/a/7z2407.exe` 然后安装,记得关联格式。
原本来说,你应该去注册一个博通的账号并且去到 Broadcom Support Portal 搞一大堆麻烦事情,但是我相信各位的精力是有限的,所以说这里直接贴出提取到的下载链接`https://softwareupdate.vmware.com/cds/vmw-desktop/ws/17.5.2/23775571/windows/core/VMware-workstation-17.5.2-23775571.exe.tar`
在您下载下来之后是一个 tar 文件,如果说您的电脑没有可以解压这种格式的软件,那请您去下载一个名为 7-Zip 的软件`https://7-zip.org/a/7z2407.exe`然后安装,记得关联格式.
在解压出来之后,我们就可以运行安装程序,先 Next,同意完协议并 Next 后记得勾选一下`安装键盘驱动`(如下图)
在解压出来之后,我们就可以运行安装程序,先 Next同意完协议并 Next 后记得勾选一下 `安装键盘驱动`(如下图)
![Keybord Driver](./assets/2.4.vmware.1.png)
然后就可以一路 Next 下去了,安装完成后会有一次重启,在重启完毕后,我们该启动 VMWW,进行下一步安装了.
然后就可以一路 Next 下去了,安装完成后会有一次重启,在重启完毕后,我们该启动 VMWare WorkStation Pro进行下一步安装了。
> 假如说这里有朋友发现 VMWW 的页面是英文的,打开 VMWW 的`快捷方式`,在目标后面添加一个" --locale zh_CN"之后重启 VMWW 就好了.
> 假如说这里有朋友发现 VMWare WorkStation Pro 的页面是英文的,打开 VMWare WorkStation Pro 的`快捷方式`,在目标后面添加一个 ` --locale zh_CN`之后重启 VMWare WorkStation Pro 就好了。
## 0x01 新建虚拟机
## 新建虚拟机
很好,现在您已经拥有了一个趁手的工具,那就该干点什么,也就是注入灵魂——操作系统了
软件我们有了,接下来我们要给虚拟机注入灵魂——操作系统了。
不过在开始安装系统前,我们需要新建一个`虚拟机`.
不过在开始安装系统前,我们需要新建一个 `虚拟机`
启动软件后,我们会看到像这样的页面:
启动软件后我们会看到像这样的页面:
![Home Page](./assets/2.4.vmware.2.png)
然后点击 `创建新的虚拟机` ,您会看到这样的界面:
然后点击 `创建新的虚拟机`,你会看到这样的界面:
![New VM Page](./assets/2.4.vmware.3.png)
保持典型不变,点击下一步,点击`安装程序光盘映像文件(iso)(M)`,然后点击游览,找到你镜像下载到的位置,选中镜像,然后打开:
保持典型不变,点击下一步,点击 `安装程序光盘映像文件(iso)(M)`,然后点击浏览,找到你镜像下载到的位置,选中镜像,然后打开:
![Choose ISO Img](./assets/2.4.vmware.3.png)
接着点击下一步,填写`虚拟机的名字`还有`虚拟机的安装位置`(这一步记得选一个剩余空间比较大的分区)
接着点击下一步,填写 `虚拟机的名字` 还有 `虚拟机的安装位置`(这一步记得选一个剩余空间比较大的分区)
![Set VM](./assets/2.4.vmware.5.png)
现在开始设置`虚拟磁盘`,这相当于您电脑的储存空间,这里直接引用隔壁 VBox 安装的话:
现在开始设置 `虚拟磁盘`,这相当于你电脑的储存空间,这里直接引用隔壁 VBox 安装的话:
如果你的磁盘空间足够,那么你开多少都行,一般开 40GB 就够了。
@ -58,7 +56,7 @@
![Set Virtual Disk](./assets/2.4.vmware.6.png)
然后我们就来到了配置设置页面,现在点击`自定义硬件`,还是引用 Vbox 安装的话:
然后我们就来到了配置设置页面,现在点击`自定义硬件`还是引用 Vbox 安装的话:
我们可以根据需要填写`内存大小`和`处理器`(处理器核心数)。如果你还不知道这两个是什么意思,请回看上一大章节。
@ -71,41 +69,39 @@
如果你的电脑内存是 4GB
那么你应该填写 `2048MB`(2GB) 为系统留出足够空间
如果你的电脑内存是 8GB
这时你填写 `6144MB`(6GB) 即可。如果你希望同时在主机干点别的的话,填`4096MB`(4GB) 即可
如果你的电脑内存 > 8GB
这时你填多少都可以,只不过最好各留出最少 4G(4096MB) 的内存
例如笔者的电脑是 12GB(49152MB),那么就可以填写 `8192MB`(8GB)
这时你填写 `4096MB`(6GB) 即可。
一般来说,分配实体机内存的一半即可。
CPU数通常只需要填你的CPU核心数的一半就可以了。现在的电脑至少2核起步。
如果你在使用13代或以上的Intel酷睿那么你填写你的大核心(P核)的数量就行。
(截至本篇编写时Intel最新的酷睿还是13代2024.6)
CPU数通常只需要填你的CPU核心数的一半就可以了。现在的电脑至少 2 核起步。
如果你在使用 13 代或以上的 Intel 酷睿,那么你填写你的大核心(P核)的数量就行。
(截至本篇编写时 Intel 最新的酷睿还是 13 2024.6)
```
对于写者来说,设置完之后的页面如下:
对于写者来说设置完之后的页面如下:
![VM Settings](./assets/2.4.vmware.7.png)
最后关闭设置页面,点击`完成`,虚拟机就大功告成了!(如果你勾选了`创建后启动此虚拟机`那么则会自动启动)
最后关闭设置页面,点击`完成`,虚拟机就大功告成了!(如果你勾选了 `创建后启动此虚拟机` 那么则会自动启动)
## 0x03 启动虚拟机
## 启动虚拟机
假如说您在上一部勾选了`创建后启动此虚拟机`的话,您的虚拟机应该现在已经启动了,但是以防万一,这里还是讲解一下如何在 VMWW 里启动虚拟机:
假如说你在上一部勾选了 `创建后启动此虚拟机` 的话,你的虚拟机应该现在已经启动了,但是以防万一,这里还是讲解一下如何在 VMWare WorkStation Pro 里启动虚拟机:
第一步,选中`虚拟机`:
第一步选中`虚拟机`:
![Select VM](./assets/2.4.vmware.8.png)
第二步,点击`开启此虚拟机`:
第二步点击`开启此虚拟机`:
![Start VM](./assets/2.4.vmware.9.png)
等一会后,会出现一个类似这样的页面,这里直接选中第一项然后回车就可以了:
等一会后,会出现一个类似这样的页面,这里直接选中第一项然后回车就可以了:
![Boot](./assets/2.4.vmware.10.png)
---
接下来请继续阅读[安装 Rocky Linux](./install_rocky_linux.md)进行安装.
接下来请继续阅读[安装 Rocky Linux](./install_rocky_linux.md)进行安装
---

View File

View File

View File

@ -18,14 +18,14 @@
在你的电脑安装 ---------
```
1. 0x00 下载 ISO
2. 0x01 以下三种安装方式任选其一
1. 下载 ISO
2. 以下三种安装方式任选其一
- [在 VMWare WS 上安装](./install_rocky_linux/install_in_vmware.md)
- [在 VirtualBox 安装](./install_rocky_linux/install_in_vbox.md)
- [在你的电脑(实体机)安装](./install_rocky_linux/install_in_your_pc.md)
3. 0x02 [安装 Rocky Linux](./install_rocky_linux/install_rocky_linux.md)
3. [安装 Rocky Linux](./install_rocky_linux/install_rocky_linux.md)
## 下载 ISO

31
src/learn_linux_basic/linux_common_sense.md Normal file → Executable file
View File

@ -4,7 +4,7 @@
其实Linux 的很多逻辑以及文件的组织结构都是与 Windows 大不相同的,接下来,我们就一起了解一下。
> 注意以下操作若无特殊说明输入命令均在终端Terminal下操作可以按下 Ctrl-Alt-T 呼出。
> 注意以下操作若无特殊说明输入命令均在终端Terminal下操作可以按下 C-M-T 呼出。
## Linux 路径的格式
@ -18,8 +18,7 @@ Linux 中,每个文件夹下,都有两个特殊的目录,就是`.`和`..`
2. `..` 代表上一级文件夹,而 `/` 的上级文件夹就是它自己
> 这块似乎有一点不太好懂,我们通过实际的例子解释一下:
假设我们当现在目录`/foo/bar`下,那么`/foo/bar/.`就等同于`/foo/bar``/foo/bar/..`,就等同于`/foo`
> 假设我们当现在目录`/foo/bar`下,那么`/foo/bar/.`就等同于`/foo/bar``/foo/bar/..`,就等同于`/foo`
如果一个路径以`/`开头,那代表这个目录是从根目录开始的,根目录就相当于 Windows 上的 C 盘,是存放系统的位置。
@ -29,7 +28,11 @@ Linux 中,每个文件夹下,都有两个特殊的目录,就是`.`和`..`
> 实际上,`/`只是一块硬盘的挂载点,后面会讲到
## 文件与目录的基本操作
除了这些之外,还有一个路径,是永远指向你的家目录的,这就是`~`。
假设你的用户名是`hmtsai`,那么`~`是等同于`/home/hmtsai`的。
## 基本操作
### `ls` 列出文件
@ -69,6 +72,8 @@ cd <目录>
这样,就会把当前的工作目录切换到指定的目录了。
> 一般情况下,只执行`cd`是和`cd ~`等价的。
### `mkdir` 新建文件夹
我们刚学习使用 Windows 时,除了开机,第一件事应该就是新建文件夹了。
@ -123,6 +128,20 @@ rm -r <你想删除的文件夹>
> 如果你真的想尝试,那么请一定在虚拟机下!搞坏系统作者可不负责!
### `nano`简单的文档编辑器
![Nano 的界面](./assets/2.5.1.png)
`nano`实际上就是被誉为“神之编辑器”的 Emacs 编辑器的极限精简版,所有的基本操作都被标在了界面的下方
```text
^G 帮助 ^O 写入 ^F 搜索 ^K 剪切 ^T 执行命令 ^C 位置 M-U 撤销 M-A 设置标记 M-] 至括号 M-B 上一个
^◂ 向后 ^◂ 前一个字 ^X 离开 ^R 读档 ^\ 替换 ^U 粘贴 ^J 对齐 ^/ 跳行 M-E 重做 M-6 复制
^B 向前搜索 M-F 下一个 ▸ 向前 ^▸ 后一个字
```
> 以后,我们会学习一款使用更广泛的编辑器:`Vim`(被誉为“编辑器之神”)。
### `poweroff`关机
很多同学刚使用 Linux 的时候,最大的问题就是:怎么关机?
@ -136,3 +155,7 @@ sudo poweroff
回车执行之后会提示你输入密码,直接输入就可以了,输入的时候是没有回显的,不用担心,输入完直接回车即可。
> 关于`sudo`是什么意思,这个在以后我们讲解权限的时候会提到,你现在就理解为是用来获取系统的最高权限的意思就 ok 了。
### `man`用户手册
man是 manual手册的意思你可以通过简单地输入 `man <命令>`来使用。

0
src/learn_linux_basic/linux_distro.md Normal file → Executable file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

View File

@ -0,0 +1,179 @@
# 学习 Shell。
## 概念
Shell也称为壳在计算机中指“为用户提供用户界面”的软件通常指的是命令行界面的解析器。一般来说这个词是指操作系统中提供访问内核所提供之服务的程序。Shell也用于泛指所有为用户提供操作界面的程序也就是程序和用户交互的层面。因此与之相对的是内核英语Kernel内核不提供和用户的交互功能。[1]
但是,在 Linux 中,我们通常所讲的 Shell 是指命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序来实现自动化的功能。
Shell 也指代一种命令语言,由这种语言编写的脚本称为 Shell Script。
Shell 命令语言的标准为参考 AT&T 的 ksh 和 GNU 计划的 Bourne Again Shell (bash) 制定的 The Open Group Base Specifications Issue 6 中的 [2.Shell Command Language](https://pubs.opengroup.org/onlinepubs/9690949599/utilities/xcu_chap02.html)。
本章我们将学习 Shell 的基本使用。
## 快捷键
Shell 也有快捷键?是的。大多数 Shell 都支持以下的快捷键:
- `C-C`:终止当前进程。
- `C-Z`:暂停当前进程。
- `C-D`退出当前Shell实际上是发送一个 `EOF` 文件结束字符)。
- `C-L`:清屏。
> 其中 `C-C``C-D` 是十分重要的两个快捷键,十分常用。
在 Bash 中,还有一些特殊的快捷键,它们继承自 GNU Emacs 编辑器,用于快速移动光标以及编辑文本:
- `C-A`:移动光标到行首。
- `C-E`:移动光标到行尾。
- `C-B`:向左移动光标。
- `C-F`:向右移动光标。
- `C-K`:删除从光标位置到行尾的文本。
- `C-U`:删除从光标位置到行首的文本。
- `C-W`:删除光标左侧的单词。
- `C-Y`:粘贴之前删除的文本。
> 这部分只需要了解即可
## 命令
命令分为内部命令和外部命令,内部命令是 Shell 自带的命令,外部命令是 Shell 外部的可执行程序。
一条 Shell 的指令的标准格式为:
```bash
command [options] [arguments]
```
其中,`command` 是命令的名称,`options` 是命令的选项,`arguments` 是命令的参数。
它的格式不一定必须遵守,但是通常遵守这个格式会带来更好的可读性(用什么工具采用什么方式对什么文件做什么)。
但是,有一个例外,就是指定输出,这时,我们推荐將指定输出的选项以及参数放在文件明后面。
例如,`ls` 命令用于列出当前目录下的文件和文件夹,它的选项可以是 `-l`、`-a` 等,参数可以是文件名或目录名。
## 变量
Shell 中的变量分为环境变量和用户变量环境变量是Shell启动时自动设置的变量用户变量是用户自定义的变量。
用户变量可以通过 `export` 命令设置为临时环境变量,例如:
```bash
export GREET="Hello, World!"
```
然后我们在这个 Shell 里启动一个新的 Shell仍然可以在环境中找到这个变量。
```bash
bash -c 'echo $GREET'
```
> `export` 声明的变量只在当前环境下有效,如果你开启了个新的终端或者重启,那么这个环境就无效了
用户变量可以通过 `declare` 命令声明,例如:
```bash
declare USER_GREET="Hello, Shell"
```
变量可以通过 `${}``$` 符号来引用,例如:
```bash
echo ${GREET}
echo $USER_GREET
```
> 当变量的前后有别的内容紧挨着,那么只能使用 `${}`
## 特殊的环境变量
Shell 中有一些特殊的环境变量,它们在 Shell 启动时自动设置,例如:
- `$HOME`:当前用户的主目录。
- `$PATH`:可执行文件的搜索路径。
- `$SHELL`当前Shell的名称。
- `$PWD`:当前工作目录。
- `$USER`:当前用户的用户名。
其中最重要也是最常用的就是 PATH它决定了Shell在执行命令时搜索可执行文件的路径。当我们发现明明安装了某个软件但是找不到可执行文件的时候应该首先检查 PATH 的设置。如果你熟悉 Windows你会发现 Windows 的 PATH 是一串由分号分隔的路径。而 Linux 下的路径使用的是 `:` 冒号分隔。
> 在 Windows 中的 PATH 中有一条路径是 `.` 就是当前目录,而 Linux 中默认是不会搜索当前目录的。如果你在当前目录有一个 `run.sh`,那么你必须要使用 `./run.sh` 才能执行。
## 管道
Shell 中的管道是链接两个命令的方式,管道遵守下面的格式。
```bash
command1 | command2
```
`command1` 的输出将会作为 `command2` 的输入提供,例如:
```bash
ls -a | grep "test"
```
这个命令将会列出当前目录下的所有文件,然后使用 `grep` 命令过滤出文件名包含"test"的文件。
## 输出重定向
Shell 中的重定向是改变命令的输出地点的方式,重定向遵守下面的格式。
```bash
command > file
```
`command` 的输出将会被重定向到 `file` 中,例如:
```bash
ls -a > files.txt
```
这个命令将会列出当前目录下的所有文件,然后使用 `>` 符号将输出重定向到 `files.txt` 中。
## 输入重定向
Shell 中的输入重定向是改变命令的输入地点的方式,输入重定向遵守下面的格式。
```bash
command < file
```
`command` 的输入将会被重定向到 `file` 中,例如:
```bash
cat < files.txt
```
这个命令将会读取 `files.txt` 中的内容,然后使用 `cat` 命令输出到标准输出中。
## 将命令的输出作为参数
让我们想像这个场景:有一个文件有一个文件名列表,我们想要获取这些文件的详细信息,这怎么实现呢?
运算符 `$()` 可以将命令的输出作为参数,它的标准格式如下:
```bash
command1 $(command2)
```
`command2` 的输出将会作为 `command1` 的参数。
实现前文的场景所需的命令如下:
```bash
ls -l $(cat files.txt)
```
这个命令将会读取 `files.txt` 中的文件名列表,然后使用 `ls -l` 命令获取这些文件的详细信息。
## 课后作业
1. 使用 Shell 的输出重定向功能,在主目录中创建一个保存了主目录中所有文件列表的文件,命名为 `files.txt`
2. 使用 `cat` 读取所有文件的内容。
## 参考
- [Shell - 维基百科,自由的百科全书](https://zh.wikipedia.org/wiki/Shell)

View File

@ -0,0 +1 @@
# Shell 与 Shell Script

View File

@ -0,0 +1,198 @@
# Vim 编辑器
> 在 Vim 中所有的键位注意区分大小写,所有大写的命令都需要按下 `Shift` 键,例如 `V` 表示为 `S-v`
不知道你有没有听说过 Bram 发明的 Vim 编辑器,有这么一个梗,就是:
> 如何产生一串随机字符串?答:让新手退出 Vim。
你应该能看出 Vim 的操作是多么“反人类”了吧。事实上,在 Vim 发明的时候,电脑上还没有鼠标,所有的操作只能靠命令完成的(可以想一想 tty。所以Vim 的设计理念就是让用户通过键盘完成所有的操作。
但是,我们如果要通过终端远程管理一台 Linux 服务器,那么必须使用像 Vim 这样的终端编辑器。Vim 的功能比前文的 Nano 强大许多,如果你熟悉了 Vim那么你的速度可能远远超过那些使用其它编辑器的人。
> Vim 的前身是 Vi本文的绝大部分命令同样适用于 Vi。几乎所有的 Linux 发行版都自带 Vi 或是 Vim 其中之一,不用担心是否安装了 Vim。其实 Windows 上也可以安装 Vim。
>
> 如果你在 Vim 中困住了,只需要按下 `<Esc>:q!<Enter>` 就可以退出 Vim 了
## 启动 Vim
Vim 的启动十分简单,只需要在终端输入 `vim` 即可。
```bash
vim [文件名]
```
文件名是可选的。如果文件存在Vim 就会打开这个文件如果文件不存在Vim 就会创建这个文件。
然后你会看到如下界面:
![Vim](./assets/2.3.2.1.png)
## Vim 的使用
首先,我们进入 Vim会发现我们并不能像 Nano 一样直接打字。这是因为 Vim 默认处于“命令模式”,我们需要按下对应的按键可以进入到不同的模式。记住:无论在任何时候,按下 `Esc` 键都可以回到命令模式。
下面是一张 Vim 的键位图:
![Vim Keymap](./assets/2.3.2.2.png)
如果看不懂也没关系,下面我们会讲解其中常用的一些功能。
### Vim 的“模式”
Vim 有一个最基本的东西“模式”在不同模式下快捷键的功能会有所不同。Vim 会在左下角提示你所在的模式。
以下是常见的模式:
- `命令模式` 这个是 Vim 启动所在的模式,以下的所有内容均在这个模式内进行。其它模式均可以使用 `Esc` 退出到命令模式。
- `编辑模式` 使用 `i` 进入,底部会提示 `-- INSERT --`(`-- 插入 --`),在这个模式下,你可以正常编辑文档,和一般的文本编辑器无异。
- `替换模式` 底部会提示 `-- REPLACE --`(`-- 替换 --`),使用 `R` 进入,这个模式与编辑模式差别不大,但是你输入的所有内容都会替换光标后的内容。
- `选择模式` 原名是“可视模式”,使用 `v` 进入,底部会提示 `-- VISUAL --`(`-- 可视 --`),你可以选择一段文本进行操作。
- `选择行模式` 使用 `V` 进入,底部会提示 `-- VISUAL LINE --`(`-- 可视 行 --`),此时所有的选择都变成了整行选择。操作没有任何区别。
- `底部命令行模式` 使用 `:`、`/`、`?` 进入(功能不同),此时整个底部都会变成命令行,以 `:``/` 等字符开头,此时可以输入命令,按下 `Enter` 就可以执行并退出。
### 移动光标
在命令模式下,我们可以使用键盘上的方向键来移动光标。但是,我们也可以使用 Vim 提供的命令来移动光标:
```text
^
k
< h l >
j
v
```
> 当你熟悉了 `hjkl` 的使用后,你会发现使用这几个命令比使用方向键快多了
### 命令行
我们输入 `:` 就可以进入命令行(和上面的底部命令行模式有点区别)了。在 Vim 中,命令行负责了许多复杂的工作。
下面是最常见的命令组合:
- `:w` 保存文件
- `:wq` 保存并退出 Vim
- `:q!` 强制退出 Vim文件未保存的情况下
> `!` 接在命令后表示强制执行一个命令
>
> 另外,在 `w` 命令后面可以接上文件保存的路径,实现另存为的功能,例如 `:w 1.txt`
其中命令行模式的其它功能我们在下面还会讲到。
### 删除与剪切
假如有一大段文字,在 Vim 中又不能像图形化一样鼠标一拖一删,那么如何快速删除呢?
在 Vim 中,我们可以单独使用 `x``d` 命令,也可以在“可视模式”(待会会讲到)下编辑。
`x` 命令可以删除光标所指的当前字符,而 `d` 命令的功能就比较复杂了。`d` 命令是一个“多字符命令”,需要在 `d` 后面输入其它的东西搭配使用。
> `d` 命令实际上是剪切,后面会说如何粘贴
下面是一些例子(均包括开头的 `d`
- `dd` 删除整行
- `dw` 删除当前单词(以空格分割)
- `d0` 删除这行从光标的位置到最前
- `d$` 删除这行从光标的位置到最后
> 在 Vim 中,很多命令例如 `x`、`d` 和后文的 `y`、`G`、`gg` 等前面都可以加一个数字,表示重复这个命令多少次,例如 `5dd` 就是删除5行包括 `hjkl` 也可以。
### 复制
前面我们说到了 `d` 的本质是剪切,那么我们如何复制呢?`y` 命令便可以复制。
> 注意Vim 的剪贴板是独立的,和系统使用的不同
`y` 命令和 `d` 命令的用法如出一辙,例如 `yy` 就是复制整行,`yw` 就是复制单词。
### 粘贴
`p` 命令代表 `parse`,就是粘贴。可以粘贴使用 `y` 复制或者 `d` 剪切的内容。
### 跳转
如果我们想要快速在文件中跳转,那么`gg` 命令和 `G` 命令是不可或缺的。
`gg` 命令可以让你快速来到文件的开头,而 `G` 命令单独使用可以来到文件尾部,
这个两个命令前面加上数字,就可以快速跳转到指定的行(`G` 命令也是从头开始数的)。
使用也非常简单,按一下就可以,前面也可以加数字。
另外,可以使用 `0` 跳转到行首和 `$` 跳转到行尾。
`d``y` 命令后面也可以接 `gg`、`G`、`0`、`$` 命令,效果就是从指定的位置选择到当前光标所在处。
### 重复上一个命令
这个命令是 `.`,没错,就是点。可以重复你的上一个命令。
### 选择模式(可视模式)
可视模式,这个名字其实有点误导人。事实上,这个模式就是选择一段文字。(事实上你如果在终端中直接使用鼠标进入的就是这个模式)
下面是在可视模式中的操作:
- 使用 `hjkl` 移动(当然方向键也可以)
- `y` 复制
- `d` 剪切
- `x` 删除
- `p` 覆盖粘贴
- `gg`、`G`、`0`、`$` 移动光标
### 查找内容
在 Vim 中,我们可以使用 `/` 进行查找,输入 `/` 然后再输入关键词。
在查找过程中,我们可以使用 `n` 查找下一个,`N` 查找上一个。
### 小技巧:使用 `:!` 快速调试 Shell 脚本
在使用 Vim 的过程中,假如我们需要调试一个 Shell那么我们就需要退出 Vim启动脚本再打开 Vim十分的麻烦。不过 Vim 提供了一个命令 `:!` 来让我们快速运行一行命令。
```text
:! [要执行的命令]
```
然后我们会跳出 Vim并看到这个命令的执行结果。如果想要回到 Vim只需要在程序结束后敲一下 `<Enter>` 便可以回到 Vim 了。
另外,我们可以单独使用 `:!` 查看执行的历史记录。
## Vim 的配置
在 Vim 中,我们可以使用 `:set (no)[配置名]` 去开关某些配置。
对于有参数的配置,可以使用 `:set [配置名]=[值]`
下面是一些常用配置:
```text
:set number "启用行号
:set autoindent "自动缩进
:set autoread "如果文件有更改自动更新文件
:set wrap "自动折行
:set encoding=utf-8 "设置显示格式,文件显示乱码可尝试调整
:set fileencoding=utf-8 "设置写入格式
:set hlsearch "高亮搜索结果
```
这些配置都是临时启用,如果每次启动时都要手动配置,属实有点麻烦。那么该怎么办呢?我们可以将配置文件写入 `~/.vimrc` 文件实现永久配置。(注意所有配置不要带冒号)
> 其实 Vim 的功能远不止如此,感兴趣的可自行了解 VimScript 相关内容。
## 课后作业
Vim 的功能十分强大,并且在维护时十分常用。下面的练习可以帮你更好掌握 Vim
> 试试看在下面的过程中,全程不使用方向键吧!
1. 使用 `touch` 新建一份 `.sh` 文件,文件名随意
2. 使用 Vim 编辑这个文件,使用 `echo` 输出一个 `helloworld`
3. 保存这个文件
4. 使用 `:!` 运行这个文件
5. 退出 Vim
6. 使用 Vim 定制你的 `~/.vimrc` 配置文件
7. 你也可以将这个配置文件发到论坛上与小伙伴交流

0
src/learn_linux_basic/the_history_of_linux.md Normal file → Executable file
View File

0
src/learn_linux_basic/the_linux_learning_path.md Normal file → Executable file
View File

Some files were not shown because too many files have changed in this diff Show More