├── .gitignore ├── README.rst └── docs ├── Chapter01 ├── 00_alias.rst ├── 00_bc.rst ├── 00_bzip2.rst ├── 00_cat.rst ├── 00_cd.rst ├── 00_chgrp.rst ├── 00_chmod.rst ├── 00_chown.rst ├── 00_cp.rst ├── 00_dd.rst ├── 00_df.rst ├── 00_du.rst ├── 00_env.rst ├── 00_file.rst ├── 00_free.rst ├── 00_head.rst ├── 00_history.rst ├── 00_id.rst ├── 00_jobs.rst ├── 00_kill.rst ├── 00_less.rst ├── 00_ln.rst ├── 00_loginctl.rst ├── 00_ls.rst ├── 00_lsblk.rst ├── 00_man.rst ├── 00_mkdir.rst ├── 00_mv.rst ├── 00_ps.rst ├── 00_pwd.rst ├── 00_rm.rst ├── 00_scp.rst ├── 00_ssh-keygen.rst ├── 00_systemctl.rst ├── 00_tail.rst ├── 00_tar.rst ├── 00_tee.rst ├── 00_top.rst ├── 00_touch.rst ├── 00_type.rst ├── 00_unzip.rst ├── 00_wc.rst ├── 00_wget.rst ├── 00_whereis.rst ├── 00_zip.rst ├── aptitude.rst ├── fdisk.rst ├── hardware.rst └── ip.rst ├── Chapter02 ├── 00_centos.network.rst ├── 00_fstab.rst ├── 00_ifcfg.rst ├── 00_openssh.rst ├── 00_sources.centos.rst ├── 11_shell.ps1.rst ├── 32_wpa.supplicant.rst ├── 46_xdg.user.dirs.rst ├── 47_tty.font.rst ├── 50_login.manager.rst ├── 53_desktop.rst ├── 60_systemd.rst ├── 60_systemdCron.rst ├── 60_systemdMount.rst ├── 60_systemdUnit.rst ├── 90_vsftpd.rst └── 98_vnc.rst ├── Chapter03 ├── 00_compress.rst ├── 00_file.rst ├── 00_inode.rst ├── 00_link.rst ├── 00_locale.rst ├── 00_permission.rst ├── 00_port.rst ├── 00_uuid.rst └── 40_console.rst ├── Chapter04 ├── 00_ffmpeg.basic.rst ├── 30_unix.abbreviation.rst ├── 50_git.basic.rst ├── 55_github.clone.rst ├── 56_gitftp.rst ├── 57_git.server.rst ├── 60_i3wm.rst ├── 66_code.font.rst ├── 70_firefox.size.rst ├── 70_gnome.solarized.rst ├── 70_ventoy.rst ├── 99_h3c.rst ├── 99_raspberryPi.rst └── 99_transmission-daemon.rst ├── Chapter05 ├── 00_basic.rst ├── 00_metacharacter.rst ├── 00_shortcuts.rst ├── 09_init.rst ├── 10_grammar.rst └── 40_example.rst ├── Chapter06 ├── 00_debian.firmware.rst ├── backtty.rst ├── backup.rst ├── commandNotFound.rst ├── gitHubWeb.rst ├── hidden.file.rst ├── softwareSource.rst ├── sshBackstage.rst ├── wordless.terminal.rst └── xfce4i3.rst ├── Chapter07 ├── dhcpd.rst ├── images │ └── 001.jpg ├── shell 内部命令 │ └── 波恩 shell.rst └── tcpWrappers.rst ├── Images ├── console.01.jpg ├── console.02.jpg ├── console.03.jpg ├── console.04.jpg ├── desktop.01.png ├── desktop.02.png ├── desktop.03.png ├── desktop.04.png ├── desktop.05.png ├── desktop.06.png ├── desktop.07.png ├── desktop.08.png ├── desktop.09.png ├── fdisk.01.jpeg ├── fontStyle.01.png ├── fontStyle.02.png ├── fontStyle.03.png ├── fontStyle.04.png ├── fontStyle.05.png ├── fontStyle.06.png ├── fontStyle.07.png ├── git.01.jpg ├── locale.01.jpg ├── locale.02.jpg ├── permission.01.jpg ├── ventoy.01.png ├── vnc.01.png ├── vnc.02.png ├── vnc.03.png ├── vnc.04.png ├── vnc.05.png └── vnc.06.png ├── TOC ├── Chapter01.rst ├── Chapter02.rst ├── Chapter03.rst ├── Chapter04.rst ├── Chapter05.rst ├── Chapter06.rst └── Chapter07.rst ├── index.rst └── preface.rst /.gitignore: -------------------------------------------------------------------------------- 1 | source/ 2 | build/ 3 | .idea/ 4 | *.pyc 5 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | 记录 Linux 的点滴 2 | #################################### 3 | 4 | 2012 年被同事带入了 Linux 的世界,在此之前我只知道有 Microsoft Windows 和 Mac OS,当时只接触过 Windows。第一次接触 Linux 是从 U 盘中启动的 Fedora,印象最深的就是关机的时候必须按住 Alt 键才会出现关机键,关机速度特别的快。 5 | 6 | 就此打开了另外的一扇门,从《鸟哥的 Linux 私房菜》开始自学,Fedora、Ubuntu、CentOS、Debian、Arch ... 7 | 8 | 这么多年过去了,折腾的挺多,记住的没多少,所以决定记下自己折腾的脚步,权当留个纪念。 9 | 10 | 大部分内容整理于网络,如有侵权请联系我删除! 11 | 12 | 13 | 目录 14 | ************************************ 15 | 16 | * 前言 17 | 18 | * 第一章:基本命令(command) 19 | * find 搜索文件 ✖ 20 | * 修改权限 ✖ 21 | * crontab 定时任务 ✖ 22 | * 添加用户、用户组 ✖ 23 | * mount、umount ✖ 24 | * kill 25 | 26 | * 第二章:配置文件(config) 27 | * 开机启动脚本 ✖ 28 | * yum源 ✚ 29 | * 基本格式 ✖ 30 | * 网络连接守护进程 ✖ 31 | 32 | * 第三章:概念释义(definition) 33 | * 权限 ✖ 34 | * 挂载 ✖ 35 | * 系统启动流程 ✖ 36 | * 软件的包管理 ✖ 37 | * 进程、守护进程、初始化进程、独立启动进程、超级守护进程 ✖ 38 | 39 | * 第四章:其它(other) 40 | * 数字签名 ✖ 41 | * 无线连接 ✚ 42 | 43 | * 第五章:shell 实用脚本(shell) 44 | * shell 脚本之始 45 | * bash 快捷键 ❤ 46 | 47 | * 常见错误及解决方法(faq) 48 | * 查看硬件信息 ✚ 49 | 50 | * 待处理(pend) 51 | 52 | 53 | ------ 54 | 55 | **图例:** 56 | 57 | ❤ :已完成 58 | 59 | ✚ :未完成 60 | 61 | ✖ :待添加 62 | 63 | -------------------------------------------------------------------------------- /docs/Chapter01/00_alias.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_alias: 2 | 3 | alias 命令别名 4 | #################################### 5 | 6 | alias 命令用于查看和创建命令别名,别名允许用户只输入一个单词就运行任意一个命令或一组命令。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | alias [name]=[command ...] 17 | 18 | 举个例子,为常用的 clear(清除屏幕)命令创建一个别名 c: 19 | 20 | :: 21 | 22 | # 设置别名 23 | [Linux]$ alias c='clear' 24 | 25 | #查看别名 26 | [Linux]$ alias c 27 | alias c='clear' 28 | 29 | 30 | .. attention:: 31 | 32 | 在指定别名时,等号( ``=`` )两边不可以有空格。 33 | 34 | 35 | 让别名永久生效 36 | ************************************ 37 | 38 | 在命令行中设置别名后,只在当前登录会话中有效。如果退出或重启系统后,别名就会消失。 39 | 如果想让别名永久生效需要将别名定义写入配置文件 ``~/.bashrc`` 中: 40 | 41 | :: 42 | 43 | [Linux]$ vi ~/.bashrc 44 | 45 | # 添加下面内容让别名永久有效 46 | alias c='clear' 47 | 48 | 49 | 系统级(对所有用户生效)的别名可以放在 ``/etc/bashrc`` 文件中。 50 | 51 | 52 | 禁用别名 53 | ************************************ 54 | 55 | unalias 命令用于删除当前终端的别名,写入配置文件的别名只在当前终端中被删除。它只有一个 ``-a`` 选项用于删除所有别名。 56 | 57 | :: 58 | 59 | # 删除 c 别名 60 | [Linux]$ unalias c 61 | 62 | # 删除所有别名 63 | [Linux]$ unalias -a 64 | 65 | 除了使用 unalias 删除别名之外,还有一些临时性地禁用别名的方法: 66 | 67 | :: 68 | 69 | # 在命令前边加入转义符: 70 | [Linux]$ \ls 71 | 72 | # 使用命令的绝对路径: 73 | [Linux]$ /usr/bin/ls 74 | 75 | # 或者对命令加上引用: 76 | [Linux]$ "ls" 77 | [Linux]$ 'ls' 78 | 79 | # 使用 command 命令 80 | [Linux]$ command ls 81 | 82 | 83 | 系统中常用的别名 84 | ************************************ 85 | 86 | :: 87 | 88 | # 使用颜色输出 ls 的内容,许多发行版默认设置 89 | alias ls='ls --color=auto' 90 | 91 | # 使用颜色输出 grep 查找到的内容 92 | alias grep='grep --color=auto' 93 | alias egrep='egrep --color=auto' 94 | alias fgrep='fgrep --color=auto' 95 | 96 | # 对其输出 mount 的内容 97 | alias mount='mount | column -t' 98 | 99 | # 默认添加 ping 的次数 100 | alias ping='ping -c 5' 101 | 102 | # 删除文件时需要确认 103 | alias rm='rm -i' 104 | 105 | # 更新 Debian 系统中的软件 106 | alias update='sudo apt-get update && sudo apt-get upgrade' 107 | 108 | # wget 默认断点续传 109 | alias wget='wget -c' 110 | -------------------------------------------------------------------------------- /docs/Chapter01/00_bc.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_bc: 2 | 3 | bc 数学计算器 4 | #################################### 5 | 6 | bc 是一个任意精度的计算器语言(可以说是一种编程语言),它支持变量、数组、输入输出、分支结构、循环结构、函数等基本的编程元素。在 Linux 下通常当计算器使用。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | bc [ -hlwsqv ] [long-options] [ file ... ] 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -i, --interactive 25 | 强制进入交互模式 26 | -l, --mathlib 27 | 使用标准数学库 28 | -q, --quiet 29 | 不显示欢迎信息 30 | 31 | 32 | 使用实例: 33 | ************************************ 34 | 35 | 在使用计算器之前,首先需要了解 bc 中的基本运算符。 36 | 37 | ========== ========= 38 | 运算符 含义 39 | ========== ========= 40 | \+ 加法 41 | \- 减法 42 | \* 乘法 43 | \/ 除法 44 | \% 取余 45 | \^ 平方 46 | sqrt(x) 平方根 47 | ========== ========= 48 | 49 | 输入 bc 命令后会进入交互模式,但是默认情况下 bc 的计算精度是 0。所以平常使用时建议加上 ``-l`` 选项。 50 | 51 | :: 52 | 53 | # 默认情况下计算精度为 0 54 | [Linux]$ bc 55 | bc 1.07.1 56 | Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free 57 | Software Foundation, Inc. 58 | This is free software with ABSOLUTELY NO WARRANTY. 59 | For details type `warranty'. 60 | 10/4 61 | 2 62 | 10/3 63 | 3 64 | 65 | 66 | # -l 选项计算精度为 20 67 | [Linux]$ bc -l 68 | bc 1.07.1 69 | Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free 70 | Software Foundation, Inc. 71 | This is free software with ABSOLUTELY NO WARRANTY. 72 | For details type `warranty'. 73 | 10/4 74 | 2.50000000000000000000 75 | 10/3 76 | 3.33333333333333333333 77 | 78 | 79 | # 借助管道或输入重定向在单行中计算 80 | [Linux]$ echo '10/3' | bc -l 81 | 3.33333333333333333333 82 | 83 | [Linux]$ bc -l <<< '10/3' 84 | 3.33333333333333333333 85 | 86 | 87 | .. hint:: 88 | 89 | 由于 bc 是交互式的程序(类似于 vi),所以退出 bc 时需要输入 ``quit`` 或者 ```` 90 | 91 | 92 | 高级用法 93 | ************************************ 94 | 95 | bc 有四个内置的环境变量,在进行高级计算时会经常用到: 96 | 97 | =============== =============== 98 | 变量名 作 用 99 | =============== =============== 100 | scale 指定计算精度(即小数点后的位数),默认为 0 101 | ibase 指定输入数字的进制(2~16),默认为十进制 102 | obase 指定输出数字的进制(2~16),默认为十进制 103 | last 或 . 表示最近打印的数字 104 | =============== =============== 105 | 106 | :: 107 | 108 | # 修改计算精度 109 | [Linux]$ bc -q 110 | scale 111 | 0 112 | 10/3 113 | 3 114 | scale=3 115 | 10/3 116 | 3.333 117 | 118 | 119 | # 修改输出数字的进制 120 | [Linux]$ bc -q 121 | obase=16 122 | 10+3 123 | D 124 | 10+10 125 | 14 126 | # 可以进行简单的进制转换 127 | 255 128 | FF 129 | 130 | 131 | # 修改输入数字的进制,字母一定要大写 132 | [Linux]$ bc -q 133 | ibase=16 134 | A+B 135 | 21 136 | a+b 137 | 0 138 | 139 | 140 | .. attention:: 141 | 142 | 一旦设置了 obase 的值,所有的输出都会按设置的进制显示,这时显示的值可能会让人产生误解。如: 143 | 144 | :: 145 | 146 | obase=10 147 | obase 148 | 10 149 | obase=16 150 | obase 151 | 10 152 | 153 | 开始十进制中 10 的值为十,而设置成十六进制后,10 的值就是十六了,虽然显示的都是 10。尤其时在设置不同的 ibase 值后,计算会更让人误解,这时可以用命令 ``obase=A; ibase=A`` 重新把输入输出设置成十进制。在任何进制下,A 都等于十进制中的 10。 154 | 155 | 需要同时设置输入输出进制时,obase 要尽量放在 ibase 前面,因为 ibase 设置后,后面的数字都是以 ibase 的进制来换算的。 156 | 157 | 158 | bc 中支持变量,26 个小写字母 a-z 都是变量,而且都赋值为 0,所以上边计算中 a+b=0。和其它编程语言一样,使用 ``=`` 为变量赋值。 159 | 160 | :: 161 | 162 | [Linux]$ bc -q 163 | n=3 164 | (1+n)*2 165 | 8 166 | ++n 167 | 4 168 | 169 | one=1 170 | one+5 171 | 6 172 | 173 | 174 | 除了内置变量,bc 还有一些内置函数,在需要使用内置函数时,必须以 ``-l`` 选项启动程序。 175 | 176 | =============== =============== 177 | 函数名 作用 178 | =============== =============== 179 | s(x) 计算 x 的正弦值,x 是弧度值。 180 | c(x) 计算 x 的余弦值,x 是弧度值。 181 | a(x) 计算 x 的反正切值,返回弧度值。 182 | l(x) 计算 x 的自然对数。 183 | e(x) 计算 e 的 x 次方。 184 | j(n, x) 贝塞尔函数,计算从 n 到 x 的阶数。 185 | =============== =============== 186 | -------------------------------------------------------------------------------- /docs/Chapter01/00_bzip2.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_bzip2: 2 | 3 | bzip2 压缩文件 4 | #################################### 5 | 6 | bzip2 用于压缩文件,文件经压缩后以 ``.bz2`` 的扩展名结尾。bzip2 只能针对一个文件进行压缩,当要压缩多个文件时,需要将文件 :ref:`tar 归档 ` 。 7 | 8 | bunzip2 命令用来解压 bz2 文件,事实上 bunzip2 就是 bzip2 的硬连接( ``bzip2 –d`` 等价于 ``bunzip2`` ),命令选项基本相同。 9 | 10 | 11 | 命令格式: 12 | ************************************ 13 | 14 | .. highlight:: none 15 | 16 | :: 17 | 18 | bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ] 19 | bzip2 [ -h|--help ] 20 | bunzip2 [ -fkvsVL ] [ filenames ... ] 21 | bunzip2 [ -h|--help ] 22 | 23 | 24 | 常用选项: 25 | ************************************ 26 | 27 | :: 28 | 29 | -c --stdout 30 | 将压缩或解压的数据传至标准输出 31 | 32 | -d --decompress 33 | 解压压缩包 34 | 35 | -z --compress 36 | -d 选项的补充(强制执行压缩) 37 | 38 | -t --test 39 | 检验压缩包 40 | 41 | -f --force 42 | 压缩或解压时,强制覆盖同名文件(默认不覆盖已存在的文件) 43 | 44 | -k --keep 45 | 在压缩或解压缩时保留源文件(不删除 .bz2 文件) 46 | 47 | -q --quiet 48 | 只显示重要的警告信息 49 | 50 | -v --verbose 51 | 显示详细的执行过程 52 | 53 | 54 | 使用实例: 55 | ************************************ 56 | 57 | :: 58 | 59 | # 压缩文件,默认会删除源文件 60 | [Linux]$ bzip2 test.tar 61 | [Linux]$ ls 62 | test.tar.bz2 63 | 64 | # 压缩文件并保留源文件 65 | [Linux]$ bzip2 -k test.tar 66 | [Linux]$ ls 67 | test.tar test.tar.bz2 68 | 69 | # 解压压缩包,解压后的文件是 tar 归档文件 70 | [Linux]$ bzip2 -d test.tar.bz2 71 | 72 | # 直接解压出压缩包内的文件 73 | [Linux]$ tar -jxvf test.tar.bz2 74 | 75 | # 压缩多个文件 76 | [Linux]$ tar -jcvf text.tar.bz2 /etc/ /opt/ 77 | -------------------------------------------------------------------------------- /docs/Chapter01/00_cat.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_cat: 2 | 3 | cat 查看和连接文件内容 4 | #################################### 5 | 6 | cat 命令用于连接文件并打印到标准输出设备上。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | cat [OPTION]... [FILE]... 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -b, --number-nonblank 25 | 和 -n 相似,只不过对于空白行不编号。 26 | 27 | -n, --number 28 | 由 1 开始对所有输出的行数编号 29 | 30 | -s, --squeeze-blank 31 | 当遇到有连续两行以上的空白行,就代换为一行的空白行 32 | 33 | 34 | 使用实例: 35 | ************************************ 36 | 37 | :: 38 | 39 | [Linux]$ cat a.sh 40 | #! /usr/bin/bash 41 | echo "Hello world !" 42 | 43 | 44 | [Linux]$ cat a.sh b.sh 45 | #! /usr/bin/bash 46 | echo "Hello world !" 47 | #! /usr/bin/bash 48 | name="Linus Benedict Torvalds" 49 | echo $name 50 | 51 | 52 | [Linux]$ cat -n a.sh b.sh 53 | 1 #! /usr/bin/bash 54 | 2 echo "Hello world !" 55 | 3 #! /usr/bin/bash 56 | 4 name="Linus Benedict Torvalds" 57 | 5 echo $name 58 | 59 | # 利用重定向功能,另存为拼接文件 60 | [Linux]$ cat -n a.sh b.sh > all.sh 61 | -------------------------------------------------------------------------------- /docs/Chapter01/00_cd.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_cd: 2 | 3 | cd 切换目录 4 | #################################### 5 | 6 | cd 命令是 Linux 中最常用的命令之一,它用于切换目录。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | cd [directory] 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -L 25 | 如果目标目录是一个符号连接,直接切换到符号连接目录(默认值) 26 | 27 | -P 28 | 如果目标目录是一个符号连接,直接切换到符号连接指向的目标目录 29 | 30 | 31 | 使用实例: 32 | ************************************ 33 | 34 | :: 35 | 36 | # 切换到主目录 37 | [Linux]$ cd 38 | [Linux]$ pwd 39 | /root 40 | [root@localhost /]# cd ~ 41 | [Linux]$ pwd 42 | /root 43 | [root@localhost /]# cd ~xiao 44 | [root@localhost xiao]# pwd 45 | /home/xiao 46 | 47 | # 切换到根目录 48 | [Linux]$ cd / 49 | [root@localhost /]# pwd 50 | / 51 | 52 | # 切换到 /etc 目录 53 | [Linux]$ cd /etc/ 54 | [root@localhost etc]# pwd 55 | /etc 56 | 57 | # 快速切换到上一个工作目录 58 | [root@localhost etc]# cd - 59 | /root 60 | [Linux]$ pwd 61 | /root 62 | 63 | # 切换到根目录 64 | [Linux]$ cd / 65 | [Linux]$ ls -l 66 | total 20 67 | lrwxrwxrwx. 1 root root 7 Mar 27 2018 bin -> usr/bin 68 | ... 69 | 70 | # 切换到符号连接指向的目标目录 71 | [Linux]$ cd -P lib 72 | [Linux]$ pwd 73 | /usr/lib 74 | 75 | # 切换到符号连接目录(默认值) 76 | [Linux]$ cd / 77 | [Linux]$ cd -L lib 78 | [Linux]$ pwd 79 | /lib 80 | -------------------------------------------------------------------------------- /docs/Chapter01/00_chgrp.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_chgrp: 2 | 3 | chgrp 改变文件所属组 4 | #################################### 5 | 6 | chgrp 命令用于改变文件或目录的所属组,它允许普通用户改变文件所属的组,只要该用户是该组的一员。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | chgrp [OPTION]... GROUP FILE... 17 | chgrp [OPTION]... --reference=RFILE FILE... 18 | 19 | 20 | 常用选项: 21 | ************************************ 22 | 23 | :: 24 | 25 | -f, --silent, --quiet 26 | 不显示错误信息 27 | 28 | -v, --verbose 29 | 显示命令执行过程 30 | 31 | -h, --no-dereference 32 | 只修改符号连接的文件,不更改其他相关文件 33 | 34 | -R, --recursive 35 | 递归处理,将目录下的所有文件及子目录一并处理 36 | 37 | 38 | 使用实例: 39 | ************************************ 40 | 41 | :: 42 | 43 | [Linux]$ ls -l 44 | -rwxr-xr-x 1 xiao xiao 105 Jul 2 20:50 a.py 45 | 46 | # 改变文件所属组 47 | [Linux]# chgrp root a.py 48 | [Linux]# ls -l 49 | -rwxr-xr-x 1 xiao root 105 Jul 2 20:59 a.py 50 | 51 | # 指定组 ID 52 | [Linux]# chgrp 1001 a.py 53 | [Linux]# ls -l 54 | -rwxr-xr-x 1 xiao geroge 105 Jul 2 20:50 a.py 55 | -------------------------------------------------------------------------------- /docs/Chapter01/00_chmod.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_chmod: 2 | 3 | chmod 变更权限 4 | #################################### 5 | 6 | chmod 命令用来变更文件或目录的权限。 7 | 8 | :doc:`权限 <../Chapter03/00_permission>` 范围的表示法如下: 9 | 10 | - u User 文件或目录的拥有者 11 | - g Group 文件或目录的所属群组 12 | - o Other 除了文件或目录的拥有者和所属组之外的其他用户 13 | - a All 全部的用户 14 | - r 读取权限,数字代号“4” 15 | - w 写入权限,数字代号“2”; 16 | - x 执行或切换权限,数字代号“1” 17 | - \- 不具任何权限,数字代号为“0” 18 | - s 强制位权限,使其他用户临时拥有文件拥有者的权限 19 | - t 粘滞位权限,用户只能删除自己为属主的文件 20 | 21 | .. attention :: 22 | 23 | 符号连接的权限无法变更,对符号连接修改权限实际会改变原始文件的权限。 24 | 25 | 26 | 命令格式: 27 | ************************************ 28 | 29 | .. highlight:: none 30 | 31 | :: 32 | 33 | chmod [OPTION]... MODE[,MODE]... FILE... 34 | chmod [OPTION]... OCTAL-MODE FILE... 35 | 36 | 37 | 修改权限有两种表达方式,即符号模式和八进制模式。 38 | 39 | 使用符号模式可以增加、删除或直接指定权限,每个项目的设置可以用逗号隔开。 40 | 41 | ====== ====== 42 | 符号 说明 43 | ====== ====== 44 | \+ 增加指定的权限 45 | \- 去除指定的权限 46 | \= 设置指定的权限 47 | ====== ====== 48 | 49 | 使用八进制数来指定权限。 50 | 51 | ====== ====== ====== 52 | 代码 rwx 权限 53 | ====== ====== ====== 54 | 7 rwx 读 + 写 + 执行 55 | 6 rw- 读 + 写 56 | 5 r-x 读 + 执行 57 | 4 r-- 只读 58 | 3 -wx 写 + 执行 59 | 2 -w- 只写 60 | 1 --x 只执行 61 | 0 --- 无 62 | ====== ====== ====== 63 | 64 | 65 | 常用选项: 66 | ************************************ 67 | 68 | :: 69 | 70 | -c, --changes 71 | 效果类似“-v”参数,但仅显示更改的部分 72 | 73 | -f, --silent, --quiet 74 | 不显示错误信息 75 | 76 | -v, --verbose 77 | 显示执行过程 78 | 79 | -R, --recursive 80 | 递归处理,将指令目录下的所有文件及子目录一并处理 81 | 82 | 83 | 使用实例: 84 | ************************************ 85 | 86 | :: 87 | 88 | 89 | [Linux]$ ls -l 90 | -rwxr-xr-x 1 xiao xiao 42 Jul 28 10:40 a.sh 91 | 92 | # 删除 other 的执行权限 93 | [Linux]$ chmod o-x a.sh 94 | [Linux]$ ls -l 95 | -rwxr-xr-- 1 xiao xiao 42 Jul 28 10:40 a.sh 96 | 97 | # 针对属主和属组删除执行权限 98 | [Linux]$ chmod ug-x a.sh 99 | [Linux]$ ls -l 100 | -rw-r--r-- 1 xiao xiao 42 Jul 28 10:40 a.sh 101 | 102 | # 分别设置权限 103 | [Linux]$ chmod u=rwx,g=rx,o=r a.sh 104 | [Linux]$ ls -l 105 | -rwxr-xr-- 1 xiao xiao 42 Jul 28 10:40 a.sh 106 | 107 | # 使用八进制方式设置权限 108 | [Linux]$ chmod 654 a.sh 109 | [Linux]$ ls -l 110 | -rw-r-xr-- 1 xiao xiao 42 Jul 28 10:40 a.sh 111 | 112 | # 设置特殊权限 113 | [Linux]$ chmod o+t abc 114 | [Linux]$ ls -l 115 | drwxr-xr-t 2 xiao xiao 4096 Aug 6 15:23 abc 116 | -------------------------------------------------------------------------------- /docs/Chapter01/00_chown.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_chown: 2 | 3 | chown 改变文件属主 4 | #################################### 5 | 6 | Linux 是多用户操作系统,所有的文件都有拥有者。chown 命令用于改变文件或目录的所有者或所属的组。 7 | 8 | 9 | .. attention:: 10 | 11 | chown 需要用到多个用户权限,只有 root 权限才能执行此命令。 12 | 13 | 14 | 命令格式: 15 | ************************************ 16 | 17 | .. highlight:: none 18 | 19 | :: 20 | 21 | chown [OPTION]... [OWNER][:[GROUP]] FILE... 22 | chown [OPTION]... --reference=RFILE FILE... 23 | 24 | 25 | 常用选项: 26 | ************************************ 27 | 28 | :: 29 | 30 | -f, --silent, --quiet 31 | 不显示错误信息 32 | 33 | -v, --verbose 34 | 显示命令执行过程 35 | 36 | -h, --no-dereference 37 | 只修改符号连接的文件,不更改其他相关文件 38 | 39 | -R, --recursive 40 | 递归处理,将目录下的所有文件及子目录一并处理 41 | 42 | 43 | 使用实例: 44 | ************************************ 45 | 46 | :: 47 | 48 | [Linux]$ ls -l 49 | -rwxr-xr-x 1 xiao xiao 105 Jul 2 20:50 a.py 50 | 51 | # 改变文件所有者 52 | [Linux]# chown root a.py 53 | [Linux]# ls -l 54 | -rwxr-xr-x 1 root xiao 105 Jul 2 20:59 a.py 55 | 56 | # 改变文件所有者和所属组 57 | [Linux]# chown root:root a.py 58 | [Linux]# ls -l 59 | -rwxr-xr-x 1 root root 105 Jul 2 21:30 a.py 60 | 61 | # 指定用户 ID 62 | [Linux]# chown 1000 a.py 63 | [Linux]# ls -l 64 | -rwxr-xr-x 1 xiao root 105 Jul 2 20:50 a.py 65 | 66 | # 指定所属组 ID 67 | [Linux]# chown :1000 a.py 68 | [Linux]# ls -l 69 | -rwxr-xr-x 1 xiao xiao 105 Jul 2 20:50 a.py 70 | -------------------------------------------------------------------------------- /docs/Chapter01/00_cp.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_cp: 2 | 3 | cp 复制文件或目录 4 | #################################### 5 | 6 | cp(copy)用来复制文件(或目录)到指定的路径,可同时复制多个文件和目录。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | cp [OPTION]... [-T] SOURCE DEST 17 | cp [OPTION]... SOURCE... DIRECTORY 18 | cp [OPTION]... -t DIRECTORY SOURCE... 19 | 20 | 21 | 常用选项: 22 | ************************************ 23 | 24 | :: 25 | 26 | -a, --archive 27 | 保留链接、文件属性,并复制目录下的所有内容。其作用等于 dpR 参数组合 28 | 29 | -b 30 | 覆盖已存在的文件前将文件备份 31 | 32 | -d 33 | 当复制符号连接时,把符号连接指向源文件或源目录 34 | 35 | -f, --force 36 | 强制复制,覆盖已经存在的文件时不提示 37 | 38 | -i, --interactive 39 | 在覆盖已经存在的文件时给出提示,要求用户确认是否覆盖 40 | 41 | -l, --link 42 | 对源文件建立硬连接,而非复制文件 43 | 44 | -n, --no-clobber 45 | 不覆盖已经存在的文件 46 | 47 | -p 48 | 除复制文件的内容外,同时复制修改时间和访问权限等 49 | 50 | -R, -r, --recursive 51 | 递归处理,将指定目录下的文件与子目录一并复制 52 | 53 | -s, --symbolic-link 54 | 对源文件建立符号连接,而非复制文件 55 | 56 | 57 | 使用实例: 58 | *********************** 59 | 60 | :: 61 | 62 | # 复制文件并重命名 63 | [Linux]$ ls 64 | aclocal alias apxs aulastlog bin 65 | [Linux]$ cp alias bin/aaa 66 | [Linux]$ ls -l bin/ 67 | total 4 68 | -rwxr-xr-x 1 root root 29 Feb 15 13:57 aaa 69 | 70 | # 复制多个文件到文件夹 71 | [Linux]$ cp apxs aulastlog bin/ 72 | [Linux]$ ls bin/ 73 | aaa apxs aulastlog 74 | 75 | # 递归复制整个文件目录 76 | [Linux]$ cp -r bin binBk/ 77 | 78 | # 交互式地复制文件 79 | [Linux]$ ls bin/ 80 | aaa apxs aulastlog cp 81 | [Linux]$ cp -i apxs bin/ 82 | cp: overwrite ‘bin/apxs’? y 83 | -------------------------------------------------------------------------------- /docs/Chapter01/00_dd.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_dd: 2 | 3 | dd 转换和复制文件 4 | #################################### 5 | 6 | dd 命令用于从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。 7 | 8 | dd 命令与其它的 Linux 程序略有不同,它的命令行选项格式为“选项=值”。 9 | 10 | 11 | 命令格式: 12 | ************************************ 13 | 14 | .. highlight:: none 15 | 16 | :: 17 | 18 | dd [OPERAND]... 19 | 20 | 21 | 常用选项: 22 | ************************************ 23 | 24 | :: 25 | 26 | if=FILE 27 | 指定输入的文件,默认为标准输入 28 | 29 | of=FILE 30 | 指定输出的文件,默认为标准输出 31 | 32 | ibs=BYTES 33 | 一次输入的字节大小,即指定一个块大小为 bytes 个字节 34 | 35 | obs=BYTES 36 | 一次输出的字节大小,即指定一个块大小为 bytes 个字节 37 | 38 | bs=BYTES 39 | 同时设置输入/输出的块大小为 bytes 个字节 40 | 41 | count=N 42 | ascii:转换 ebcdic 为 ascii 43 | ebcdic:转换 ascii 为 ebcdic 44 | ibm:转换 ascii 为 alternate ebcdic 45 | block:把每一行转换为长度为 cbs,不足部分用空格填充 46 | unblock:使每一行的长度都为 cbs,不足部分用空格填充 47 | lcase:把大写字符转换为小写字符 48 | ucase:把小写字符转换为大写字符 49 | swab:交换输入的每对字节 50 | noerror:出错时不停止 51 | notrunc:不截短输出文件 52 | sync:将每个输入块填充到 ibs 个字节,不足部分用空(NUL)字符补齐 53 | 54 | 55 | 使用实例: 56 | ************************************ 57 | 58 | :: 59 | 60 | # 将 /dev/hda 磁盘备份到 /dev/hdb 61 | [Linux]$ dd if=/dev/hda of=/dev/hdb 62 | 63 | # 将/dev/hdb全盘数据备份到指定路径的image文件 64 | [Linux]$ dd if=/dev/hdb of=/root/image 65 | 66 | # 将 file1 中的所有英文字母转换为大写,并另存为 file2 67 | [Linux]$ dd if=file1 of=file2 conv=ucase 68 | 69 | # 备份 /dev/hdb 全盘数据,并利用 gzip 工具进行压缩,保存到指定路径 70 | [Linux]$ dd if=/dev/hdb | gzip > /root/image.gz 71 | -------------------------------------------------------------------------------- /docs/Chapter01/00_df.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_df: 2 | 3 | df 查看磁盘分区空间 4 | #################################### 5 | 6 | df 命令用于查看磁盘分区的空间及使用和剩余的空间信息。 7 | 8 | 命令格式: 9 | ************************************ 10 | 11 | .. highlight:: none 12 | 13 | :: 14 | 15 | df [OPTION]... [FILE]... 16 | 17 | 常用选项: 18 | ************************************ 19 | 20 | :: 21 | 22 | -h, --human-readable 23 | 以更可读的方式显示分区大小(以 1024 为单位转换) 24 | 25 | -H, --si 26 | 以更可读的方式显示分区大小(以 1000 为单位转换) 27 | 28 | -t, --type=TYPE 29 | 指定文件的分区格式 30 | 31 | 32 | 33 | 使用实例: 34 | ************************************ 35 | 36 | :: 37 | 38 | # 默认显示所有挂载的磁盘,默认以 KB 为单位。 39 | [Linux]$ df 40 | 文件系统 1K-块 已用 可用 已用% 挂载点 41 | udev 3975328 0 3975328 0% /dev 42 | tmpfs 799028 9516 789512 2% /run 43 | /dev/mmcblk0p3 21977248 12651688 8186104 61% / 44 | tmpfs 3995128 120492 3874636 4% /dev/shm 45 | tmpfs 5120 4 5116 1% /run/lock 46 | tmpfs 3995128 0 3995128 0% /sys/fs/cgroup 47 | /dev/mmcblk0p4 95569324 10825896 79845740 12% /home/xiao/Videos/vlc 48 | /dev/mmcblk0p1 94759 5199 89560 6% /boot/efi 49 | tmpfs 799024 20 799004 1% /run/user/1000 50 | 51 | # 以更可读的方式显示 52 | [Linux]$ df -h 53 | 文件系统 容量 已用 可用 已用% 挂载点 54 | udev 3.8G 0 3.8G 0% /dev 55 | tmpfs 781M 9.3M 772M 2% /run 56 | /dev/mmcblk0p3 21G 13G 7.9G 61% / 57 | tmpfs 3.9G 118M 3.7G 4% /dev/shm 58 | tmpfs 5.0M 4.0K 5.0M 1% /run/lock 59 | tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup 60 | /dev/mmcblk0p4 92G 11G 77G 12% /home/xiao/Videos/vlc 61 | /dev/mmcblk0p1 93M 5.1M 88M 6% /boot/efi 62 | tmpfs 781M 20K 781M 1% /run/user/1000 63 | 64 | -------------------------------------------------------------------------------- /docs/Chapter01/00_du.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_du: 2 | 3 | du 查看文件夹大小 4 | #################################### 5 | 6 | 在 Linux 中使用 :ref:`ls -l ` 命令列出的目录内容中,文件夹的大小仅显示 4KB,这是用来存储文件夹的元数据的大小。 7 | 8 | 使用 du 命令可以查看目录或文件的大小。默认使用递归方式总结磁盘使用情况,以获取目录及其子目录的大小。 9 | 10 | 11 | 命令格式: 12 | ************************************ 13 | 14 | .. highlight:: none 15 | 16 | :: 17 | 18 | du [OPTION]... [FILE]... 19 | du [OPTION]... --files0-from=F 20 | 21 | 22 | 常用选项: 23 | ************************************ 24 | 25 | :: 26 | 27 | -h, --human-readable 28 | 以K,M,G为单位,显示文件的大小 29 | 30 | -s, --summarize 31 | 只显示总计的文件大小 32 | 33 | -S, --separate-dirs 34 | 显示时并不含其子文件夹的大小 35 | 36 | -d, --max-depth=N 37 | 显示子文件夹的深度(层级) 38 | 39 | 40 | 使用实例: 41 | ************************************ 42 | 43 | :: 44 | 45 | [Linux]$ ls 46 | Chapter01 Chapter03 Chapter05 Chapter07 index.rst TOC 47 | Chapter02 Chapter04 Chapter06 Images preface.rst 48 | 49 | # 默认显示 50 | [Linux]$ du 51 | 1740 ./Images 52 | 184 ./Chapter01 53 | 16 ./Chapter05 54 | 32 ./Chapter03 55 | 52 ./Chapter06 56 | 32 ./TOC 57 | 12 ./Chapter07/shell 内部命令 58 | 32 ./Chapter07/images 59 | 96 ./Chapter07 60 | 92 ./Chapter04 61 | 108 ./Chapter02 62 | 2364 . 63 | 64 | # 以人类可读的方式显示 65 | [Linux]$ du -h 66 | 1.7M ./Images 67 | 192K ./Chapter01 68 | 16K ./Chapter05 69 | 32K ./Chapter03 70 | 52K ./Chapter06 71 | 32K ./TOC 72 | 12K ./Chapter07/shell 内部命令 73 | 32K ./Chapter07/images 74 | 96K ./Chapter07 75 | 92K ./Chapter04 76 | 108K ./Chapter02 77 | 2.4M . 78 | 79 | # 按大小排列 80 | [Linux]$ du -h | sort -nr 81 | 82 | # 只显示 Images 文件夹的大小 83 | [Linux]$ du -h Images/ 84 | 1.7M Images/ 85 | 86 | # 只显示当前文件夹的总大小 87 | [Linux]$ du -hs 88 | 2.4M . 89 | 90 | # 显示文件夹大小时不包含子文件夹的大小 91 | [Linux]$ du -hS 92 | 1.7M ./Images 93 | 196K ./Chapter01 94 | 16K ./Chapter05 95 | 32K ./Chapter03 96 | 52K ./Chapter06 97 | 32K ./TOC 98 | 12K ./Chapter07/shell 内部命令 99 | 32K ./Chapter07/images 100 | 52K ./Chapter07 101 | 92K ./Chapter04 102 | 108K ./Chapter02 103 | 12K . 104 | 105 | # 显示 2 级文件夹的深度 106 | [Linux]$ du -h -d 2 ../docs/ 107 | 1.7M ../docs/Images 108 | 200K ../docs/Chapter01 109 | 16K ../docs/Chapter05 110 | 32K ../docs/Chapter03 111 | 52K ../docs/Chapter06 112 | 32K ../docs/TOC 113 | 12K ../docs/Chapter07/shell.type.rst 114 | 32K ../docs/Chapter07/images 115 | 96K ../docs/Chapter07 116 | 92K ../docs/Chapter04 117 | 108K ../docs/Chapter02 118 | 2.4M ../docs/ 119 | 120 | # 文件夹的深度从 0 级开始 121 | [Linux]$ du -h --max-depth=0 ../docs/ 122 | 2.4M ../docs/ 123 | 124 | # 列出当前目录及子目录下所有的 .jpg 文件 125 | [Linux]$ du -ch */*.jpg 126 | 56K Images/console.01.jpg 127 | 44K Images/console.02.jpg 128 | 52K Images/console.03.jpg 129 | 48K Images/console.04.jpg 130 | 40K Images/console.05.jpg 131 | 28K Images/git.01.jpg 132 | 32K Images/locale.01.jpg 133 | 24K Images/locale.02.jpg 134 | 324K total 135 | -------------------------------------------------------------------------------- /docs/Chapter01/00_env.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_env: 2 | 3 | env 查看环境变量 4 | #################################### 5 | 6 | env 命令可以查看环境变量,或在修改过的环境中运行程序。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...] 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -i, --ignore-environment 25 | 从一个空环境启动 26 | 27 | 28 | 使用实例: 29 | ************************************ 30 | 31 | :: 32 | 33 | [Linux] $ env 34 | SHELL=/bin/bash 35 | QT_ACCESSIBILITY=1 36 | COLORTERM=truecolor 37 | XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg 38 | XDG_MENU_PREFIX=gnome- 39 | GNOME_DESKTOP_SESSION_ID=this-is-deprecated 40 | GTK_IM_MODULE=ibus 41 | LANGUAGE=en_US:en 42 | QT4_IM_MODULE=ibus 43 | LC_ADDRESS=en_US.UTF-8 44 | GNOME_SHELL_SESSION_MODE=ubuntu 45 | LC_NAME=en_US.UTF-8 46 | SSH_AUTH_SOCK=/run/user/1000/keyring/ssh 47 | XMODIFIERS=@im=ibus 48 | -------------------------------------------------------------------------------- /docs/Chapter01/00_file.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_file: 2 | 3 | file 识别文件类型 4 | #################################### 5 | 6 | file 命令用来识别文件类型,也可用来识别文件的编码格式。它通过文件的头部信息来获取文件类型,而不是简单通过扩展名来识别文件类型。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | file [-bcdEhiklLNnprsSvzZ0] [--apple] [--extension] [--mime-encoding] [--mime-type] 17 | [-e testname] [-F separator] [-f namefile] [-m magicfiles] [-P name=value] 18 | file ... 19 | file -C [-m magicfiles] 20 | file [--help] 21 | 22 | 23 | 常用选项: 24 | ************************************ 25 | 26 | :: 27 | 28 | -b, --brief 29 | 不显示文件名称(简要模式) 30 | 31 | -c, --checking-printout 32 | 显示详细执行过程,便于排错或分析程序执行的情形 33 | 34 | -f, --files-from namefile 35 | 指定名称文件,识别文件中列出的所有文件 36 | 37 | -i, --mime 38 | 显示 MIME 类别 39 | 40 | -L, --dereference 41 | 直接显示符号连接所指向的文件类别 42 | 43 | -z, --uncompress 44 | 尝试去解读压缩文件的内容 45 | 46 | 47 | 使用实例: 48 | ************************************ 49 | 50 | :: 51 | 52 | [Linux]$ file file.rst 53 | file.rst: UTF-8 Unicode text, with very long lines 54 | 55 | # 显示 MIME 类别 56 | [Linux]$ file -i file.rst 57 | file.rst: text/plain; charset=utf-8 58 | 59 | # 识别目录文件 60 | [Linux]$ file docs/ 61 | docs/: directory 62 | 63 | # 识别压缩文件 64 | [Linux]$ file abc.zip 65 | abc.zip: Zip archive data, at least v1.0 to extract 66 | -------------------------------------------------------------------------------- /docs/Chapter01/00_free.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_free: 2 | 3 | free 查看内存 4 | #################################### 5 | 6 | free 命令用于查看内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存以及系统核心使用的缓冲区等。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | free [options] 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -b, --bytes 25 | 以Byte为单位显示内存使用情况。 26 | 27 | -k, --kibi 28 | 以KB为单位显示内存使用情况。 29 | 30 | -m, --mebi 31 | 以MB为单位显示内存使用情况。 32 | 33 | -g, --gibi 34 | 以GB为单位显示内存使用情况。 35 | 36 | -h, --human 37 | 以合适的单位显示内存使用情况,最大为三位数。单位有: 38 | B = bytes 39 | Ki = kibibyte 40 | Mi = mebibyte 41 | Gi = gibibyte 42 | Ti = tebibyte 43 | Pi = pebibyte 44 | 45 | -s, --seconds 46 | 持续观察内存使用状况,delay 为间隔的秒数。 47 | 48 | 49 | 使用实例: 50 | ************************************ 51 | 52 | :: 53 | 54 | [Linux]$ free 55 | total used free shared buff/cache available 56 | Mem: 24238200 1806484 20679900 76032 1751816 21966656 57 | Swap: 1999868 0 1999868 58 | 59 | # 以合适的单位显示内存使用情况 60 | [Linux]$ free -h 61 | total used free shared buff/cache available 62 | Mem: 23Gi 1.7Gi 19Gi 67Mi 1.6Gi 21Gi 63 | Swap: 1.9Gi 0B 1.9Gi 64 | 65 | # 每 3 秒更新一次内存信息 66 | [Linux]$ free -h -s 3 67 | total used free shared buff/cache available 68 | Mem: 23Gi 1.7Gi 19Gi 67Mi 1.6Gi 21Gi 69 | Swap: 1.9Gi 0B 1.9Gi 70 | 71 | total used free shared buff/cache available 72 | Mem: 23Gi 1.7Gi 19Gi 67Mi 1.6Gi 21Gi 73 | Swap: 1.9Gi 0B 1.9Gi 74 | 75 | total used free shared buff/cache available 76 | Mem: 23Gi 1.7Gi 19Gi 67Mi 1.6Gi 21Gi 77 | Swap: 1.9Gi 0B 1.9Gi 78 | 79 | ... 80 | 81 | 82 | .. note:: 83 | 84 | - Mem 物理内存的使用 85 | - Swap 虚拟交换空间的使用 86 | - total 列显示系统总的可用物理内存和交换空间大小 87 | - used 列显示已被使用的物理内存和交换空间 88 | - free 列显示剩余可用的物理内存和交换空间 89 | - shared 列显示被共享使用的物理内存大小 90 | - buff/cache 列显示被 buffer 和 cache 使用的物理内存大小 91 | - available 列显示还可以被应用程序使用的物理内存大小 92 | 93 | 94 | 概念诠释 95 | ************************************ 96 | 97 | buff/cache 98 | ==================================== 99 | 100 | buffer 在操作系统中指 buffer cache, 中文一般翻译为 "缓冲区"。要理解缓冲区,必须明确另外两个概念:"扇区" 和 "块"。扇区是设备的最小寻址单元,也叫 "硬扇区" 或 "设备块"。块是操作系统中文件系统的最小寻址单元,也叫 "文件块" 或 "I/O 块"。每个块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示。 101 | 102 | buffer cache 只有块的概念而没有文件的概念,它只是把磁盘上的块直接搬到内存中而不关心块中究竟存放的是什么格式的文件。 103 | 104 | cache 在操作系统中指 page cache,中文一般翻译为 "页高速缓存"。页高速缓存是内核实现的磁盘缓存。它主要用来减少对磁盘的 I/O 操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。页高速缓存缓存的是内存页面。缓存中的页来自对普通文件、块设备文件(这个指的就是 buffer cache 呀)和内存映射文件的读写。 105 | 106 | 页高速缓存对普通文件的缓存我们可以这样理解:当内核要读一个文件(比如 /etc/hosts)时,它会先检查这个文件的数据是不是已经在页高速缓存中了。如果在,就放弃访问磁盘,直接从内存中读取。这个行为称为缓存命中。如果数据不在缓存中,就是未命中缓存,此时内核就要调度块 I/O 操作从磁盘去读取数据。然后内核将读来的数据放入页高速缓存中。这种缓存的目标是文件系统可以识别的文件(比如 /etc/hosts)。 107 | 108 | 页高速缓存对块设备文件的缓存就是我们在前面介绍的 buffer cahce。因为独立的磁盘块通过缓冲区也被存入了页高速缓存(缓冲区最终是由页高速缓存来承载的)。 109 | 110 | 到这里我们应该搞清楚了:无论是缓冲区还是页高速缓存,它们的实现方式都是一样的。缓冲区只不过是一种概念上比较特殊的页高速缓存罢了。 111 | 112 | 那么为什么 free 命令不直接称为 cache 而非要写成 buff/cache? 这是因为缓冲区和页高速缓存的实现并非天生就是统一的。在 linux 内核 2.4 中才将它们统一。更早的内核中有两个独立的磁盘缓存:页高速缓存和缓冲区高速缓存。前者缓存页面,后者缓存缓冲区。当你知道了这些故事之后,输出中列的名称可能已经不再重要了。 113 | 114 | 115 | free 与 available 116 | ==================================== 117 | 118 | 在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别? 119 | 120 | free 是真正尚未被使用的物理内存数量。至于 available 就比较有意思了,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。 121 | 122 | 123 | 交换空间(swap space) 124 | ==================================== 125 | 126 | swap space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件。所以具体的实现可以是 swap 分区也可以是 swap 文件。当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。 127 | 128 | 现在的机器一般都不太缺内存,如果系统默认还是使用了 swap 是不是会拖累系统的性能?理论上是的,但实际上可能性并不是很大。并且内核提供了一个叫做 swappiness 的参数,用于配置需要将内存中不常用的数据移到 swap 中去的紧迫程度。这个参数的取值范围是 0~100,0 告诉内核尽可能的不要将内存数据移到 swap 中,也即只有在迫不得已的情况下才这么做,而 100 告诉内核只要有可能,尽量的将内存中不常访问的数据移到 swap 中。在 ubuntu 系统中,swappiness 的默认值是 60。如果我们觉着内存充足,可以在 /etc/sysctl.conf 文件中设置 swappiness: 129 | 130 | :: 131 | 132 | vm.swappiness=10 133 | 134 | 如果系统的内存不足,则需要根据物理内存的大小来设置交换空间的大小。 135 | 136 | -------------------------------------------------------------------------------- /docs/Chapter01/00_head.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_head: 2 | 3 | head 查看文件的开头内容 4 | #################################### 5 | 6 | head 命令用于查看文件开头部分的内容,默认为前 10 行的内容。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | head [OPTION]... [FILE]... 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -n, --lines=[-]NUM 25 | 指定查看的行数 26 | 27 | -q, --quiet, --silent 28 | 不显示文件名 29 | 30 | 31 | 使用实例: 32 | ************************************ 33 | 34 | :: 35 | 36 | # 默认输出 37 | [Linux]$ head /etc/samba/smb.conf 38 | [global] 39 | map to guest = Bad User 40 | log file = /var/log/samba/%m 41 | log level = 1 42 | 43 | [guest] 44 | path = /mnt/samba/ 45 | read only = no 46 | guest ok = yes 47 | guest only = yes 48 | 49 | # 指定显示行数 50 | [Linux]$ head -n 3 /etc/samba/smb.conf 51 | [global] 52 | map to guest = Bad User 53 | log file = /var/log/samba/%m 54 | -------------------------------------------------------------------------------- /docs/Chapter01/00_history.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_history: 2 | 3 | history 命令行历史列表 4 | #################################### 5 | 6 | history 命令保存从该终端会话运行的所有其它命令的列表,然后允许你重放或者重用这些命令,而不用重新输入它们。 7 | 8 | 可以在 ``~/.bash_history`` 中查看命令行记录文件。 9 | 10 | 11 | 命令格式: 12 | ************************************ 13 | 14 | .. highlight:: none 15 | 16 | :: 17 | 18 | history [option] 19 | 20 | 21 | 常用选项: 22 | ************************************ 23 | 24 | :: 25 | 26 | -c 27 | 清空当前历史命令 28 | 29 | n 30 | 显示最近的 n 条历史命令 31 | 32 | 33 | .. hint :: 34 | 35 | 快捷键可以以递增方式对命令历史进行搜索,对于想要重复执行某个命令的时候非常有用。当找到要查找的命令时,按 键执行此命令,按 键将搜索到的命令从历史记录列表中复制到当前命令行来进一步编辑,再次按 键将查找下一个匹配项(即向前搜索历史记录)。若要退出搜索,可以按 或者 即可。 36 | 37 | :: 38 | 39 | # 不输入命令,直接按 进入搜索模式,输入单词自动匹配最近的历史记录 40 | # 提示符会变为 (reverse-i-search),red 为输入字符 41 | (reverse-i-search)`red‘: cat /etc/redhat-release 42 | 43 | 44 | 使用实例: 45 | ************************************ 46 | 47 | :: 48 | 49 | [Linux]$ history 50 | 1 service network restart 51 | 2 exit 52 | 3 id 53 | 4 cat /etc/redhat-release 54 | 5 history 55 | [Linux]$ !4 56 | cat /etc/redhat-release 57 | Fedora release 9 (Sulphur) 58 | 59 | Shell 中还有几个好用的历史列表命令: 60 | 61 | ========== ============== 62 | 字符 说明 63 | ========== ============== 64 | !! 执行上一条命令(等同于 + 键) 65 | !number 执行历史列表中第 number 行的命令 66 | !string 执行最近的以 string 字符串开头的命令 67 | !?string 执行最近的包含这个字符串的命令 68 | !* 使用上一条命令的选项和参数 69 | !$ 使用上一条命令的最后一个参数 70 | ========== ============== 71 | 72 | 73 | .. hint :: 74 | 75 | 应该谨慎地使用 ``!string`` 和 ``!?string`` 格式,除非你完全确信历史列表条目的内容。 76 | 77 | 78 | :: 79 | 80 | [Linux]$ ls -l Music/ 81 | total 0 82 | 83 | # 执行上一条命令 84 | [Linux]$ !! 85 | ls -l Music/ 86 | total 0 87 | 88 | # 使用上一条命令的选项和参数 89 | [Linux]$ ls !* 90 | ls -l Music/ 91 | total 0 92 | 93 | # 使用上一条命令的最后一个参数 94 | [Linux]$ ls !$ 95 | ls Music/ 96 | -------------------------------------------------------------------------------- /docs/Chapter01/00_id.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_id: 2 | 3 | id 显示用户 ID 4 | #################################### 5 | 6 | id 命令用于显示用户的 ID,以及所属群组的实际与有效 ID(若两个ID相同,则仅显示实际ID)。若没有指定用户名称,则显示当前用户的 ID。 7 | 8 | 一些程序可能需要 UID/GID 来运行。id 使我们更加容易地找出用户的 UID 以 GID 而不必在 ``/etc/group`` 文件中搜索。 9 | 10 | 11 | 命令格式: 12 | ************************************ 13 | 14 | .. highlight:: none 15 | 16 | :: 17 | 18 | id [OPTION]... [USER] 19 | 20 | 21 | 常用选项: 22 | ************************************ 23 | 24 | :: 25 | 26 | -g, --group 27 | 只打印有效的组 ID 28 | 29 | -G, --groups 30 | 打印所有组 ID 31 | 32 | -u, --user 33 | 显示用户 ID 34 | 35 | 36 | 使用实例: 37 | ************************************ 38 | 39 | :: 40 | 41 | # 显示当前用户的 ID 信息 42 | [Linux]$ id 43 | uid=1000(glenn) gid=1000(glenn) groups=1000(glenn),27(sudo) 44 | 45 | # 显示用户名 ftp 的 ID 信息 46 | [Linux]$ id ftp 47 | uid=14(ftp) gid=50(ftp) groups=50(ftp) 48 | -------------------------------------------------------------------------------- /docs/Chapter01/00_jobs.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_jobs: 2 | 3 | jobs 查看后台命令 4 | #################################### 5 | 6 | 用来查看当前终端有多少在后台运行的命令。 7 | 8 | .. hint:: 9 | 10 | 可以使用 ``bg %1`` 命令让程序在后台继续执行,也可以使用 ``fg %1`` 命令把后台命令恢复到前台执行。 11 | 12 | 13 | 命令格式: 14 | ************************************ 15 | 16 | .. highlight:: none 17 | 18 | :: 19 | 20 | jobs [-lnprs] [jobspec ...] 21 | 22 | 23 | 常用选项: 24 | ************************************ 25 | 26 | :: 27 | 28 | -l 29 | 在正常信息基础上,列出进程的 PID 30 | 31 | -n 32 | 只列出上次发出通知后改变了状态的进程 33 | 34 | -p 35 | 只列出进程的 PID 36 | 37 | -r 38 | 只列出运行中的进程 39 | 40 | -s 41 | 只列出已停止的进程 42 | 43 | 44 | 使用实例: 45 | ************************************ 46 | 47 | :: 48 | 49 | [Linux]$ jobs 50 | [1]+ Stopped vim 51 | 52 | [Linux]$ jobs -l 53 | [1]+ 494 Stopped vim 54 | 55 | -------------------------------------------------------------------------------- /docs/Chapter01/00_kill.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_kill: 2 | 3 | kill 终止进程 4 | #################################### 5 | 6 | kill 命令大多时候用于终止(删除)执行中的进程。 7 | 8 | kill 默认发送的信息为 SIGTERM(15),可终止指定程序。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制终止程序。 9 | 10 | 程序的进程号可使用 :ref:`ps 命令 ` 或 :ref:`jobs -l 命令 ` 查看,还可以使用 :ref:`top 命令 ` 。 11 | 12 | 13 | 命令格式: 14 | ************************************ 15 | 16 | .. highlight:: none 17 | 18 | :: 19 | 20 | kill - [...] 21 | kill -s [...] 22 | kill --signal [...] 23 | 24 | 25 | 常用选项: 26 | ************************************ 27 | 28 | :: 29 | 30 | -l, --list [signal] 31 | 若不加 [signal] 选项,则列出全部的信号编号和名称 32 | 加 [signal] 选项,则在信号编号和信号名称之间相互转换 33 | 34 | -L 35 | 列出全部的信号编号和名称 36 | 37 | 38 | 经常使用的信号: 39 | 40 | =============== =============== ========== 41 | Signal Name Single Value Effect 42 | =============== =============== ========== 43 | SIGINT 2 中断信号(同 ) 44 | SIGKILL 9 强制终止进程 45 | SIGTERM 15 发送终止信号(不适用卡死的进程) 46 | SIGCONT 18 继续进程(类似 bg 命令) 47 | SIGSTOP 19 暂停进程(同 ) 48 | =============== =============== ========== 49 | 50 | 51 | 使用实例: 52 | ************************************ 53 | 54 | :: 55 | 56 | # 列出所有信号编号和名称 57 | [Linux]$ kill -l 58 | 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 59 | 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 60 | 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 61 | 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 62 | 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 63 | 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 64 | 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 65 | 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 66 | 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 67 | 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 68 | 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 69 | 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 70 | 63) SIGRTMAX-1 64) SIGRTMAX 71 | 72 | 73 | # 首先查看进程号,然后终止进程 74 | [Linux]$ ps -ef | grep gvim 75 | UID PID PPID C STIME TTY TIME CMD 76 | glenn 4071 1246 1 20:47 ? 00:00:35 gvim new.txt 77 | [Linux]$ kill -9 4071 78 | 79 | # 等同于 -9 80 | [Linux]$ kill -KILL 4071 81 | -------------------------------------------------------------------------------- /docs/Chapter01/00_less.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_less: 2 | 3 | less 交互式查看文件内容 4 | #################################### 5 | 6 | less 是对文件或其它输出进行分页查看的工具,支持前后翻页和搜索等功能。 7 | 8 | 命令格式: 9 | ************************************ 10 | 11 | .. highlight:: none 12 | 13 | :: 14 | 15 | less -? 16 | less [-[+]aABcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~] 17 | [-b space] [-h lines] [-j line] [-k keyfile] 18 | [-{oO} logfile] [-p pattern] [-P prompt] [-t tag] 19 | [-T tagsfile] [-x tab,...] [-y lines] [-[z] lines] 20 | [-# shift] [+[+]cmd] [--] [filename]... 21 | 22 | 23 | 常用选项: 24 | ************************************ 25 | 26 | :: 27 | 28 | -e, --quit-at-eof 29 | 当文件显示结束后,自动退出 30 | 31 | -i, --ignore-case 32 | 搜索时忽略大小写 33 | 34 | -N or --LINE-NUMBERS 35 | 显示行号 36 | 37 | 38 | 使用 less 查看文件时,常用操作命令: 39 | 40 | =============== =============== 41 | 命令 说明 42 | =============== =============== 43 | h 显示帮助 44 | / 向下搜索 45 | ? 向上搜索 46 | n 下一个搜索(与 / 或 ? 有关) 47 | N 上一个搜索(与 / 或 ? 有关) 48 | f 向下翻一页 49 | b 向上翻一页 50 | d 向下翻半页 51 | u 向上翻半页 52 | j 向下翻一行 53 | k 向上翻一行 54 | q 退出 55 | =============== =============== 56 | -------------------------------------------------------------------------------- /docs/Chapter01/00_ln.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_ln: 2 | 3 | ln 创建文件链接 4 | #################################### 5 | 6 | ln 用于为文件和目录创建一个链接,在 Linux 中有两种链接的概念: :doc:`../Chapter03/00_link` 。 7 | 8 | 命令格式: 9 | ************************************ 10 | 11 | .. highlight:: none 12 | 13 | :: 14 | 15 | ln [OPTION]... [-T] TARGET LINK_NAME 16 | ln [OPTION]... TARGET 17 | ln [OPTION]... TARGET... DIRECTORY 18 | ln [OPTION]... -t DIRECTORY TARGET... 19 | 20 | 21 | 常用选项: 22 | ************************************ 23 | 24 | :: 25 | 26 | -f, --force 27 | 强行建立文件或目录的连接,不论文件或目录是否存在 28 | 29 | -i, --interactive 30 | 在覆盖既有文件之前先询问 31 | 32 | -n, --no-dereference 33 | 把符号链接视为一般目录(链接到符号链接时必须) 34 | 35 | -s, --symbolic 36 | 建立软链接,而非默认的硬连接 37 | 38 | 39 | 40 | 使用实例: 41 | ************************************ 42 | 43 | :: 44 | 45 | # 在当前目录,创建一个硬链接: 46 | [Linux]$ ln 1.txt 0.txt 47 | [Linux]$ ls -li 48 | total 0 49 | 12189699 -rw-rw-r-- 2 glenn glenn 0 Dec 6 08:54 0.txt 50 | 12189699 -rw-rw-r-- 2 glenn glenn 0 Dec 6 08:54 1.txt 51 | 52 | # 在指定目录,创建一个同名的硬链接: 53 | [Linux]$ ln 1.txt /media/ 54 | [Linux]$ ls -li /media 55 | total 0 56 | 12189699 -rw-rw-r-- 3 glenn glenn 0 Dec 6 08:54 1.txt 57 | 58 | # 在当前目录,创建一个软链接: 59 | [Linux]$ ln -s 1.txt z.txt 60 | [Linux]$ ls -li 61 | total 0 62 | 12189699 -rw-rw-r-- 3 glenn glenn 0 Dec 6 08:54 0.txt 63 | 12189699 -rw-rw-r-- 3 glenn glenn 0 Dec 6 08:54 1.txt 64 | 12189708 lrwxrwxrwx 1 glenn glenn 5 Dec 6 09:04 z.txt -> 1.txt 65 | 66 | # 更新软连接 67 | [Linux]$ ln -sf 0.txt z.txt 68 | [Linux]$ ls -l 69 | total 0 70 | 12189699 -rw-rw-r-- 3 glenn glenn 0 Dec 6 08:54 0.txt 71 | 12189699 -rw-rw-r-- 3 glenn glenn 0 Dec 6 08:54 1.txt 72 | 12189708 lrwxrwxrwx 1 glenn glenn 5 Dec 6 09:04 z.txt -> 0.txt 73 | 74 | 75 | .. hint:: 删除目录软链接 76 | 77 | :: 78 | 79 | [Linux]$ ln -s doc c 80 | [Linux]$ ls -l 81 | lrwxrwxrwx 1 glenn glenn 4 Dec 6 10:04 c -> doc/ 82 | drwxrwxr-x 2 glenn glenn 4096 Dec 6 09:07 doc/ 83 | 84 | # 错误的删除方式 85 | # 软链接并没有删除,删除的是 doc 目录下的所有文件 86 | [Linux]$ rm -rf c/ 87 | [Linux]$ ls -l 88 | lrwxrwxrwx 1 glenn glenn 3 Dec 6 10:05 c -> doc 89 | drwxrwxr-x 2 glenn glenn 4096 Dec 6 10:06 doc 90 | Linux]$ ls -l doc/ 91 | total 0 92 | 93 | # 正确的删除方式 94 | # 删除软链接时,不能加 / 符号 95 | [Linux]$ rm -rf c 96 | [Linux]$ ls -l 97 | drwxrwxr-x 2 glenn glenn 4096 Dec 6 10:06 doc 98 | -------------------------------------------------------------------------------- /docs/Chapter01/00_loginctl.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_loginctl: 2 | 3 | loginctl 查看用户 4 | #################################### 5 | 6 | loginctl 命令可用于检查和控制 systemd 的状态;查看已经登录的用户会话消息。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | loginctl [OPTIONS...] {COMMAND} ... 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -a, --all 25 | 显示全部属性,无论属性是否已经被设置 26 | 27 | -l, --full 28 | 在显示进程树的时候,不对超长行进行截断 29 | 30 | -n, --lines= 31 | 显示多少行日志。必须为正整数,默认值"10" 32 | 33 | 34 | list-sessions 35 | 列出当前所有的会话。这是默认命令 36 | 37 | session-status [ID…] 38 | 39 | 显示简洁的会话状态信息, 后跟最近的日志。 40 | 如果指定了会话ID,那么仅显示指定的会话, 否则显示当前调用者的会话。 41 | 此命令仅用于输出人类易读的信息, 如果你想输出易于程序分析的信息, 42 | 那么应该使用 show-session 命令 43 | 44 | terminate-user USER… 45 | 结束指定用户的所有会话。 这将杀死该用户的所有会话中的所有进程, 同时释放与此用户有关的所有资源。 46 | 47 | kill-user USER… 48 | 向指定用户的所有进程发送 --signal= 选项指定的信号。 49 | 50 | 51 | list-seats 52 | 列出当前本机上的 所有可用席位 53 | 54 | seat-status [NAME…] 55 | 显示简洁的席位信息,后跟最近的日志。 56 | 如果指定了席位名,那么仅显示指定的席位, 否则显示当前调用者会话所属的席位。 57 | 此命令仅用于输出人类易读的信息, 如果你想输出易于程序分析的信息, 58 | 那么应该使用 show-seat 命令。 59 | 60 | terminate-seat NAME… 61 | 结束指定席位上的所有会话。 这将杀死指定席位上的所有会话进程, 同时释放与之关联的所有资源。 62 | 63 | 64 | 使用实例: 65 | ************************************ 66 | 67 | :: 68 | 69 | # 列出本机所有的 session 70 | # 不带参数执行 loginctl 和执行 loginctl list-sessions 效果一样 71 | [Linux]$ loginctl 72 | SESSION UID USER SEAT TTY 73 | 1 1000 xiao pts/0 74 | 5 1000 xiao pts/1 75 | 76 | 2 sessions listed. 77 | 78 | 79 | # 查看 session 的详细信息 80 | [Linux]$ loginctl show-session 5 81 | EnableWallMessages=no 82 | NAutoVTs=6 83 | KillUserProcesses=no 84 | RebootToFirmwareSetup=no 85 | IdleSinceHint=1627474393034083 86 | UserStopDelayUSec=10s 87 | HandlePowerKey=poweroff 88 | IdleAction=ignore 89 | PreparingForShutdown=no 90 | Docked=no 91 | NCurrentSessions=2 92 | ... 93 | 94 | 95 | # 杀死 session 96 | [Linux]$ loginctl kill-session 976 97 | 98 | 99 | # 查看登录用户的详细信息 100 | [Linux]$ loginctl show-user 1000 101 | UID=1000 102 | GID=1000 103 | Name=xiao 104 | Timestamp=Wed 2021-07-28 18:53:32 CST 105 | RuntimePath=/run/user/1000 106 | Slice=user-1000.slice 107 | ... 108 | 109 | 110 | # 查看登录用户的状态 111 | [Linux]$ loginctl user-status xiao 112 | xiao (1000) 113 | Since: Wed 2021-07-28 18:53:32 CST; 1h 25min ago 114 | State: active 115 | Sessions: 5 *1 116 | Linger: no 117 | Unit: user-1000.slice 118 | ├─session-1.scope 119 | │ ├─730 sshd: xiao [priv] 120 | │ ├─747 sshd: xiao@pts/0 121 | │ ├─748 -bash 122 | │ └─851 vim 00_loginctl.rst 123 | ├─session-5.scope 124 | │ ├─852 sshd: xiao [priv] 125 | │ ├─858 sshd: xiao@pts/1 126 | │ ├─859 -bash 127 | │ ├─862 su 128 | │ ├─863 bash 129 | │ ├─934 loginctl user-status xiao 130 | │ └─935 pager 131 | └─user@1000.service 132 | └─init.scope 133 | ├─733 /lib/systemd/systemd --user 134 | └─734 (sd-pam) 135 | 136 | Jul 28 18:53:33 debian systemd[733]: Listening on GnuPG cryptographic agent and passphrase 137 | Jul 28 18:53:33 debian systemd[733]: Listening on GnuPG cryptographic agent (ssh-agent emu 138 | ... 139 | -------------------------------------------------------------------------------- /docs/Chapter01/00_ls.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_ls: 2 | 3 | ls 显示目录中的文件 4 | #################################### 5 | 6 | ls(list)用来显示目录所含的文件及子目录,在 Linux 中是使用率较高的命令。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | ls [OPTION]... [FILE]... 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -a, --all 25 | 显示所有的文件,包括隐藏文件(以 ``.`` 开头的文件) 26 | 27 | -A, --almost-all 28 | 显示所有的文件,包括隐藏文件,但不包括表示当前目录 . 和上级目录 .. 这两个文件 29 | 30 | -C 31 | 多列显示输出结果。这是默认选项 32 | 33 | --color[=WHEN] 34 | 是否根据文件类型显示颜色,WHEN 可以为 never、always 或者 auto 35 | 36 | -F, --classify 37 | 在每个输出项后追加文件的类型标识符 38 | 具体含义:“*”表示具有可执行权限的普通文件 39 | “/”表示目录 40 | “@”表示符号链接 41 | “|”表示命令管道 FIFO 42 | “=”表示 sockets 套接字 43 | 当文件为普通文件时,不输出任何标识符 44 | 45 | -i, --inode 46 | 列出文件的索引节点号(inode) 47 | 48 | -l 49 | 以长格式显示目录下的内容列表。 50 | 51 | -m 52 | 用逗号 ``,`` 区隔每个文件和目录的名称 53 | 54 | -R, --recursive 55 | 递归处理,将指定目录下的所有文件及子目录一并处理 56 | 57 | -t 58 | 根据文件和目录的更改时间进行排序输出(最新的文件先列出) 59 | 60 | 61 | 使用实例: 62 | ************************************ 63 | 64 | :: 65 | 66 | # 显示长格式列表 67 | # 输出的信息从左到右依次包括:文件类型+权限模式、硬连接数、 68 | # 所有者、所有组、文件大小、最后修改时间、文件名 69 | [Linux]$ ls -l 70 | total 20 71 | lrwxrwxrwx. 1 root root 7 Mar 27 2018 bin -> usr/bin 72 | dr-xr-xr-x. 5 root root 4096 Mar 27 2018 boot 73 | ... 74 | drwxr-xr-x. 20 root root 278 Feb 12 18:17 var 75 | 76 | 77 | # 将文件大小转换为更加人性化的表示方法(默认的以字节为单位) 78 | [Linux]$ ls -lh 79 | -rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh 80 | -rwxrwxr-x. 1 seth seth 662 Apr 29 22:27 factorial 81 | -rwxrwx---. 1 seth users 20M Jun 29 2018 fop-2.3-bin.tar.gz 82 | -rwxrwxr-x. 1 seth seth 6.1K May 22 10:22 geteltorito 83 | -rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh 84 | 85 | 86 | # 显示所有的文件,包括隐藏文件 87 | [Linux]$ ls -a 88 | . .bash_history .bash_profile .cshrc .pki 89 | .. .bash_logout .bashrc .mysql_history .tcshrc 90 | 91 | 92 | # 显示长格式列表并且显示文件的索引节点号 93 | [Linux]$ ls -li 94 | total 20 95 | 120 lrwxrwxrwx. 1 root root 7 Mar 27 2018 bin -> usr/bin 96 | 64 dr-xr-xr-x. 5 root root 4096 Mar 27 2018 boot 97 | ... 98 | 100663361 drwxr-xr-x. 20 root root 278 Feb 12 18:17 var 99 | 100 | 101 | # 在每个输出项后追加文件的类型标识符 102 | [Linux]$ ls -F 103 | bin@ dev/ home/ lib64@ mnt/ proc/ run/ srv/ tmp/ var/ 104 | boot/ etc/ lib@ media/ opt/ root/ sbin@ sys/ usr/ 105 | 106 | 107 | # 显示目录下所有的 php 文件 108 | [Linux]$ ls -l *php 109 | -rwxrwxrwx 1 root root 4371 Feb 12 19:38 console.php 110 | -rwxrwxrwx 1 root root 5033 Feb 12 19:38 cron.php 111 | -rwxrwxrwx 1 root root 3678 Feb 12 19:38 index.php 112 | 113 | 114 | # 递归显示目录下文件 115 | [Linux]$ ls -FR 116 | .: 117 | app/ COPYING-AGPL* pub/ src/ 118 | application.php* index.php* README.md* vendor/ 119 | 120 | ./app: 121 | bootstrap.php* config/ 122 | 123 | ./app/config: 124 | container.php* 125 | 126 | ./pub: 127 | css/ img/ js/ 128 | 129 | ./pub/css: 130 | main.css* 131 | 132 | 133 | # 只显示目录下的文件夹 134 | [Linux]$ ls -la | grep ^d 135 | drwxr-xr-x 21 root root 4096 Jul 13 13:49 . 136 | drwxr-xr-x 3 root root 4096 Jul 8 22:54 .. 137 | drwxr-xr-x 2 root root 4096 Jul 9 14:59 Desktop 138 | drwxr-xr-x 8 root root 4096 Jul 13 18:30 Documents 139 | drwxr-xr-x 2 root root 12288 Jul 13 15:49 Downloads 140 | drwxr-xr-x 2 root root 4096 Jul 9 14:59 Music 141 | drwx------ 2 root root 4096 Jul 10 09:51 .ssh 142 | drwxr-xr-x 2 root root 4096 Jul 9 14:59 Templates 143 | drwxr-xr-x 7 root root 4096 Jul 11 11:43 Videos 144 | -------------------------------------------------------------------------------- /docs/Chapter01/00_lsblk.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_lsblk: 2 | 3 | lsblk 列出块设备 4 | #################################### 5 | 6 | lsblk(list block)列出所有可用块设备的信息,及设备之间的依赖关系,但是不会列出 RAM 的信息。 7 | 8 | .. hint:: 9 | 10 | lsblk 命令包含在 util-linux包中,这个包中还包含 dmesg 等其他工具。如果系统中没有 lsblk 命令,请安装 util-linux 包。 11 | 12 | 13 | 命令格式: 14 | ************************************ 15 | 16 | .. highlight:: none 17 | 18 | :: 19 | 20 | lsblk [options] [device...] 21 | 22 | 23 | 常用选项: 24 | ************************************ 25 | 26 | :: 27 | 28 | -a, --all 29 | 显示所有设备,包括空设备 30 | 31 | -d, --nodeps 32 | 不显示分区的详细信息 33 | 34 | -l, --list 35 | 使用列表格式显示 36 | 37 | -m, --perms 38 | 显示设备权限信息 39 | 40 | -o, --output list 41 | 指定输出信息,支持的选项 42 | NAME,SIZE,OWNER,GROUP,MODE,FSTYPE,LABEL,UUID,MOUNTPOINT... 43 | 44 | -S, --scsi 45 | 只显示 SCSI 设备 46 | 47 | 48 | 使用实例: 49 | ************************************ 50 | 51 | :: 52 | 53 | # 默认输出 54 | [Linux]$ lsblk 55 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 56 | loop0 7:0 0 55.3M 1 loop /snap/core18/1885 57 | loop1 7:1 0 55.4M 1 loop /snap/core18/1932 58 | loop2 7:2 0 162.9M 1 loop /snap/gnome-3-28-1804/145 59 | loop3 7:3 0 255.6M 1 loop /snap/gnome-3-34-1804/36 60 | loop4 7:4 0 62.1M 1 loop /snap/gtk-common-themes/1506 61 | loop6 7:6 0 51M 1 loop /snap/snap-store/498 62 | loop7 7:7 0 31.1M 1 loop /snap/snapd/10238 63 | loop8 7:8 0 290.4M 1 loop /snap/vlc/1700 64 | loop9 7:9 0 64.8M 1 loop /snap/gtk-common-themes/1514 65 | loop10 7:10 0 49.8M 1 loop /snap/snap-store/467 66 | loop11 7:11 0 217.9M 1 loop /snap/gnome-3-34-1804/60 67 | loop12 7:12 0 31.1M 1 loop /snap/snapd/10492 68 | nvme0n1 259:0 0 238.5G 0 disk 69 | ├─nvme0n1p1 259:1 0 487M 0 part /boot/efi 70 | ├─nvme0n1p2 259:2 0 1.9G 0 part [SWAP] 71 | └─nvme0n1p3 259:3 0 236.1G 0 part / 72 | 73 | - NAME:设备名 74 | - MAJ:MIN:主要/次要设备号 75 | - RM:是否可移动设备(0 否,1 是) 76 | - SIZE:设备的容量大小 77 | - RO:是否为只读设备(0 否,1 是) 78 | - TYPE:设备类型(disk 磁盘,part 分区,loop 块设备) 79 | - MOUNTPOINT:设备挂载点 80 | 81 | :: 82 | 83 | # 查看指定设备 84 | [Linux]$ lsblk /dev/nvme0n1 85 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 86 | nvme0n1 259:0 0 238.5G 0 disk 87 | ├─nvme0n1p1 259:1 0 487M 0 part /boot/efi 88 | ├─nvme0n1p2 259:2 0 1.9G 0 part [SWAP] 89 | └─nvme0n1p3 259:3 0 236.1G 0 part / 90 | 91 | # 自定义输出项 92 | [Linux]$ lsblk -o name,size,uuid /dev/nvme0n1 93 | NAME SIZE UUID 94 | nvme0n1 238.5G 95 | ├─nvme0n1p1 487M D379-5667 96 | ├─nvme0n1p2 1.9G 352ca1aa-5508-4303-9646-cac0e1d791ca 97 | └─nvme0n1p3 236.1G 22aba028-77ae-43a3-a5fb-5d9d05c99ad5 98 | 99 | [Linux]$ lsblk -o +uuid /dev/nvme0n1 100 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT UUID 101 | nvme0n1 259:0 0 238.5G 0 disk 102 | ├─nvme0n1p1 259:1 0 487M 0 part /boot/efi D379-5667 103 | ├─nvme0n1p2 259:2 0 1.9G 0 part [SWAP] 352ca1aa-5508-4303-9646-cac0e1d791ca 104 | └─nvme0n1p3 259:3 0 236.1G 0 part / 22aba028-77ae-43a3-a5fb-5d9d05c99ad5 105 | -------------------------------------------------------------------------------- /docs/Chapter01/00_mkdir.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_mkdir: 2 | 3 | mkdir 新建文件夹 4 | #################################### 5 | 6 | mkdir(make directory)用来新建文件夹,此命令属于 bash 内建命令。 7 | 8 | .. hint:: 9 | 10 | 新建文件夹之前,必须对目标路径具有写和执行的权限,并且不能与路径下的文件夹重名。 11 | 12 | 13 | 命令格式: 14 | ************************************ 15 | 16 | .. highlight:: none 17 | 18 | :: 19 | 20 | mkdir [OPTION]... DIRECTORY... 21 | 22 | 23 | 常用选项: 24 | ************************************ 25 | 26 | :: 27 | 28 | -m, --mode=MODE 29 | 指定文件夹权限(如在 chmod 中),而不是 a=rwx-umask 30 | 31 | -p, --parents 32 | 按路径递归的新建文件夹 33 | 34 | -v, --verbose 35 | 显示详细的执行过程 36 | 37 | 38 | 使用实例: 39 | ************************************ 40 | 41 | :: 42 | 43 | # 新建文件夹 44 | [root@localhost bin]# ls 45 | bbb.py usr 46 | [root@localhost bin]# mkdir abc 47 | [root@localhost bin]# ls -F 48 | abc/ bbb.py usr/ 49 | 50 | # 递归新建文件夹 51 | [root@localhost bin]# mkdir -p abc/aaa/bbb/ccc 52 | [root@localhost bin]# ls -R 53 | .: 54 | abc bbb.py usr 55 | 56 | ./abc: 57 | aaa 58 | 59 | ./abc/aaa: 60 | bbb 61 | 62 | ./abc/aaa/bbb: 63 | ccc 64 | 65 | ./abc/aaa/bbb/ccc: 66 | 67 | 68 | # 新建指定权限的文件夹 69 | [root@localhost bin]# mkdir -m 750 office 70 | [root@localhost bin]# ls -l 71 | total 0 72 | drwxr-x--- 2 root root 6 Feb 15 18:54 office 73 | ... 74 | -------------------------------------------------------------------------------- /docs/Chapter01/00_mv.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_mv: 2 | 3 | mv 移动文件或重命名 4 | #################################### 5 | 6 | mv(move)对文件或目录重命名,或者将文件从一个目录移到另一个目录中。 7 | 8 | 文件被移至目标文件有多种不同的结果: 9 | 10 | ================ =========== 11 | 命令 说明 12 | ================ =========== 13 | mv 文件名 文件名 重命名,将源文件名改为目标文件名 14 | mv 文件名 目录名 移动文件,将文件移动到目标目录 15 | mv 目录名 目录名 目标目录存在,则将源目录移动到目标目录;目标目录不存在则重命名 16 | mv 目录名 文件名 报错 17 | ================ =========== 18 | 19 | 20 | 命令格式: 21 | ************************************ 22 | 23 | .. highlight:: none 24 | 25 | :: 26 | 27 | mv [OPTION]... [-T] SOURCE DEST 28 | mv [OPTION]... SOURCE... DIRECTORY 29 | mv [OPTION]... -t DIRECTORY SOURCE... 30 | 31 | 32 | 常用选项: 33 | ************************************ 34 | 35 | :: 36 | 37 | --backup[=CONTROL] 38 | 若需覆盖文件,则覆盖前先备份 39 | 40 | -f, --force 41 | 强制移动,若目标文件(或目录)与现有的文件重复,则直接覆盖现有的文件 42 | 43 | -i, --interactive 44 | 交互式操作,如果源文件与目标文件同名,覆盖前先询问 45 | 46 | 47 | 使用实例: 48 | ************************************ 49 | 50 | :: 51 | 52 | # 重命名文件 53 | [Linux]$ ls 54 | alias aulastlog 55 | [Linux]$ mv aulastlog aaa 56 | [Linux]$ ls 57 | aaa alias 58 | 59 | # 移动文件到指定目录 60 | [Linux]$ ls 61 | alias aulastlog bin 62 | [Linux]$ mv alias bin/ 63 | [Linux]$ ls 64 | aaa bin 65 | 66 | # 移动文件夹 67 | [Linux]$ ls -F 68 | aaa* bin/ usr/ 69 | [Linux]$ mv bin/ usr/ 70 | [Linux]$ ls -l usr/ 71 | total 0 72 | drwxr-xr-x 2 root root 19 Feb 15 15:33 bin 73 | -------------------------------------------------------------------------------- /docs/Chapter01/00_ps.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_ps: 2 | 3 | ps 查看系统进程快照 4 | #################################### 5 | 6 | ps 命令用于查看当前系统进程的快照,使用该命令可以确定有哪些进程正在运行和运行的状态、哪些进程占用了过多的资源等等。 7 | 8 | 如果想实时更新查看系统的状态,可以使用 :ref:`top 命令 ` ,同时可以搭配 :ref:`kill 命令 ` 随时暂停、终止进程的运行。 9 | 10 | 11 | 命令格式: 12 | ************************************ 13 | 14 | .. highlight:: none 15 | 16 | :: 17 | 18 | ps [OPTION]... 19 | 20 | 21 | 常用选项: 22 | ************************************ 23 | 24 | ps 命令支持三种不用的语法格式: 25 | 26 | 1. UNIX 风格,选项前必须有“-”连字符 27 | 2. BSD 风格,选项前不能有“-”连字符 28 | 3. GNU 风格,选项前有两个“-”连字符 29 | 30 | :: 31 | 32 | -e 33 | 显示所有的进程 34 | 35 | -C 36 | 查找指定的进程,只能实现完全匹配查找,并不实用 37 | 38 | -f 39 | 显示 UID, PPIP, C 与 STIME 栏 40 | 41 | -l 42 | 显示详细的进程状态 43 | 44 | -u 45 | 显示属于该用户的进程状况,默认为当前用户。 46 | 47 | 48 | 使用实例: 49 | ************************************ 50 | 51 | :: 52 | 53 | # 默认输出(几乎没用) 54 | [Linux]$ ps 55 | PID TTY TIME CMD 56 | 6172 pts/0 00:00:00 bash 57 | 7017 pts/0 00:00:00 ps 58 | 59 | # 查找指定进程 60 | [Linux]$ ps -f -C gvim 61 | UID PID PPID C STIME TTY TIME CMD 62 | glenn 6977 1279 1 15:33 ? 00:00:08 gvim -f new.txt 63 | 64 | # 查看所有进程 65 | [Linux]$ ps -ef 66 | UID PID PPID C STIME TTY TIME CMD 67 | root 1 0 0 09:30 ? 00:00:04 /sbin/init 68 | root 2 0 0 09:30 ? 00:00:00 [kthreadd] 69 | root 3 2 0 09:30 ? 00:00:00 [rcu_gp] 70 | ... 71 | 72 | # 查看详细的进程使用状态 73 | [Linux]$ ps -aux 74 | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 75 | root 1 0.0 0.0 164068 10516 ? Ss 09:30 0:04 /sbin/init 76 | root 3 0.0 0.0 0 0 ? I< 09:30 0:00 [rcu_gp] 77 | root 4 0.0 0.0 0 0 ? I< 09:30 0:00 [rcu_par_gp] 78 | ... 79 | 80 | 输出说明: 81 | 82 | - USER: 属主用户 ID 83 | - PID: 进程 id 84 | - %CPU: 该进程使用的 CPU 百分比 85 | - %MEM: 该进程使用的物理内存百分比 86 | - VSZ: 该进程使用的虚拟内存量 87 | - RSS: 该进程使用的固定内存量 88 | - TTY: 该进程在那个终端机上面运作,若与终端机无关,则显示 ? 89 | - STAT: 该进程的状态: 90 | - D: 无法中断的休眠状态 (通常 IO 的进程) 91 | - R: 正在执行中 92 | - S: 睡眠状态 93 | - T: 暂停执行 94 | - Z: 不存在但暂时无法消除(zombie 疆尸进程) 95 | - W: 没有足够的记忆体分页可分配 96 | - <: 高优先序的行程 97 | - N: 低优先序的行程 98 | - L: 有记忆体分页分配并锁在记忆体内 (实时系统或 I/O) 99 | - START: 进程被触发的时间 100 | - TIME: 进程执行的时间 101 | - COMMAND: 进程执行的指令 102 | -------------------------------------------------------------------------------- /docs/Chapter01/00_pwd.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_pwd: 2 | 3 | pwd 显示工作目录 4 | #################################### 5 | 6 | pwd 命令是 Linux 中最常用的命令之一,它用于显示当前工作路径。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | pwd [OPTION]... 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -L, --logical 25 | 显示符号链接自身的路径(默认值) 26 | 27 | -P, --physical 28 | 显示符号链接所指向的文件路径 29 | 30 | 31 | 使用实例: 32 | ************************************ 33 | 34 | :: 35 | 36 | [Linux]$ cd / 37 | [Linux]$ pwd 38 | / 39 | 40 | # 显示符号链接路径(默认值) 41 | [Linux]$ cd /lib 42 | [[Linux]$ pwd -L 43 | /lib 44 | 45 | # 显示符号链接所指向的路径 46 | [[Linux]$ pwd -P 47 | /usr/lib 48 | -------------------------------------------------------------------------------- /docs/Chapter01/00_rm.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_rm: 2 | 3 | rm 删除文件或目录 4 | #################################### 5 | 6 | rm(remove)删除文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除。 7 | 8 | 9 | .. danger:: 10 | 11 | 使用 rm 命令要格外小心。因为一旦删除了一个文件,就无法再恢复它。 12 | 13 | 14 | 命令格式: 15 | ************************************ 16 | 17 | .. highlight:: none 18 | 19 | :: 20 | 21 | rm [OPTION]... FILE... 22 | 23 | 24 | 常用选项: 25 | ************************************ 26 | 27 | :: 28 | 29 | -d, --dir 30 | 删除空目录 31 | 32 | -f, --force 33 | 强制删除文件或目录,不给出提示 34 | 35 | -i 36 | 删除文件或目录之前先询问用户 37 | 38 | -r, -R, --recursive 39 | 递归处理,将指定目录下的所有文件与子目录一并删除 40 | 41 | 42 | 使用实例: 43 | ************************************ 44 | 45 | :: 46 | 47 | # 删除文件 48 | [Linux]$ rm aclocal 49 | 50 | # 删除文件前先确认 51 | [Linux]$ rm -i apxs 52 | rm: remove regular file ‘apxs’? y 53 | 54 | # 递归删除文件夹 55 | [Linux]$ ls -F 56 | alias* aulastlog* bin/ binBk/ 57 | [Linux]$ rm -r binBk/ 58 | [Linux]$ ls 59 | alias aulastlog bin 60 | 61 | # 强制递归删除文件夹(非常危险的命令) 62 | [Linux]$ rm -rf doc/ 63 | -------------------------------------------------------------------------------- /docs/Chapter01/00_scp.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_scp: 2 | 3 | scp 远程复制文件 4 | #################################### 5 | 6 | scp 是 secure copy 的简写,用于在本机和服务器或两台服务器之间远程复制文件,而且 scp 传输是加密的。另外,scp 还非常节省资源,不会占用太多系统负荷。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | scp [-346ABCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] 17 | [-J destination] [-l limit] [-o ssh_option] [-P port] 18 | [-S program] source ... target 19 | 20 | 21 | 22 | 常用选项: 23 | ************************************ 24 | 25 | :: 26 | 27 | -4 28 | 只使用IPv4寻址 29 | 30 | -6 31 | 只使用IPv6寻址 32 | 33 | -p 34 | 保留原文件的修改时间,访问时间和访问权限。 35 | 36 | -r 37 | 递归复制整个目录。 38 | 39 | -v 40 | 详细显示过程信息。 41 | 42 | -P 43 | 指定数据传输的端口号。 44 | 45 | 46 | 使用实例: 47 | *********************** 48 | 49 | :: 50 | 51 | # 复制(上传)本机文件到服务器 52 | [Linux]$ scp ~/Music/1.mp3 pi@www.pi.com:/home/pi/Music 53 | 1.mp3 100% 2674 8.4KB/s 00:00 54 | 55 | # 复制(上传)本机文件到服务器并重命名 56 | [Linux]$ scp ~/Music/1.mp3 pi@www.pi.com:/home/pi/Music/a.mp3 57 | 1.mp3 100% 2674 8.4KB/s 00:00 58 | 59 | # 复制(上传)本机文件夹到服务器并重命名 60 | [Linux]$ scp -r ~/Music/ pi@www.pi.com:/home/pi/ 61 | 1.mp3 100% 2674 8.4KB/s 00:00 62 | 2.mp3 100% 523 81.0KB/s 00:00 63 | 3.mp3 100% 3463 119.9KB/s 00:00 64 | 65 | # 复制(下传)服务器文件到本机 66 | [Linux]$ scp pi@www.pi.com:/home/pi/Music/1.mp3 ~/Music 67 | 1.mp3 100% 2674 8.4KB/s 00:00 68 | 69 | 70 | # 复制(下传)服务器文件到本机 71 | # 如果服务器防火墙为 scp 设置了端口号,传输时需要指定端口号 72 | [Linux]$ scp -P 12345 pi@www.pi.com:/home/pi/Music/1.mp3 ~/Music 73 | 1.mp3 100% 2674 8.4KB/s 00:00 74 | -------------------------------------------------------------------------------- /docs/Chapter01/00_ssh-keygen.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_ssh-keygen: 2 | 3 | ssh-keygen 生成密钥 4 | #################################### 5 | 6 | ssh-keygen 命令是 :doc:`OpenSSH <../Chapter02/00_openssh>` 程序提供的一个密钥生成、管理和转换工具,支持 RSA 和 DSA 两种认证密钥。生成的密钥文件默认存储在 ``~/.ssh/`` 目录下,id_rsa 为私钥文件,id_rsa.pub 为公钥文件。 7 | 8 | .. hint:: RSA 和 DSA 加密算法 9 | 10 | RSA 和 DSA 都是非对称加密算法。其中 RSA 的安全性是基于极其困难的大整数的分解(两个素数的乘积);DSA 的安全性是基于整数有限域离散对数难题。基本上相同密钥长度的 RSA 算法与 DSA 算法安全性相当。 11 | 12 | DSA 只能用于数字签名,无法用于加密(某些扩展可以支持加密);RSA 即可作为数字签名,也可以作为加密算法。不过作为加密使用的 RSA 有着随密钥长度增加,性能急剧下降的问题。 13 | 14 | 相同密钥长度下,DSA (在扩展支持下)解密密文更快,而加密更慢;RSA 正好反过来,一般来说解密次数多于加密次数。不过由于非对称加密算法的先天性能问题,两者都不是加密的好选择。 15 | 16 | 通常情况下 RSA 是首选,它具有更为广泛的部署与支持。 17 | 18 | 19 | .. attention:: 20 | 21 | 生成密钥以后,建议修改私钥的权限,防止其它用户读取。 22 | 23 | :: 24 | 25 | [Linux]$ chmod 600 ~/.ssh/id_rsa 26 | 27 | 28 | 命令格式: 29 | ************************************ 30 | 31 | .. highlight:: none 32 | 33 | :: 34 | 35 | ssh-keygen [OPTION]... 36 | 37 | 38 | 常用选项: 39 | ************************************ 40 | 41 | :: 42 | 43 | -b 44 | 指定密钥的二进制位数,建议设为 2048 或者更高,一般为 1024 的倍数 45 | 46 | -C 47 | 为密钥文件指定新的注释,格式为 username@host 48 | 49 | -f 50 | 指定生成的文件名 51 | 52 | -F 53 | 检查某个主机名是否在 known_hosts 文件里面。 54 | 55 | -N 56 | 指定私钥的密码 57 | 58 | -p 59 | 重新指定私钥的密码。它与 -N 不同,新密码不在执行后再输入 60 | 61 | -R 62 | 将指定的主机公钥指纹移出 known_hosts 文件。 63 | 64 | -t 65 | 参数用于指定生成密钥的加密算法,一般为dsa或rsa 66 | 67 | 68 | 使用实例: 69 | ************************************ 70 | 71 | :: 72 | 73 | # 默认问题 74 | [Linux]$ ssh-keygen -t dsa 75 | Generating public/private dsa key pair. 76 | 77 | # 可以指定文件路径,直接回车即可 78 | Enter file in which to save the key (/home/username/.ssh/id_dsa): press ENTER 79 | 80 | # 设置密码,该密码是每次使用密钥时需要的密码,直接回车可以不设密码 81 | Enter passphrase (empty for no passphrase): ******** 82 | Enter same passphrase again: ******** 83 | 84 | # 公钥和私钥的存放路径和密钥指纹 85 | Your identification has been saved in /home/username/.ssh/id_dsa. 86 | Your public key has been saved in /home/username/.ssh/id_dsa.pub. 87 | The key fingerprint is: 88 | 14:ba:06:98:a8:98:ad:27:b5:ce:55:85:ec:64:37:19 username@shell.isp.com 89 | 90 | 91 | # 指定加密算法、位数和注释 92 | [Linux]$ ssh-keygen -t rsa -b 4096 -C "your_email@domain.com" 93 | -------------------------------------------------------------------------------- /docs/Chapter01/00_systemctl.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_systemctl: 2 | 3 | systemctl 基本工具 4 | #################################### 5 | 6 | systemctl 是一个 :ref:`systemd ` 工具,主要负责控制 systemd 系统和服务管理器。 7 | 8 | systemctl 命令有两大类功能: 9 | 10 | - 控制 systemd 系统 11 | - 管理系统上运行的服务(Unit 单元) 12 | 13 | 14 | 命令格式: 15 | ************************************ 16 | 17 | .. highlight:: none 18 | 19 | :: 20 | 21 | systemctl [OPTIONS...] {COMMAND} ... 22 | 23 | 24 | 常用选项: 25 | ************************************ 26 | 27 | :: 28 | 29 | -h --help 30 | 显示帮助 31 | 32 | -t --type=TYPE 33 | 显示指定类型的单元 34 | 35 | -p --property=NAME 36 | 仅显示指定名称的属性 37 | 38 | -l --full 39 | 不要在输出中省略单元名称 40 | 41 | -s --signal=SIGNAL 42 | 指定发送信号 43 | 44 | -q --quiet 45 | 抑制输出 46 | 47 | -n --lines=INTEGER 48 | 显示的日志条目数 49 | 50 | 51 | Unit 命令 52 | ++++++++++++++++++++++++++++++++++++ 53 | 54 | :: 55 | 56 | list-units [PATTERN...] 57 | 列出当前在内存中的单元 58 | 59 | list-sockets [PATTERN...] 60 | 列出当前在内存中的套接字单元,按地址排序 61 | 62 | list-timers [PATTERN...] 63 | 列出当前在内存中的计时器单元,按下一次的顺序排列 64 | 65 | start UNIT... 66 | 启动(激活)一个或多个单位 67 | 68 | stop UNIT... 69 | 停止(关闭)一个或多个单元 70 | 71 | restart UNIT... 72 | 启动或重启一个或多个单元 73 | 74 | reload UNIT... 75 | 重新加载一个或多个单元的配置文件 76 | 77 | status UNIT... 78 | 查看单元的运行状态 79 | 80 | show [PATTERN...|JOB...] 81 | 显示一个或多个单元/进程的配置文件参数 82 | 83 | isolate UNIT 84 | 启动一个单元,停止所有其他单元 85 | 86 | mask UNIT 87 | 禁用一个单元(禁用后,也不可以间接启动): 88 | 89 | unmask UNIT 90 | 取消禁用一个单元 91 | 92 | kill UNIT... 93 | 杀死(结束)一个或多个单元的所有子进程 94 | 95 | list-dependencies [UNIT] 96 | 递归地显示单元所需要的单元 97 | 98 | 99 | Unit 文件命令 100 | ++++++++++++++++++++++++++++++++++++ 101 | 102 | :: 103 | 104 | list-unit-files [PATTERN...] 105 | 列出已安装的单元文件 106 | 107 | enable [UNIT...|PATH...] 108 | 开机自启(一个或多个单元文件) 109 | 110 | disable UNIT... 111 | 禁止开机自启(一个或多个单元文件) 112 | 113 | reenable UNIT... 114 | 重新启用(一个或多个单元文件) 115 | 116 | is-enabled UNIT... 117 | 检查单元文件是否启用 118 | 119 | edit UNIT... 120 | 编辑一个或多个单元文件 121 | 122 | 123 | 系统命令 124 | ++++++++++++++++++++++++++++++++++++ 125 | 126 | :: 127 | 128 | default 129 | 进入系统默认模式 130 | 131 | rescue 132 | 进入系统救援模式 133 | 134 | emergency 135 | 进入系统应急模式 136 | 137 | poweroff 138 | 退出系统并关闭电源 139 | 140 | reboot [ARG] 141 | 重新启动系统 142 | 143 | suspend 144 | 挂起(待机)系统 145 | 146 | hibernate 147 | 休眠系统 148 | 149 | hybrid-sleep 150 | 混合休眠模式(硬盘同时休眠并待机) 151 | 152 | 153 | systemctl 的大部分命令后都可以跟多个单元名。 systemctl 命令在 enable、disable 和 mask 子命令中增加了 --now 选项,可以实现激活的同时启动服务,取消激活的同时停止服务。 154 | 155 | 使用实例: 156 | ************************************ 157 | 158 | :: 159 | 160 | # 立即激活单元(开启软件): 161 | [Linux]# systemctl start <单元> 162 | 163 | 164 | # 立即停止单元(关闭软件): 165 | [Linux]# systemctl stop <单元> 166 | 167 | 168 | # 重启单元(重启软件): 169 | [Linux]# systemctl restart <单元> 170 | 171 | 172 | # 输出单元运行状态: 173 | [Linux]# systemctl status nginx.service 174 | ● nginx.service - A high performance web server and a reverse proxy server 175 | Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) 176 | Active: active (running) since Wed 2021-07-28 18:52:28 CST; 3h 50min ago 177 | Docs: man:nginx(8) 178 | Process: 711 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=e 179 | Process: 716 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, st 180 | Main PID: 717 (nginx) 181 | Tasks: 2 (limit: 515) 182 | Memory: 10.0M 183 | CGroup: /system.slice/nginx.service 184 | ├─717 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; 185 | └─718 nginx: worker process 186 | 187 | 188 | # 查看单元的配置参数 189 | [Linux]# systemctl show nginx 190 | Type=forking 191 | Restart=no 192 | PIDFile=/run/nginx.pid 193 | NotifyAccess=none 194 | RestartUSec=100ms 195 | TimeoutStartUSec=1min 30s 196 | TimeoutStopUSec=5s 197 | RuntimeMaxUSec=infinity 198 | ExecMainStatus=0 199 | ... 200 | 201 | 202 | # 检查单元是否配置为自动启动: 203 | [Linux]# systemctl is-enabled nginx 204 | enabled 205 | 206 | 207 | # 设置单元为自动启动并立即启动这个单元: 208 | [Linux]# systemctl enable --now nginx 209 | 210 | 211 | # 重启系统: 212 | [Linux]# systemctl reboot 213 | 214 | 215 | # 退出系统并关闭电源: 216 | [Linux]# systemctl poweroff 217 | -------------------------------------------------------------------------------- /docs/Chapter01/00_tail.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_tail: 2 | 3 | tail 查看文件的末尾内容 4 | #################################### 5 | 6 | tail 用于查看文件的末尾内容,默认为文末 10 行。 7 | 8 | 命令格式: 9 | ************************************ 10 | 11 | .. highlight:: none 12 | 13 | :: 14 | 15 | tail [OPTION]... [FILE]... 16 | 17 | 18 | 常用选项: 19 | ************************************ 20 | 21 | :: 22 | 23 | -f, --follow[={name|descriptor}] 24 | 循环读取文件内容,常用于查看日志写入 25 | 26 | -n, --lines=[+]NUM 27 | 指定查看的行数,如果有 + 号,则查看该行之后的所有内容 28 | 29 | 30 | 使用实例: 31 | ************************************ 32 | 33 | :: 34 | 35 | [Linux]$ tail /etc/samba/smb.conf 36 | [global] 37 | map to guest = Bad User 38 | log file = /var/log/samba/%m 39 | log level = 1 40 | 41 | [guest] 42 | path = /mnt/samba/ 43 | read only = no 44 | guest ok = yes 45 | guest only = yes 46 | 47 | 48 | [Linux]$ tail -n 3 /etc/samba/smb.conf 49 | read only = no 50 | guest ok = yes 51 | guest only = yes 52 | 53 | # 在行号前加入 + 会从文件开头算起 54 | [Linux]$ tail -n +3 /etc/samba/smb.conf 55 | log file = /var/log/samba/%m 56 | log level = 1 57 | 58 | [guest] 59 | path = /mnt/vmware/samba/ 60 | read only = no 61 | guest ok = yes 62 | guest only = yes 63 | 64 | -------------------------------------------------------------------------------- /docs/Chapter01/00_tee.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_tee: 2 | 3 | tee 输出分流 4 | #################################### 5 | 6 | tee 命令会从标准输入读取数据,将数据输出到标准输出,同时保存到文件中。如果指定的文件不存在,那么 tee 命令会创建这个文件;如果文件存在则覆盖原有文件中的内容。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | tee [OPTION]... [FILE]... 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -a, --append 25 | 追加到原有文件的后面,而非覆盖它 26 | 27 | -i, --ignore-interrupts 28 | 忽略中断信号 29 | 30 | 31 | 使用实例: 32 | ************************************ 33 | 34 | :: 35 | 36 | # 将输出保存到多个文件中 37 | [Linux]$ ls | tee a.txt b.txt 38 | a.txt 39 | b.txt 40 | Desktop 41 | Documents 42 | Downloads 43 | Music 44 | Pictures 45 | Public 46 | Templates 47 | 48 | # 将命令输出保存到文件中 49 | [Linux]$ who | tee w.txt 50 | glenn :1 2020-08-23 20:52 (:1) 51 | glenn@glenn-ThinkPad:~$ cat w.txt 52 | glenn :1 2020-08-23 20:52 (:1) 53 | 54 | # 查看多个文件中的内容,并保存 55 | [Linux]$ cat a.txt b.txt | tee all.txt | less 56 | -------------------------------------------------------------------------------- /docs/Chapter01/00_top.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_top: 2 | 3 | top 查看系统状态 4 | #################################### 5 | 6 | top 命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。同时 top 命令也提供互动式界面,用热键可以管理。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | top -hv|-bcEeHiOSs1 -d secs -n max -u|U user -p pids -o field -w [cols] 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -d 25 | 指定更新时间(单位秒,如果有小数点则换算成 ms,默认值 5) 26 | 27 | -u 28 | 指定用户名 29 | 30 | -p 31 | 指定进程号 32 | 33 | -n 34 | 指定更新的次数,完成后退出 35 | 36 | -S 37 | 累积模式 38 | 39 | 40 | 交互式命令: 41 | ==================================== 42 | 43 | ====== ====== 44 | 命令 说明 45 | ====== ====== 46 | h 显示帮助 47 | k 终止一个进程,首先输入进程号,然后输入发送的信号(15 或 9) 48 | i 显示/隐藏闲置和僵死的进程 49 | q 退出 50 | r 重新设置一个进程的优先级别(数值越小优先级越高) 51 | S 切换到累计模式 52 | s 改变更新时间 53 | c 显示/隐藏完整命令行 54 | l 显示/隐藏平均负载和启动时间信息(即第一行) 55 | t 显示/切换/隐藏进程和 CPU 状态信息(即第二和第三行) 56 | m 显示/切换/隐藏内存信息(即第四和第五行) 57 | n 设置显示进程的数量 58 | N 以 PID 的大小进行排序 59 | P 以 CPU 占用率进行排序 60 | M 以内存占用率大小进行排序 61 | T 根据时间/累计时间进行排序 62 | w 将当前设置写入 ``~/.toprc`` 文件中 63 | ====== ====== 64 | 65 | 66 | 使用实例: 67 | ************************************ 68 | 69 | :: 70 | 71 | # 默认输出 72 | [Linux]$ top 73 | top - 18:02:42 up 8:32, 1 user, load average: 0.57, 0.61, 0.95 74 | Tasks: 251 total, 1 running, 250 sleeping, 0 stopped, 0 zombie 75 | %Cpu(s): 3.7 us, 2.2 sy, 0.0 ni, 94.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 76 | MiB Mem : 23665.3 total, 20068.8 free, 1731.2 used, 1865.3 buff/cache 77 | MiB Swap: 977.0 total, 977.0 free, 0.0 used. 21354.1 avail Mem 78 | 79 | PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 80 | 1300 glenn 20 0 2469984 31268 22272 S 6.7 0.1 3:24.92 pulseaudio 81 | 1547 glenn 20 0 317344 23052 6744 S 6.7 0.1 2:11.17 ibus-daemon 82 | 8982 glenn 20 0 1856612 138784 77872 S 6.7 0.6 0:55.73 rhythmbox 83 | 9735 glenn 20 0 10228 3788 3168 R 6.7 0.0 0:00.01 top 84 | 1 root 20 0 164068 10516 7784 S 0.0 0.0 0:04.12 systemd 85 | 2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd 86 | 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 87 | 88 | 89 | 输出说明: 90 | 91 | 第一行,系统运行时间和平均负载: 92 | 93 | :: 94 | 95 | top - 18:02:42 up 8:32, 1 user, load average: 0.57, 0.61, 0.95 96 | 97 | - 当前时间 98 | - 已运行时间 99 | - 当前登录用户的数量 100 | - 最近 5、10 和 15 分钟内的系统平均负载 101 | 102 | 第二行,进程任务: 103 | 104 | :: 105 | 106 | Tasks: 251 total, 1 running, 250 sleeping, 0 stopped, 0 zombie 107 | 108 | - total 系统进程总数 109 | - running 处于运行中的进程 110 | - sleeping 睡眠的进程总数 111 | - stoped 停止的进程总数 112 | - zombie 僵尸进程总数 113 | 114 | 第三行,CPU 状态: 115 | 116 | :: 117 | 118 | %Cpu(s): 3.7 us, 2.2 sy, 0.0 ni, 94.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 119 | 120 | 121 | 不同模式下所占 cpu 时间百分比: 122 | 123 | - us(user): 运行(未调整优先级) 用户进程的 CPU 时间 124 | - sy(system): 运行内核进程的 CPU 时间 125 | - ni(niced):运行已调整优先级用户进程的 CPU 时间 126 | - wa(IO wait): 用于等待 IO 完成的 CPU 时间 127 | - hi:处理硬件中断的 CPU 时间 128 | - si: 处理软件中断的 CPU CPU时间 129 | - st:虚拟机模式中处理 hypervisor 的 CPU 时间 130 | 131 | 第四和第五行,内存使用: 132 | 133 | :: 134 | 135 | MiB Mem : 23665.3 total, 20068.8 free, 1731.2 used, 1865.3 buff/cache 136 | MiB Swap: 977.0 total, 977.0 free, 0.0 used. 21354.1 avail Mem 137 | 138 | - Mem:物理内存 139 | - Swap:虚拟内存 140 | - total:内存总量 141 | - used:使用中的内存总量 142 | - free:空闲内存总量 143 | - buffers:缓存的内存量 144 | 145 | 各进程的状态: 146 | 147 | :: 148 | 149 | PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 150 | 151 | - PID:进程 ID,进程的唯一标识符 152 | - USER:进程所有者(用户名) 153 | - PR:进程的调度优先级,'rt'表示进程运行在实时态 154 | - NI:进程的 nice 值(优先级)。越小的值意味着越高的优先级,可以是负值 155 | - VIRT:进程使用的虚拟内存总量(单位 kb) 156 | - RES:使用中的未被换出的物理内存大小(单位 kb) 157 | - SHR:使用的共享内存大小(单位 kb) 158 | - S:进程的状态: 159 | - D 不可中断的睡眠状态 160 | - R 运行状态 161 | - S 睡眠状态 162 | - T 被跟踪或已停止状态 163 | - Z 僵尸状态 164 | - %CPU:两次更新时间之间所使用的 CPU 百分比 165 | - %MEM:进程使用的可用物理内存百分比 166 | - TIME+:任务启动后到现在所使用的全部 CPU 时间,精确到百分之一秒 167 | - COMMAND:运行进程所使用的命令 168 | 169 | 170 | .. hint:: 切换排序列 171 | 172 | top 默认是以 CPU 的占用比排序。可以通过 ``SHIFT+>`` 键向右或 ``SHIFT+>`` 向左改变排序列。 173 | -------------------------------------------------------------------------------- /docs/Chapter01/00_touch.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_touch: 2 | 3 | touch 新建文件 4 | #################################### 5 | 6 | touch 命令有两个功能: 7 | 8 | 1. 新建一个或多个空文件 9 | 2. 更新一个或多个文件的时间标签(文件内容不会改动) 10 | 11 | 12 | 命令格式: 13 | ************************************ 14 | 15 | .. highlight:: none 16 | 17 | :: 18 | 19 | touch [OPTION]... FILE... 20 | 21 | 22 | 常用选项: 23 | ************************************ 24 | 25 | :: 26 | 27 | -a 28 | 只更改存取时间 29 | 30 | -d, --date=STRING 31 | 使用指定的日期时间,而非现在的时间 32 | 33 | -m 34 | 只更该变动时间 35 | 36 | -r, --reference=FILE 37 | 按指定文件的时间更新时间 38 | 39 | 40 | 使用实例: 41 | *********************** 42 | 43 | :: 44 | 45 | [Linux]$ ls 46 | aaa bbb 47 | [Linux]$ touch ccc 48 | [Linux]$ ls 49 | aaa bbb ccc 50 | -------------------------------------------------------------------------------- /docs/Chapter01/00_type.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_type: 2 | 3 | type 查看命令类型 4 | #################################### 5 | 6 | type 命令用于查看命令的类型,它是 shell 的内部命令,命令类型可以分为以下几种: 7 | 8 | 1. builtin 内建命令。Shell 内建命令,例如:cd 命令。 9 | 2. keyword 关键字,Shell 保留字。 10 | 3. function 函数,Shell 函数是小规模的 Shell 脚本,它们混合到环境变量中。 11 | 4. alias 命令别名。 12 | 5. file 文件。磁盘文件、外部命令。 13 | 6. unfound 没有找到。 14 | 15 | 16 | 命令格式: 17 | ************************************ 18 | 19 | .. highlight:: none 20 | 21 | :: 22 | 23 | type [-aftpP] name [name ...] 24 | 25 | 26 | 常用选项: 27 | ************************************ 28 | 29 | :: 30 | 31 | -a 32 | 显示所有匹配的类型 33 | 34 | -p 35 | 如果给出的指令为外部指令,则显示其绝对路径 36 | 37 | 38 | 使用实例: 39 | ************************************ 40 | 41 | :: 42 | 43 | # 查看 ls 的命令类型 44 | [Linux]$ type ls 45 | ls is aliased to `ls --color=tty' 46 | 47 | # 查看所有匹配 ls 的命令类型 48 | [Linux]$ type -a ls 49 | ls is aliased to `ls --color=tty' 50 | ls is /bin/ls 51 | 52 | # 各种类型的输出 53 | [Linux]$ type cd 54 | cd is a shell builtin 55 | 56 | [Linux]$ type date 57 | date is /bin/date 58 | 59 | [Linux]$ type mysql 60 | mysql is /usr/bin/mysql 61 | 62 | [Linux]$ type nginx 63 | -bash: type: nginx: not found 64 | 65 | [Linux]$ type if 66 | if is a reserved word 67 | -------------------------------------------------------------------------------- /docs/Chapter01/00_unzip.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_unzip: 2 | 3 | unzip 解压 zip 4 | #################################### 5 | 6 | unzip 命令用于解压缩 zip 压缩包。压缩命令为 :doc:`00_zip` 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | unzip [-Z] [-cflptTuvz[abjnoqsCDKLMUVWX$/:^]] file[.zip] [file(s) ...] 17 | [-x xfile(s) ...] [-d exdir] 18 | 19 | 20 | 常用选项: 21 | ************************************ 22 | 23 | :: 24 | 25 | -f 26 | 对比文件,只解压比已有的文件修改时间要新的文件 27 | 28 | -l 29 | 列出压缩包中的所有文件 30 | 31 | -t 32 | 检验压缩包中的文件 33 | 34 | -u 35 | 与 -f 参数类似,但除了更新现有的文件外,也会解压缩文件中没有的文件 36 | 37 | -v 38 | 显示详细的执行过程 39 | 40 | -C 41 | 解压时不区分大小写文件名 42 | 43 | -j 44 | 不处理压缩文件中原有的目录路径 45 | 46 | -L 47 | 将压缩包中的全部文件名改为小写 48 | 49 | -M 50 | 将输出结果送到 more 程序处理 51 | 52 | -n 53 | 解压缩时不覆盖原有的文件 54 | 55 | -o 56 | 解压时不提示用户,直接覆盖原有的文件 57 | 58 | -P 59 | 使用 zip 的密码选项 60 | 61 | -q 62 | 安静模式(不显示任何提示信息) 63 | 64 | -s 65 | 将文件名中的空格转换为下划线 66 | 67 | -d 68 | 指定解压的文件路径 69 | 70 | -x 71 | 解压时排除符合条件的文件 72 | 73 | 74 | 使用实例: 75 | ************************************ 76 | 77 | :: 78 | 79 | # 解压文件,默认解压到当前目录: 80 | [Linux]$ unzip test.zip 81 | 82 | # 解压文件到指定目录 83 | [Linux]$ unzip test.zip -d /media 84 | 85 | # 查看压缩包中的内容 86 | [Linux]$ unzip -l test.zip 87 | Archive: test.zip 88 | Length Date Time Name 89 | --------- ---------- ----- ---- 90 | 0 2020-11-30 17:50 test/ 91 | 23208 2020-11-23 09:18 test/appendix.html 92 | 37051 2020-11-23 09:18 test/floatingpoint.html 93 | ... 94 | -------------------------------------------------------------------------------- /docs/Chapter01/00_wc.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_wc: 2 | 3 | wc 统计数 4 | #################################### 5 | 6 | wc 用于统计文件中的行数、字数、字节数等信息。如果没有指定文件名,则从标准输入读取。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | wc [OPTION]... [FILE]... 17 | wc [OPTION]... --files0-from=F 18 | 19 | 20 | 常用选项: 21 | ************************************ 22 | 23 | :: 24 | 25 | -c, --bytes 26 | 统计字节数 27 | 28 | -m, --chars 29 | 统计字符数 30 | 31 | -l, --lines 32 | 统计行数 33 | 34 | -L, --max-line-length 35 | 统计最长行的长度 36 | 37 | -w, --words 38 | 统计单词字数(被分隔的字符串) 39 | 40 | 41 | 使用实例: 42 | ************************************ 43 | 44 | :: 45 | 46 | # 默认输出 行数 单词数 字节数 47 | [Linux]$ wc file.txt 48 | 4 6 29 file.txt 49 | 50 | # 统计多个文件 51 | [Linux]$ wc file.txt a.txt 52 | 5 7 112 file.txt 53 | 1 1 10 a.txt 54 | 6 8 122 total 55 | 56 | # 统计行数 57 | [Linux]$ wc -l file.txt 58 | 5 file.txt 59 | 60 | # 统计当前目录下的文件数(文件名不能有空格) 61 | [Linux]$ ls | wc -w 62 | 7 63 | 64 | # 统计当前目录下的文件数(total 行也计算在内) 65 | [Linux]$ ls | wc -l 66 | 8 67 | -------------------------------------------------------------------------------- /docs/Chapter01/00_wget.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_wget: 2 | 3 | wget 下载文件 4 | #################################### 5 | 6 | wget 是在命令行中下载文件的工具。wget 支持 HTTP,HTTPS 和 FTP 协议,还可使用 HTTP 代理。 7 | 8 | wget 可以跟踪 HTML 页面上的链接依次下载来创建远程服务器的本地副本,常被称作“递归下载”。在递归下载的时候,wget 遵循 Robot Exclusion 标准(robots.txt)。wget 非常稳定,在带宽有限和不稳定的网络中有很强的适应性。当下载文件失败时,wget 会不断的尝试继续下载,直到整个文件下载完毕。 9 | 10 | 11 | 命令格式 12 | ************************************ 13 | 14 | .. highlight:: none 15 | 16 | :: 17 | 18 | wget [option]... [URL]... 19 | 20 | 21 | 常用选项: 22 | ************************************ 23 | 24 | :: 25 | 26 | -b, –background 27 | 启动后转入后台执行 28 | 29 | -q, –quiet 30 | 安静模式(没有输出) 31 | 32 | -v, –verbose 33 | 冗长模式,显示详细信息(默认设置) 34 | 35 | -c, –continue 36 | 继续下载没下载完的文件 37 | 38 | -N, –timestamping 39 | 不要重新下载文件除非比本地文件新 40 | 41 | -T, –timeout=SECONDS 42 | 设定响应超时的秒数 43 | 44 | -Y, -proxy=on/off 45 | 打开或关闭代理 46 | 47 | -P, –directory-prefix=PREFIX 48 | 指定下载的目录 49 | 50 | -U, –user-agent=AGENT 51 | 设定代理的名称为 AGENT 而不是 Wget/VERSION 52 | 53 | cookies=off 54 | 不使用 cookies 55 | 56 | passive-ftp 57 | FTP 选项,使用被动传输模式(缺省值) 58 | 59 | active-ftp 60 | FTP 选项,使用主动传输模式 61 | 62 | -r, –recursive 63 | 递归下载--慎用! 64 | 65 | -l, –level=NUMBER 66 | 最大递归深度(inf 或 0 代表无穷) 67 | 68 | -A, –accept=LIST 69 | 分号分隔的被接受扩展名的列表 70 | 71 | 72 | 使用实例: 73 | ************************************ 74 | 75 | :: 76 | 77 | # 下载单个文件,在下载过程中显示详细信息 78 | [Linux]$ wget https://wordpress.org/latest.tar.gz 79 | 80 | # 下载文件并重命名,默认以最后一个 / 后面的字符来命名 81 | [Linux]$ wget -O wordpress.tgz https://wordpress.org/latest.tar.gz 82 | 83 | # 断点续传,继续下载中断的文件 84 | [Linux]$ wget -c 85 | 86 | # 后台下载 87 | [Linux]$ wget -b https://wordpress.org/latest.tar.gz 88 | Continuing in background, pid 1840. 89 | Output will be written to 'wget-log'. 90 | [Linux]$ tail wget-log 91 | 92 | # 下载多个文件,需要一个下载链接文件 93 | [Linux]$ cat filelist.txt 94 | https://wordpress.org/latest.tar.gz 95 | https://wordpress.org/latest.zip 96 | [Linux]$ wget -i filelist.txt 97 | 98 | # 下载指定格式的文件 99 | [Linux]$ wget -r -A .pdf,jpg https://wordpress.org/ 100 | 101 | 102 | 高级用法 103 | ==================================== 104 | 105 | 1. 镜像网站(下载整个网站到本地) 106 | 107 | :: 108 | 109 | [Linux]$ wget -mirror -p --convert-links -page-requisites URL 110 | 111 | * -m:镜像下载 112 | * -p:下载所有 html 页面显示正常的文件 113 | * -convert-links:下载后,转换成本地的链接 114 | * -page-requisites:下载额外的东西,如样式表 115 | 116 | 117 | 2. 载 FTP 服务器中的文件 118 | 119 | :: 120 | 121 | # 匿名下载 122 | [Linux]$ wget ftp-url 123 | 124 | # 指定用户名和密码 125 | [Linux]$ wget --ftp-user=USERNAME --ftp-password=PASSWORD url 126 | -------------------------------------------------------------------------------- /docs/Chapter01/00_whereis.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_whereis: 2 | 3 | whereis 搜索命令文件 4 | #################################### 5 | 6 | whereis 命令可以查找指定命令的二进制文件、源文件和帮助文件。 被找到的文件在显示时,会去掉主路径名,然后再去掉文件的单个尾部扩展名(如: ``.c`` ),源于源代码控制的 ``s.`` 前缀也会被去掉。接下来,whereis 会尝试在标准的 Linux 位置里寻找具体程序,也会在由 ``$PATH`` 和 ``$MANPATH`` 指定的路径中寻找。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | whereis [options] [-BMS directory... -f] name... 17 | 18 | 19 | 常用选项: 20 | ************************************ 21 | 22 | :: 23 | 24 | -b 25 | 只搜索二进制文件 26 | 27 | -m 28 | 只搜索man手册 29 | 30 | -s 31 | 只搜索源码文件 32 | 33 | -u 34 | 仅显示具有异常项的命令名 35 | 36 | -l 37 | 输出有效查找路径 38 | 39 | 40 | 使用实例: 41 | ************************************ 42 | 43 | :: 44 | 45 | # 寻找二进制文件所在位置 46 | [Linux]$ whereis ls 47 | ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz 48 | 49 | # 只搜索二进制文件 50 | [Linux]$ whereis -b ls 51 | ls: /usr/bin/ls 52 | 53 | # 指定多个搜索位置 54 | # -f 为必须项,用来明确分隔目录列表和要搜索的文件名。 55 | [Linux]$ whereis -B /usr/bin/ -f ls 56 | ls: /usr/share/man/man1/ls.1.gz /usr/bin/ls 57 | 58 | # 查看搜索路径 59 | [Linux]$ whereis -l 60 | bin: /usr/bin 61 | bin: /usr/sbin 62 | bin: /usr/lib/x86_64-linux-gnu 63 | bin: /usr/lib 64 | bin: /usr/lib64 65 | bin: /etc 66 | bin: /usr/games 67 | bin: /usr/local/bin 68 | bin: /usr/local/sbin 69 | bin: /usr/local/etc 70 | bin: /usr/local/lib 71 | bin: /usr/local/games 72 | bin: /usr/include 73 | bin: /usr/local 74 | bin: /usr/libexec 75 | bin: /usr/share 76 | bin: /snap/bin 77 | man: /usr/share/man/sk 78 | man: /usr/share/man/fi 79 | ...... 80 | -------------------------------------------------------------------------------- /docs/Chapter01/00_zip.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_zip: 2 | 3 | zip 归档和压缩文件 4 | #################################### 5 | 6 | zip 不同于 gzip 压缩命令,它可直接用于压缩文件夹,压缩文件的扩展名为 ``.zip`` 。解压命令为 :ref:`unzip ` 。 7 | 8 | 9 | 命令格式: 10 | ************************************ 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | zip [-aABcdDeEfFghjklLmoqrRSTuvVwXyz!@$] [--longoption ...] [-b path] 17 | [-n suffixes] [-t date] [-tt date] [zipfile [file ...]] [-xi list] 18 | 19 | zipcloak (see separate man page) 20 | 21 | zipnote (see separate man page) 22 | 23 | zipsplit (see separate man page) 24 | 25 | 26 | 27 | 常用选项: 28 | ************************************ 29 | 30 | :: 31 | 32 | -d --delete 33 | 从压缩包内删除指定的文件 34 | 35 | -e --encrypt 36 | 以在终端上输入的密码对 zip 压缩包进行加密 37 | 38 | -f --freshen 39 | 只更新压缩包里的文件(注意与 -u 的区别) 40 | 41 | -F --fix 42 | 修复 zip 压缩包 43 | 44 | -g --grow 45 | 添加文件到压缩包中 46 | 47 | -i files 48 | --include files 49 | 只压缩指定的文件 50 | 51 | -j --junk-paths 52 | 压缩目录中的所有文件,但不保存路径关系 53 | 54 | -k --DOS-names 55 | 尝试使用与 MS-DOS 兼容的文件名 56 | 57 | -m --move 58 | 将文件移动到压缩包中 59 | 60 | -n suffixes 61 | --suffixes suffixes 62 | 不压缩指定后缀名的文件 63 | 64 | -o --latest-time 65 | 更新压缩时间,以压缩包内最新更改时间的文件为准 66 | 67 | -p --paths 68 | 压缩时保留文件的路径关系(默认设置,与 -j 相反) 69 | 70 | -P password 71 | --password password 72 | 使用密码加密 zip 压缩包(注意与 -e 的区别) 73 | 74 | -q --quiet 75 | 安静模式(不显示任何提示信息) 76 | 77 | -r --recurse-paths 78 | 递归处理,将目录下的所有文件和子目录一起压缩 79 | 80 | -s splitsize 81 | --split-size splitsize 82 | 如果压缩包超出指定大小,则拆分为多个压缩包 83 | 84 | -S --system-hidden 85 | 压缩时包含系统文件和隐藏文件 86 | 87 | -t mmddyyyy 88 | --from-date mmddyyyy 89 | 指定压缩包的日期 90 | 91 | -T --test 92 | 检测压缩包的完整性 93 | 94 | -u --update 95 | 更新压缩包里的文件,如果文件不在压缩包内,将加入到压缩包中 96 | 97 | -v --verbose 98 | 显示详细的执行过程 99 | 100 | -x files 101 | --exclude files 102 | 压缩时排除符合条件的文件 103 | 104 | -X --no-extra 105 | 不保留额外的文件属性(如 uid/gid) 106 | 107 | -z --archive-comment 108 | 对压缩包中的文件进行注释 109 | 110 | -0~9 111 | 指定压缩效率,其中 -0 表示没有压缩(相当于 tar),默认的压缩级别为 -6 112 | 113 | 114 | 使用实例: 115 | ************************************ 116 | 117 | :: 118 | 119 | # 压缩单个文件,要压缩的文件必须在末尾 120 | [Linux]$ zip code.zip code.txt 121 | 122 | # 压缩多个文件夹 123 | [Linux]$ zip -r code.zip /home/code var/www/ 124 | 125 | # 指定压缩速率压缩多个文件夹 126 | [Linux]$ zip -9 -r code.zip /home/code var/www/ 127 | -------------------------------------------------------------------------------- /docs/Chapter01/aptitude.rst: -------------------------------------------------------------------------------- 1 | .. _cmd_aptitude: 2 | 3 | aptitude 安装软件 4 | ########################## 5 | 6 | aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具。与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些。举例来说,aptitude 在删除一个包时,会同时删除本身所依赖的包。这样系统中不会残留无用的包,整个系统更为干净。 7 | 8 | 命令格式: 9 | *********************** 10 | 11 | .. highlight:: none 12 | 13 | :: 14 | 15 | ***** 16 | 17 | 常用选项: 18 | *********************** 19 | 20 | ============================ ============== 21 | 命令 说明 22 | ============================ ============== 23 | aptitude update 更新可用的包列表 24 | aptitude upgrade 升级可用的包 25 | aptitude install pkgname 安装包 26 | aptitude remove pkgname 删除包 27 | aptitude purge pkgname 删除包及其配置文件 28 | aptitude search string 搜索包 29 | aptitude show pkgname 显示包的详细信息 30 | aptitude clean 删除下载的包文件 31 | aptitude autoclean 仅删除过期的包文件 32 | ============================ ============== 33 | 34 | 在终端中直接输入 aptitude 命令,会启动一个图形化的安装工具。aptitude 的主视图组织的非常有条理,而且界面布局清爽。上部窗口列出的是软件包根据类别和它们在本地系统的状态排序。 35 | 36 | 在 aptitude 软件包列表中的软件包状态: 37 | 38 | ========== ========== 39 | 状态 说明 40 | ========== ========== 41 | v 虚拟 42 | B 损坏 43 | u 解包 44 | C 预配置 45 | H 预安装 46 | c 卸载未清除 47 | p 清除软件包 48 | i 已经安装 49 | E 内部错误 50 | ========== ========== 51 | 52 | 在 aptitude 软件包列表中的请求操作: 53 | 54 | ========== ========== 55 | 状态 说明 56 | ========== ========== 57 | h 保持 58 | p 清除 59 | d 删除(卸载) 60 | B 损坏 61 | i 安装 62 | r 重装 63 | u 升级 64 | ========== ========== 65 | 66 | 使用实例: 67 | *********************** 68 | 69 | :: 70 | 71 | # 安装 samba 服务 72 | [root@localhost ~]# aptitude install samba 73 | -------------------------------------------------------------------------------- /docs/Chapter01/hardware.rst: -------------------------------------------------------------------------------- 1 | 查看内核和硬件信息 2 | ###################################### 3 | 4 | 1. 查看 Linux 内核版本: 5 | 6 | .. highlight:: none 7 | 8 | :: 9 | 10 | uname -a 11 | 12 | 2. 查看 CPU 信息: 13 | 14 | :: 15 | 16 | more /proc/cpuinfo 17 | 18 | # 查看 CPU 型号 19 | grep "model name" /proc/cpuinfo 20 | 21 | # 查看 CPU 位数(32 or 64): 22 | echo $HOSTTYPE 23 | 24 | 3. 查看内存信息: 25 | 26 | :: 27 | 28 | more /proc/meminfo 29 | 30 | # 查看内存大小: 31 | grep MemTotal /proc/meminfo 32 | 33 | 4. 查看硬盘和分区: 34 | 35 | :: 36 | 37 | df -h 38 | 39 | # 查看目录的大小 40 | du /etc/ -sh 41 | 42 | 5. 查看主机名: 43 | 44 | :: 45 | 46 | hostname 47 | 48 | 6. 查看默认语言: 49 | 50 | :: 51 | 52 | echo $LANG $LANGUAGE 53 | -------------------------------------------------------------------------------- /docs/Chapter02/00_centos.network.rst: -------------------------------------------------------------------------------- 1 | CentOS 网络配置 2 | #################################### 3 | 4 | 在 RHEL 或者 CentOS 等 Redhat 系的系统中,跟网络有关的配置文件如下: 5 | 6 | - /etc/host.conf 配置域名服务客户端的控制文件 7 | - /etc/hosts 完成主机名映射为IP地址的功能 8 | - /etc/resolv.conf 域名服务客户端的配置文件,用于指定域名服务器的位置 9 | - /etc/sysconfig/network 包含了主机最基本的网络信息,用于系统启动 10 | - /etc/sysconfig/network-script/ 系统启动时初始化网络的一些信息 11 | - /etc/xinetd.conf 定义了由超级进程 xinetd 启动的网络服务 12 | - /etc/networks 完成域名与网络地址的映射 13 | - /etc/protocols 设定了主机使用的协议以及各个协议的协议号 14 | - /etc/services 设定主机的不同端口的网络服务 15 | 16 | 17 | .. highlight:: none 18 | 19 | :: 20 | 21 | [Linux]# vi /etc/sysconfig/network-scripts/eth0 22 | 23 | 24 | 网络故障排除思路 25 | *********************************** 26 | 27 | 1. 检查硬件,网口灯是否亮起,网线是否畅通 28 | 2. 检查配置文件是否有错误,书写及语法错误等 29 | 3. 检查本机网络协议是否正确: ping 127.0.0.1 30 | 4. 检查本机网卡链路是否正确: ping 本机IP地址 31 | 5. 检查网关是否正确: ping 网关IP地址 32 | 6. 检查外部连通性: ping www.baidu.com 33 | 34 | -------------------------------------------------------------------------------- /docs/Chapter02/00_fstab.rst: -------------------------------------------------------------------------------- 1 | 开机自动挂载硬盘 2 | #################################### 3 | 4 | 每次 Linux 系统启动时都会加载 ``/etc/fstab`` 及 ``/etc/mtab`` 两个配置文件,用于自动挂载硬盘。想要开机自动挂载额外的硬盘,只需在配置文件中加入相关信息。 5 | 6 | 在开始修改配置文件前,需要注意一些限制条件: 7 | 8 | * 根目录 ``/`` 是必须挂载的﹐而且一定要先于其它硬盘 9 | * 其它 mount point 必须是已建立的目录,可任意指定,但要遵守系统目录架构原则 (FHS) 10 | * 所有 mount point 在同一时间之内﹐只能挂载一次。 11 | * 所有 partition 在同一时间之内﹐只能挂载一次。 12 | 13 | 先看一个 ``/etc/fstab`` 的例子: 14 | 15 | .. highlight:: none 16 | 17 | :: 18 | 19 | [Linux]$ cat /etc/fstab 20 | # Device Mount point filesystem parameters dump fsck 21 | /dev/mapper/centos-root / xfs defaults 0 0 22 | UUID=94ac5f77-cb8a-495e-a65b-2ef7442b837c /boot xfs defaults 0 0 23 | /dev/mapper/centos-home /home xfs defaults 0 0 24 | /dev/mapper/centos-swap swap swap defaults 0 0 25 | 26 | 27 | 文件格式 28 | ************************************ 29 | 30 | 配置文件分为六列, 分别代表六种信息: 31 | 32 | :: 33 | 34 | [硬件名/UUID等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck] 35 | 36 | 37 | 第一栏:磁盘文件名 38 | ==================================== 39 | 40 | 这个字段可以填写的数据主要有三种: 41 | 42 | * 磁盘设备的文件名,如 ``/dev/sda1`` 43 | * 磁盘设备的 :doc:`UUID <../Chapter03/00_uuid>` 名称,如 UUID=xxx 44 | * 磁盘设备的 LABEL 名称,例如 LABEL=xxx 45 | 46 | 每个文件系统都支持上面三种格式,所以喜欢哪项就填哪项,无所谓的! 47 | 48 | 49 | 第二栏:挂载点 50 | ==================================== 51 | 52 | 挂载文件的目录 53 | 54 | 55 | 第三栏:磁盘分区的格式 56 | ==================================== 57 | 58 | 指定分区的格式,包括 ``xfs, ext4, vfat, reiserfs, nfs`` 等。 59 | 60 | 61 | 第四栏:文件系统参数 62 | ==================================== 63 | 64 | 一般使用 defaults 即可,详细信息如下: 65 | 66 | ================ ====================== 67 | 参数 内容意义 68 | ================ ====================== 69 | async/sync 异步/同步,磁盘是否以异步方式运作,预设为 async 70 | auto/noauto 自动/非自动,文件系统是否被主动测试,预设为 auto。 71 | rw/ro 读写/只读,分区以可读写或只读的方式挂载 72 | exec/noexec 可执行/不可执行,默认不设置此参数 73 | user/nouser 允许/不允许挂载,是否允许普通用户 mount 挂载磁盘。一般为 nouser 74 | suid/nosuid 具有/不具有 suid,如果不存放执行命令,可以设定为 nosuid 75 | defaults 同时具有 rw, suid, dev, exec, auto, nouser, async 等参数 76 | ================ ====================== 77 | 78 | 79 | 第五栏:能否支持 dump 备份 80 | ==================================== 81 | 82 | dump 是一个用来做为备份的命令,不过现在有太多的备份方案了,所以可以不用理会这个项目,直接输入 0。 83 | 84 | 85 | 第六栏:是否以 fsck 检验扇区 86 | ==================================== 87 | 88 | 早期开机的流程中,会检验本机的文件系统是否完整。 这种方式主要是通过 fsck 来实现,现在的 xfs 文件系统具有自动检验功能,不适用此方法,直接输入 0。 89 | 90 | 91 | 小技巧 92 | ************************************ 93 | 94 | 当编辑 ``/etc/fstab`` 配置文件时输入的数据错误,会导致系统无法正常开机。可以进入单人维护模式去重新修改配置文件然后重启。如果 ``/`` 目录是 read only 状态无法保存修改,则需要重新挂载并修改权限: 95 | 96 | :: 97 | 98 | [Linux]# mount -n -o remount,rw / 99 | -------------------------------------------------------------------------------- /docs/Chapter02/00_ifcfg.rst: -------------------------------------------------------------------------------- 1 | CentOS 设置网口静态 IP 2 | #################################### 3 | 4 | 手动修改配置文件 ,设置对应网口的 IP 等信息。配置文件路径 ``/etc/sysconfig/network-scripts/*`` 5 | 6 | 7 | 最小设置示例 8 | ************************************ 9 | 10 | .. highlight:: none 11 | 12 | :: 13 | 14 | # 文件名对应网口名,CentOS 8 默认配置文件 15 | [Linux]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 16 | 17 | 18 | DEVICE="eth0" 19 | BOOTPROTO="static" 20 | BROADCAST="192.168.0.255" 21 | HWADDR="00:16:36:1B:BB:74" 22 | IPADDR="192.168.0.100" 23 | NETMASK="255.255.255.0" 24 | ONBOOT="yes" 25 | 26 | 27 | 参数简要解释: 28 | 29 | - DEVICE 网卡的设备别名(默认即可,不建议修改) 30 | - BOOTPROTO 获得 ip 地址的方式,常见的参数:Static(静态 ip)、dhcp(通过 dhcp 获取 ip)、bootip(通过 bootp 获取 ip) 31 | - BROADCAST 广播地址 32 | - HWADDR 网卡物理地址(MAC 地址,不建议修改) 33 | - IPADDR 静态 IP 地址 34 | - NETMASK 子网掩码 35 | - ONBOOT 系统启动时是否激活网口 36 | 37 | 设置完成后需要重启网络服务才能生效: 38 | 39 | :: 40 | 41 | # CentOS 7 42 | [Linux]# service network restart 43 | 或 44 | [Linux]# systemctl restart network.service 45 | 46 | # CentOS 8 47 | [Linux]# nmcli c reload 48 | 49 | 50 | .. note:: 其它配置说明: 51 | 52 | - TYPE=Ethernet 网卡类型:为以太网 53 | - PROXY_METHOD=none 代理方式:关闭状态 54 | - BROWSER_ONLY=no 只是浏览器:否 55 | - BOOTPROTO=dhcp 网卡的引导协议 56 | - DEFROUTE=yes 默认路由 57 | - IPV4_FAILURE_FATAL=no 是否开启致命错误检测 58 | - IPV6INIT=yes IPV6 是否自动初始化 59 | - IPV6_AUTOCONF=yes IPV6 是否自动配置 60 | - IPV6_DEFROUTE=yes IPV6 是否可以为默认路由 61 | - IPV6_FAILURE_FATAL=no IPV6 是否开启致命错误检测 62 | - IPV6_ADDR_GEN_MODE=stable-privacy IPV6 地址生成模型 63 | - NAME=etho 网络接口名称,即配置文件名后半部分。 64 | - UUID=f47bde51-fa78-4f79-b68f-d5dd90cfc698 通用唯一识别码 65 | - PREFIX=24 子网掩码 66 | 67 | 68 | 修改网关 69 | ************************************ 70 | 71 | :: 72 | 73 | [Linux]# vi /etc/sysconfig/network 74 | 75 | NETWORKING=yes 76 | HOSTNAME=localhost.localdomain 77 | GATEWAY=192.168.191.2 #网关地址 78 | 79 | 查看网关命令(二选一) 80 | 81 | :: 82 | 83 | # GATEWAY 列为网关 84 | [Linux]# route -n 85 | Kernel IP routing table 86 | Destination Gateway Genmask Flags Metric Ref Use Iface 87 | 192.168.120.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 88 | 192.168.0.0 192.168.120.1 255.255.0.0 UG 0 0 0 eth0 89 | 10.0.0.0 192.168.120.1 255.0.0.0 UG 0 0 0 eth0 90 | 0.0.0.0 192.168.120.240 0.0.0.0 UG 0 0 0 eth0 91 | 92 | 93 | # link src 后为网关 94 | [Linux]# ip route show 95 | default via 192.168.1.1 dev wlp82s0 proto dhcp metric 600 96 | 169.254.0.0/16 dev wlp82s0 scope link metric 1000 97 | 172.16.40.0/24 dev vmnet1 proto kernel scope link src 172.16.40.1 98 | 172.16.51.0/24 dev vmnet8 proto kernel scope link src 172.16.51.1 99 | 192.168.1.0/24 dev wlp82s0 proto kernel scope link src 192.168.1.108 metric 600 100 | -------------------------------------------------------------------------------- /docs/Chapter02/00_sources.centos.rst: -------------------------------------------------------------------------------- 1 | yum 源配置文件 2 | #################################### 3 | 4 | yum 源一般存放在 ``/etc/yum.repos.d/`` 目录中,文件已 ``.repo`` 结尾。 5 | 6 | Yum 源镜像中心提供了 centosplus, cloud, extras, fasttrack, os, updates 等软件库,最好认的软件库就是 os (系统默认的软件) 与 updates (软件升级版本) 啰!最重要的文件就是那个 “repodata” 的目录!该目录就是分析 RPM 软件后所产生的软件属性相依数据放置处!因此,当你要找软件库所在网址时, 最重要的就是该网址底下一定要有个名为 repodata 的目录存在!那就是软件库的网址了! 7 | 8 | .. highlight:: none 9 | 10 | :: 11 | 12 | [main] 13 | cachedir=/var/cache/yum 14 | debuglevel=2 15 | logfile=/var/log/yum.log 16 | pkgpolicy=newest 17 | distroverpkg=redhat-release 18 | tolerant=1 19 | exactarch=1 20 | retries=1 21 | 22 | [base] 23 | name=Fedora Core $releasever - $basearch - Base 24 | baseurl=http://download.atrpms.net/mirrors/fedoracore/$releasever/$basearch/os 25 | http://rpmfind.net/linux/fedora/cor...er/$basearch/os 26 | http://mirror.clarkson.edu/pub/dist...er/$basearch/os 27 | 28 | [updates-released] 29 | name=Fedora Core $releasever - $basearch - Released Updates 30 | baseurl=http://download.atrpms.net/mirrors/fedoracore/updates/$releasever/$basearch 31 | http://redhat.linux.ee/pub/fedora/l...sever/$basearch 32 | http://fr2.rpmfind.net/linux/fedora...sever/$basearch 33 | 34 | ... 中间省略 ... 35 | 36 | [freshrpms] 37 | name=FreshRPMs 38 | baseurl=http://ayo.freshrpms.net/fedora/linux/$releasever/$basearch/freshrpms/ 39 | http://ftp.us2.freshrpms.net/linux/...arch/freshrpms/ 40 | 41 | 42 | 43 | 第一部分(全局性设置,一般不必改动。) 44 | ************************************ 45 | 46 | **[main]** 47 | 48 | **cachedir:** yum 缓存的目录,存储下载的 rpm 包和数据库,一般是 ``/var/cache/yum`` 。 49 | 50 | **debuglevel:** 除错级别,0-10,默认是2。 51 | 52 | **logfile:** yum 的日志文件,默认是 ``/var/log/yum.log`` 。 53 | 54 | **pkgpolicy:** 选择安装软件包的策略。一共有两个选项,newest和last(如果你设置了多个 repository,同一软件在不同的 repository 中同时存在。yum 应该安装哪一个,如果是 newest,则 yum 会安装最新的那个版本。如果是 last,则 yum 会将服务器 id 以字母表排序,并选择最后的那个服务器上的软件安装。默认为 newest。 55 | 56 | **distroverpkg:** 指定一个软件包,yum 会根据这个包判断你的发行版本,默认是 redhat-release,也可以是安装的任何针对自己发行版的 rpm 包。 57 | 58 | **exactarch:** 有两个选项1和0(1代表只升级和你安装软件包 cpu 体系一致的包,例如:你安装了一个i386的 rpm,则 yum 不会用1686的包来升级这个包)。 59 | 60 | **retries:** 网络连接发生错误后的重试次数(如果设为0,则会无限重试)。 61 | 62 | **tolerent:** 有1和0两个选项,表示 yum 是否提示与软件包有关的错误,(1代表 yum 不会提示错误信息,默认是0)。 63 | 64 | 除了上述之外,还有一些可以添加的选项,如 65 | 66 | exclude=,排除某些软件在升级名单之外,可以用通配符,列表中各个项目要用空格隔开,这个对于安装了诸如美化包,中文补丁的朋友特别有用。 67 | 68 | gpgchkeck= 有 1 和 0 两个选择,分别代表是否是否进行gpg校验,如果没有这一项,默认好像也是检查的。 69 | 70 | 71 | 第二部分(个性化配置) 72 | ************************************ 73 | 74 | 配置 repository 服务器了,这是最令人激动的。有了好的 repository,就如家门口开了大卖场,要什么东西稍微跑跑腿就行,对了这还是个免费的大卖场。所有服务器设置都应该遵循如下格式: 75 | 76 | **[base]:** 代表软件库的名字!中括号一定要存在,里面的名称则可以随意取。但是不能有两个相同的软件库名称, 否则 yum 会不晓得该到哪里去找软件库相关软件列表档案。 77 | 78 | **name:** 只是说明一下这个软件库的意义而已,重要性不高! 79 | 80 | **mirrorlist=:** 列出这个软件库可以使用的映射站台,如果不想使用,可以注释掉这行; 81 | 82 | **baseurl=:** 这个最重要,因为后面接的就是软件库的实际网址! mirrorlist 是由 yum 程序自行去捉映像站台, baseurl 则是指定固定的一个软件库网址!我们刚刚找到的网址放到这里来啦! 83 | 84 | **enable=1:** 就是让这个软件库被启动。如果不想启动可以使用 enable=0 喔! 85 | 86 | **gpgcheck=1:** 还记得 RPM 的数字签名吗?这就是指定是否需要查阅 RPM 档案内的数字签名! 87 | 88 | **gpgkey=:** 就是数字签名的公钥文件所在位置!使用默认值即可 89 | 90 | 91 | 几个变量 92 | ==================================== 93 | 94 | $releasever,发行版的版本,从[main]部分的distroverpkg获取,如果没有,则根据redhat-release包进行判断。 95 | 96 | $arch,cpu体系,如i686,athlon等 97 | 98 | $basearch,cpu的基本体系组,如i686和athlon同属i386,alpha和alphaev6同属alpha。 99 | 100 | 101 | 102 | CentOS下安装yum 103 | ************************************ 104 | 105 | 在Linux里面依次输入下面的命令: 106 | 107 | 1. 下载最新的 yum-3.2.28.tar.gz 并解压 108 | 109 | :: 110 | 111 | wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz 112 | 113 | tar xvf yum-3.2.28.tar.gz 114 | 115 | 2. 进入目录,运行安装 116 | 117 | :: 118 | 119 | cd yum-3.2.28/ 120 | ./yummain.py install yum 121 | 122 | 如果结果提示错误: CRITICAL:yum.cli:Config Error: Error accessing file for config file:///etc/ 123 | 124 | 可能是原来是缺少配置文件。在 etc 目录下面新建 yum.conf 文件,然后再次运行 yummain.py install yum,顺利完成安装。 125 | 126 | 3,最后更新系统。 127 | 128 | :: 129 | 130 | yum check-update 131 | yum update 132 | yum clean all 133 | -------------------------------------------------------------------------------- /docs/Chapter02/11_shell.ps1.rst: -------------------------------------------------------------------------------- 1 | 定制 shell 提示符 2 | #################################### 3 | 4 | PS(Prompt Sign)是指命令提示符,在 Linux 环境下 $PS1 是终端提示符,我们可以用预设的一些特殊符号来改变 $PS1 变量。首先,先看一下 $PS1 到变量,本例以 Ubuntu 18 为准: 5 | 6 | .. highlight:: none 7 | 8 | :: 9 | 10 | [Linux]$ echo $PS1 11 | \[\e]0;\u@\h:\w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\ 12 | [\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ 13 | 14 | 15 | PS1 变量中各项提示符的含义: 16 | 17 | * \\d: 日期 18 | * \\H: 完整的主机名称 19 | * \\h: 仅取主机的第一个名字 20 | * \\t: 显示时间为 24 小时格式,如:HH:MM:SS 21 | * \\T: 显示时间为 12 小时格式 22 | * \\A: 显示时间为 24 小时格式:HH:MM 23 | * \\u: 当前用户的账号名称 24 | * \\v: BASH 的版本信息 25 | * \\w: 完整的工作路径名 26 | * \\W: 最后一个路径名 27 | * \\#: 下达的第几个命令 28 | * \\$: 提示字符,root 用户为 # ,普通用户为 $ 29 | 30 | 同时可以通过 PS1 变量设置提示符的颜色,在 PS1 中设置字符序列颜色的格式为: ``\[\e[F;Bm\]`` 其中“F”为字体颜色,编号30~37;“B”为背景色,编号40~47。取消设置: ``\[\e[0m\]`` 31 | 32 | 每种字体颜色对应的代码: 33 | 34 | * 0=重置 35 | * 30=黑色 36 | * 31=红色 37 | * 32=绿色 38 | * 33=黄色 39 | * 34=蓝色 40 | * 35=洋红 41 | * 36=青色 42 | * 37=白色 43 | 44 | **背景颜色对应的代码:** 45 | 46 | * 0=重置 47 | * 40=黑色 48 | * 41=红色 49 | * 42=绿色 50 | * 43=黄色 51 | * 44=蓝色 52 | * 45=洋红 53 | * 46=青色 54 | * 47=白色 55 | * 01=高亮显示(常用) 56 | * 04=underline 57 | * 07=反白显示 58 | * 08=不可见 59 | 60 | 在修改提示符时,可以先临时修改,以查看效果。等满意之后在写入配置文件 ~/.bashrc 中,使效果永久生效。 61 | 62 | .. hint:: 63 | 64 | PS1 在赋值的时因为值中包含空格所以需要用单引号 ``'`` 把值包起来,同时需要注意,变量与值以等号连结,而且等号两边不能直接接空格 65 | 66 | :: 67 | 68 | gavin@gavin-ubuntu:~$ PS1='\[\H\]\$ ' 69 | gavin-ubuntu$ PS1='\[\H@\u\]\$ ' 70 | gavin-ubuntu@gavin$ PS1='\[\w\]\$ ' 71 | ~$ cd Documents/ 72 | ~/Documents$ PS1='[\u@\h \w \A #\#]\$ ' 73 | [gavin@gavin-ubuntu ~/Documents 21:17 #6]$ PS1='\u@\W\$ ' 74 | 75 | # 个人默认的修改,带颜色版本 76 | PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ ' 77 | -------------------------------------------------------------------------------- /docs/Chapter02/32_wpa.supplicant.rst: -------------------------------------------------------------------------------- 1 | wpa_supplicant 终端连接 wifi 2 | #################################### 3 | 4 | 为了管理无线网卡驱动,并且能正常连接到无线网络,你需要一个无线连接管理工具。 5 | 6 | 如何选择一个最佳的管理方法,将依赖于下面几个因素: 7 | 8 | * 是否使用加密及使用加密的类型 9 | * 是否经常切换不同网络(如笔记本电脑) 10 | 11 | 下表按照加密和管理方式分类,列出了管理无线网络的工具。 12 | 虽然还有其他办法,但这些是最常用的。 13 | 14 | ===================== ================================ =============== 15 | 手动管理方法 无线连接管理 分配 IP 地址 16 | ===================== ================================ =============== 17 | 无加密或 WEP 加密 iw/iwconfig ip/dhcpcd/dhclient/networkd 18 | WPA 或 WPA2 PSK 加密 iw/iwconfig + wpa_supplicant ip/dhcpcd/dhclient 19 | ===================== ================================ =============== 20 | 21 | ================= ================== 22 | 自动管理方法 工具 23 | ================= ================== 24 | 支持所以网络配置 netctl、Wicd、NetworkManager 等等 25 | 这些工具会自动安装手动配置需要的工具。 26 | ================= ================== 27 | 28 | 29 | wpa_supplicant 最小配置 30 | ************************************ 31 | 32 | 现在大部分无线网络使用 WPA/WPA2 加密,最少需要配置 wpa_supplicant 才能连接网络。另外,wpa_supplicant 目前只能连接到已经配置好 ESSID 的无线网络。 33 | 34 | .. note:: 35 | 36 | 其实 wpa_supplicant 还有一个前端工具 wpa_cli。wpa_supplicant 和 wpa_cli 的关系就像服务和客户端的关系,后台运行 wpa_supplicant,使用 wpa_cli 来搜索、设置、和连接网络。不过 wpa_cli 并不是必须的软件。 37 | 38 | 在 Debian 环境中,需要在 ``/etc/network/interfaces`` 中配置 wpa_supplicant 的配置文件路径。 39 | 40 | .. highlight:: none 41 | 42 | :: 43 | 44 | # 开机自动启动网络并使用 dhcp 配置网络 IP 45 | # wlan0 为系统无线网卡名 46 | auto wlp1s0 47 | iface wlp1s0 inet dhcp 48 | 49 | # wpa_supplicant 的配置文件路径 50 | wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf 51 | 52 | 新建配置文件 ``/etc/wpa_supplicant/wpa_supplicant.conf`` ,可以加入一些配置项: 53 | 54 | :: 55 | 56 | # 可有可无,启用 wpa_cli 关闭 wpa_supplicant 57 | ctrl_interface=/var/run/wpa_supplicant 58 | 59 | # 可有可无,只有 root 用户能读取 WPA 配置 60 | ctrl_interface_group=0 61 | 62 | # 可有可无,启用 wpa_supplicant 扫描和选择 AP 63 | ap_scan=1 64 | 65 | 使用 wpa_supplicant 命令将连接 wifi 的名称和密码添加到配置文件。wpa_supplicant 66 | 会将密码转换成密文,如果更改了密码这一步不能单纯的手动修改文件。 67 | 68 | :: 69 | 70 | [Linux]$ wpa_supplicant wifi名称 wifi密码 >> /etc/wpa_supplicant/wpa_supplicant.conf 71 | 72 | 如果配置文件中有多个 AP 还可以手动为网络设置优先级参数 priority(0-255 的整数,数值越大级别越高)。 73 | 74 | :: 75 | 76 | [Linux]$ cat /etc/wpa_supplicant/wpa_supplicant.conf 77 | network={ 78 | ssid="WiFi2021" 79 | #psk="Xy20210601Xy" 80 | psk=c92fe5b5f76fa8482e1c131ec4e75a5fc98bebea703493732853dfa1725b058 81 | priority=2 82 | } 83 | network={ 84 | ssid="glenn" 85 | #psk="1234@4321" 86 | psk=9b5b71e27b1976af9aba2b27fc8473ac095e39da62dcf497bea93449dfa9990 87 | priority=99 88 | } 89 | 90 | 91 | 下面是一个用 WPA supplicant 和 DHCP 连接无线网络的完整示例。 92 | 93 | :: 94 | 95 | [Linux]$ ip link set dev wlp6s0 up 96 | [Linux]$ wpa_supplicant -B -i wlp6s0 -c /etc/wpa_supplicant/wpa_supplicant.conf 97 | [Linux]$ dhcpcd wlp6s0 98 | 99 | 要使用静态 IP,请将 dhcpcd 命令替换为: 100 | [Linux]$ ip addr add 192.168.0.10/24 broadcast 192.168.0.255 dev wlp6s0 101 | [Linux]$ ip route add default via 192.168.0.1 102 | 103 | 104 | 请注意一点,对无线网络的配置是全局性的,而非针对具体的接口。 105 | 106 | 107 | 关于 WPA: 108 | ************************************ 109 | 110 | WPA 是 WiFi Protected Access 的缩写,中文含义为“WiFi 网络安全存取”。WPA 是一种基于标准的可互操作的 WLAN 安全性增强解决方案,可大大增强现有以及未来无线局域网络的数据保护和访问控制水平。 111 | 112 | wpa_supplicant 是 wifi 客户端(client)加密认证工具,并且是一个开源的项目,已经被移植到 Linux、Windows 以及很多嵌入式系统上。它是 WPA 的应用层认证客户端,负责完成认证相关的登录、加密等工作。 113 | 114 | wpa_supplicant 是一个独立运行的守护进程,其核心是一个消息循环,在消息循环中处理 WPA 状态机、控制命令、驱动事件、配置信息等。 115 | -------------------------------------------------------------------------------- /docs/Chapter02/46_xdg.user.dirs.rst: -------------------------------------------------------------------------------- 1 | 修改用户目录默认文件名 2 | #################################### 3 | 4 | 通常,为了方便我会安装 Linux 中文环境,但是此时用户目录也会变成了中文。 5 | ``cd 下载/`` 用起来很难受,所以我希望可以将目录名修改为英文或者自定义的名称。 6 | 7 | xdg-user-dirs 就是帮助管理用户目录的工具。``xdg-user-dirs-update`` 命令会读取配置文件 /etc/xdg/user-dirs.defaults ,并在 $HOME 下创建一整套默认的经本地化的用户目录。 8 | 9 | .. highlight:: none 10 | 11 | :: 12 | 13 | $ xdg-user-dirs-update 14 | 15 | 运行该命令后会自动地: 16 | 17 | * 创建一个本地的 ~/.config/user-dirs.dirs 配置文件:应用程序通过它来查找使用特定帐号指定的用户目录。 18 | 19 | * 创建一个本地的 ~/.config/user-dirs.locale 配置文件:根据使用的 locale 指定语言。 20 | 21 | 本地的 ~/.config/user-dirs.dirs 和全局的 /etc/xdg/user-dirs.defaults 配置文件都使用如下的环境变量格式: XDG_DIRNAME_DIR="$HOME/目录名"。 22 | 23 | 下边是一个例子: 24 | 25 | :: 26 | 27 | ~/.config/user-dirs.dirs 28 | ------------------------------------------ 29 | 30 | XDG_DESKTOP_DIR="$HOME/Desktop" 31 | XDG_DOCUMENTS_DIR="$HOME/Documents" 32 | XDG_DOWNLOAD_DIR="$HOME/Download" 33 | XDG_MUSIC_DIR="$HOME/Music" 34 | XDG_PICTURES_DIR="$HOME/Pictures" 35 | XDG_PUBLICSHARE_DIR="$HOME/Publicshare" 36 | XDG_TEMPLATES_DIR="$HOME/Templates" 37 | XDG_VIDEOS_DIR="$HOME/Videos" 38 | 39 | # 中文文件名 40 | XDG_DESKTOP_DIR="$HOME/桌面" 41 | XDG_DOCUMENTS_DIR="$HOME/文档" 42 | XDG_DOWNLOAD_DIR="$HOME/下载" 43 | XDG_MUSIC_DIR="$HOME/音乐" 44 | XDG_PICTURES_DIR="$HOME/图片" 45 | XDG_PUBLICSHARE_DIR="$HOME/公共" 46 | XDG_TEMPLATES_DIR="$HOME/模板" 47 | XDG_VIDEOS_DIR="$HOME/视频" 48 | 49 | 50 | .. note:: 51 | 52 | 在把中文文件名修改为英文文件名时,不仅仅需要修改配置文件,还需要把文件夹名称由中文改成对应的英文(或新建英文名文件夹)。否则重启之后配置文件中对应的名称会为空。 53 | 54 | :: 55 | 56 | mkdir Desktop Documents Download Music Pictures Publicshare Templates Videos 57 | 58 | 59 | 因为 xdg-user-dirs 会参照本地配置文件来了解正确的用户目录,所以可以自定义。若将 ~/.config/user-dirs.dirs 下 XDG_DOWNLOAD_DIR 变量设为了 $HOME/Internet,那么任何参照了该变量的程序都会改用这个目录。 60 | 61 | 注意: 和其他的配置文件一样,本地设定覆盖全局设定。另外自定义的目录要自己创建。 62 | 63 | 或者也可以用命令行修改默认目录。下列命令会产生和上面一样的效果: 64 | 65 | :: 66 | 67 | $ xdg-user-dirs-update --set DOWNLOAD ~/Internet 68 | 69 | 查询配置好的目录 70 | 71 | 可以用 xdg-user-dirs 来查询配置好的目录路径。例如,下列命令可以查询模板目录的位置,对应于本地配置文件中 XDG_TEMPLATES_DIR 变量的值: 72 | 73 | :: 74 | 75 | $ xdg-user-dir TEMPLATES 76 | 77 | 78 | **参考链接:** 79 | 80 | * https://wiki.archlinux.org/index.php/XDG_user_directories 81 | * https://www.freedesktop.org/wiki/Software/xdg-user-dirs/ 82 | -------------------------------------------------------------------------------- /docs/Chapter02/47_tty.font.rst: -------------------------------------------------------------------------------- 1 | tty 终端字体 2 | #################################### 3 | 4 | 默认情况下,终端使用内核的内置字体,一般为点阵字体 [1]_ 其包含 CP437 字体集。 5 | 6 | Linux 终端默认使用 UTF-8 编码,由于使用的是标准的兼容 VGA 的帧缓存,终端字体限定为 256 或 512 个字形。如果字体超出了256个字形,那么颜色的数量就会从 16 减少到 8。为了正确的显示符号,需要一个特殊的转换图(unimap)将符号和 Unicode 的值对应。现在大多数终端字体都具有内置的 unimap。 7 | 8 | .. note:: 9 | 10 | kbd 包提供了改变虚拟终端字体的工具。可以使用的字体存储在 ``/usr/share/kbd/consolefonts/`` 目录下(各发行版的存储路径略有不同,CentOS 下路径为 ``/lib/kbd/consolefonts`` ),那些以 ``.psfu`` 或者 ``.psfu.gz`` 结尾的字体具有内置的 Unicode 转换映射,可用于终端字体。 11 | 12 | psfu,psfu.gz – 点阵字体。 ``s`` 代表屏幕, ``f`` 代表字体, ``u`` 代表 Unicode, ``gz`` 用 gzip 压缩(不适用于X.Org)。 13 | 14 | 15 | 预览和测试 16 | ************************************ 17 | 18 | ``showconsolefont`` 命令会以表格形式显示可用字与字符: 19 | 20 | .. highlight:: none 21 | 22 | :: 23 | 24 | $ showconsolefont 25 | 26 | ``setfont`` 可以暂时改变字体(预览字体效果),只要指定字体名称即可(字体位于 /usr/share/kbd/consolefonts/),比如: 27 | 28 | :: 29 | 30 | $ setfont lat2-16 31 | 32 | 如果对新换的字体不满意,可以用 ``setfont`` 命令恢复至默认字体(就算终端显示乱码,将命令「盲打」执行依然有效): 33 | 34 | :: 35 | 36 | $ setfont 37 | 38 | .. note:: 39 | 40 | setfont 只作用于当前正在使用的终端。其它终端无论活跃与否都不受影响。 41 | 42 | 43 | 配置文件 44 | ************************************ 45 | 46 | systemd-vconsole-setup 是一个用于配置虚拟控制台的辅助程序, 它既可以一次性配置所有虚拟控制台,也可以通过指定 TTY 参数单独配置某个特定的虚拟控制台。在系统启动过程中,初始化虚拟控制台时,它将被 systemd-udevd(8) 调用。 systemd-vconsole-setup.service 服务也会在内部调用该程序。 而该程序也会通过调用 loadkeys(1) 与 setfont(8) 来配置虚拟控制台的键盘映射与字体。 47 | 48 | 在修改 vconsole.conf 之后,既可以通过直接调用此程序来刷新控制台的设置, 也可以通过 systemctl restart 或 systemctl start 命令来刷新控制台的设置。 49 | 50 | ``/etc/vconsole.conf`` 的 ``FONT`` 变量可以用来在启动时设置字体,对于所有终端都有效。如果没用 ``vconsole.conf`` 配置文件,手动创建即可。 51 | 52 | 注意:配置文件的位置各发行版的位置不尽相同,在 Debian 中的配置文件为 ``/etc/default/console-setup`` 53 | 54 | 若要显示 ``Č, ž, đ, š, Ł, ę, ą, ś`` 之类的字符,请使用 lat2-16.psfu.gz 这个字体: 55 | 56 | :: 57 | 58 | /etc/vconsole.conf 59 | 60 | ... 61 | FONT=lat2-16 62 | 63 | 这代表使用 ISO/IEC 8859 字符的第二部分,尺寸设置为 16。你可以使用其它值更改字体尺寸(如 lat2-08)。 64 | 65 | 如果开机时字体没有任何变化,或只变化一下就恢复原样,有可能是因为显卡驱动引导时字体被复位,然后终端被切至帧缓冲 (framebuffer)。提前加载图形驱动可以避免这个问题。 66 | 67 | 68 | 调整控制台字体太小的方法 69 | ************************************ 70 | 71 | Linux 系统默认的终端字体大小为 16px,在高分辨率屏幕下的显示效果惨不忍睹。 72 | 上边已经提到了,由于点阵字体只能清晰地显示在相应的字号下,所以要改变字体的大小,最好是调整字体。 73 | 74 | 1. 下载 terminus 字体,官网链接: http://terminus-font.sourceforge.net/。 75 | 76 | 2. 解压文件: 77 | 78 | :: 79 | 80 | cd ~/Download 81 | tar -zxvf terminus-font-4.46.tar.gz 82 | cd terminus-font-4.46 83 | 84 | 3. 安装字体: 85 | 86 | :: 87 | 88 | sudo su # 提升权限 89 | ./configure --psfdir=/usr/share/kbd/consolefonts/ 90 | make -j4 psf # 编译字体 91 | make install-psf # 安装字体 92 | 93 | # 以下可选 94 | make -j4 psf-vgaw 95 | make install-psf-vgaw 96 | 97 | 4. 预览字体效果: 98 | 99 | :: 100 | 101 | cd /usr/share/kbd/consolefonts/ 102 | ls 103 | # 会多出好多 ter-XXXX.psf.gz 的字体文件 104 | # 预览字体效果 105 | setfont ter-932n.psf.gz 106 | 107 | ter-932n.psf.gz 其中 9 是代号,32 代表高度,n 表示 normal,还有 b 表示 bold 等。 108 | 109 | 110 | .. note:: 111 | 112 | 点阵字体在处理 ``0 o O 1 l i`` 等字符时十分容易混淆,这里推荐另一款字体:http://www.fial.com/~scott/tamsyn-font/ 或 http://pelulamu.net/unscii/ 113 | 114 | 将 *.psf.gz 文件放在字体目录下,在配置时请使用绝对路径指定字体。 115 | 116 | 117 | .. [1] 点阵字体:每种字形的每种形式和每种尺寸的图像都由点或者像素组成的矩阵构成。由于位图的原故,点阵字体只能清晰地显示在相应的字号下,很难进行缩小和放大。对于太小的字,点阵字体常常比其它类型的字体有更好的显示效果。常见的点阵字体格式有 bdf,pcf,fnt,hbf 等。 118 | -------------------------------------------------------------------------------- /docs/Chapter02/50_login.manager.rst: -------------------------------------------------------------------------------- 1 | 登陆管理器 2 | #################################### 3 | 4 | 登录管理器也叫显示管理器(Display Manager),它会提供给用户一个图形化的登录界面。当用户输入正确的用户名和密码时,登录管理器会开始一个会话(窗口管理器或者桌面环境)。 一个图形服务器只能由一个登录管理器来管理,但是系统中可以安装多个登录管理器。 5 | 6 | 7 | 显示管理器列表 8 | ************************************ 9 | 10 | **控制台** 11 | 12 | - CDM_ :控制台显示管理器 13 | - `Console TDM`_ :扩展自xinit,由纯粹的Bash脚本编写的 14 | - nodm_ :支持自动登录的简单显示管理器。 15 | 16 | **桌面环境** 17 | 18 | - GDM_ :GNOME 显示管理器。 19 | - LightDM_ :跨桌面的显示管理器,可以使用各种前端写的任何工具。 20 | - LXDM_ :LXDE 显示管理器 (独立于桌面环境) (lxdm) 21 | - MDM:使用在Linux Mint中的显示管理器,GDM2的分支项目。 22 | - SDDM_ :基于QML的显示管理器,替代KDE4的KDM,推荐搭配Plamsa5或LXQt使用。 23 | - XDM_ :X 显示管理器支持XDMCP(适合服务器的宿主机)。 24 | .. _CDM: https://github.com/ghost1227/cdm 25 | .. _`Console TDM`: http://code.google.com/p/t-display-manager/ 26 | .. _nodm: http://enricozini.org/sw/nodm/ 27 | .. _GDM: http://projects.gnome.org/gdm/gdm 28 | .. _LightDM: https://www.freedesktop.org/wiki/Software/LightDM/ 29 | .. _LXDM: https://en.wikipedia.org/wiki/LXDE 30 | .. _SDDM: https://github.com/sddm/sddmsddm 31 | .. _XDM: http://www.x.org/archive/X11R7.5/doc/man/man1/xdm.1.html 32 | 33 | 34 | 加载显示管理器 35 | ************************************ 36 | 37 | 以 SDDM 为例,配置开机启动: 38 | 39 | .. highlight:: none 40 | 41 | :: 42 | 43 | # systemctl enable sddm.service 44 | 45 | 46 | 执行上述命令后,登录管理器应当能正常工作了。如果不是的话,可能是 default.target 没有指向 graphical.target。 47 | 48 | 启用 SDDM 后, ``/etc/systemd/system/`` 应该创建 display-manager.service 软链接,可以用 --force 覆盖已有链接。 49 | 50 | :: 51 | 52 | $ ls -l /etc/systemd/system/display-manager.service 53 | 54 | [...] /etc/systemd/system/display-manager.service -> /usr/lib/systemd/system/sddm.service 55 | 56 | 57 | LightDM ( Light Display Manager ) 58 | ************************************ 59 | 60 | LightDM 是一个跨桌面显示管理器,其目的是成为 X org X 服务器的标准显示管理器。我们之所以编写一个新的显示管理器,是因为从 XDM 以来出现了很多新的显示管理器(通常基于 XDM 源代码),但这些项目之间的差别很小,主要是在GUI(比如说不同的开发工具包) 和性能上面的差别。我们想用一个通用的显示管理器来管理它们,并允许各自的差异。 61 | 62 | **它的特点有:** 63 | 64 | - 跨桌面 - 支持不同的桌面环境。 65 | 66 | - 支持多种显示技术(X,Wayland, ...)。 67 | 68 | - 轻量级 - 低内存使用,高性能。 69 | 70 | - 支持定制会话。 71 | 72 | - 支持远程登录(XDMCP,VNC,XDMCP,可插拔)。 73 | 74 | **主要配置文件:** 75 | 76 | :: 77 | 78 | /usr/share/lightdm/lightdm.conf.d/*.conf 79 | /etc/lightdm/lightdm.conf.d/*.conf 80 | /etc/lightdm/lightdm.conf 81 | 82 | 83 | 启用自动登录 84 | ==================================== 85 | 86 | 编辑 LightDM 配置文件 ``/etc/lightdm/lightdm.conf`` ,取消 autologin-user 的注释,并添加要自动登陆的用户名: 87 | 88 | :: 89 | 90 | autologin-user=username 91 | 92 | 93 | 你必须是 autologin 组的成员才能使用自动登录: 94 | 95 | :: 96 | 97 | # groupadd autologin 98 | # gpasswd -a username autologin 99 | 100 | 101 | 命令行工具 102 | ==================================== 103 | 104 | LightDM 提供一个命令行工具, dm-tool. 它可用来锁定当前 seat, 切换会话,等等。这对'极简'窗口管理器和测试非常有用。要列出可用命令,运行: 105 | 106 | :: 107 | 108 | $ dm-tool --help 109 | 110 | 111 | 更改背景图片/颜色 112 | ==================================== 113 | 114 | 如果您想使用一个纯色 (非图片) 的背景,只需将 background 变量设置为十六进制的颜色。 115 | 116 | 例如: 117 | 118 | :: 119 | 120 | background=#000000 121 | 122 | 123 | 如果需要在 greeter 上使用自定义图片,请修改 ``/etc/lightdm/lightdm.conf`` 中的 background 变量值。例如: 124 | 125 | :: 126 | 127 | background=/usr/share/pixmaps/black_and_white_photography-wallpaper-1920x1080.jpg 128 | 129 | 130 | 注意: 建议将 PNG 或 JPG 文件放到 ``/usr/share/pixmaps`` ,因为 LightDM 用户需要有背景文件的读取权限。 131 | 132 | 133 | 改变你的头像 134 | ==================================== 135 | 136 | 首先确保已安装 accountsservice 软件包,然后如下设置,把 username 替换为目标用户的登录名。文件名中不要加 ``.png`` 后缀: 137 | 138 | :: 139 | 140 | [User] 141 | Icon=/var/lib/AccountsService/icons/username 142 | 143 | 注意: 头像格式最好为PNG,确保文件的权限为 644 。 144 | -------------------------------------------------------------------------------- /docs/Chapter02/60_systemdMount.rst: -------------------------------------------------------------------------------- 1 | Systemd 开机自动挂载硬盘 2 | #################################### 3 | 4 | Systemd 的 Mount Unit 单元可以实现挂载硬盘,并且可以设定为开机自启动。相较于使用 ``/etc/fstab`` 文件来实现开机自动挂载硬盘,采用 Systemd 的方式更灵活,也不会因为配置错误导致无法开机,所以比较适合折腾。 5 | 6 | 7 | 新建挂载文件 8 | ************************************ 9 | 10 | 在 ``/usr/lib/systemd/system/`` 目录下,新建文件并以 ``.mount`` 结尾。 11 | 12 | .. highlight:: none 13 | 14 | :: 15 | 16 | [linux]# cat /usr/lib/systemd/system/home-disk.mount 17 | 18 | [Unit] 19 | Description=mount my videos disk 20 | After=home.mount 21 | 22 | [Mount] 23 | #What=UUID=ea8d7bf8-384d-412b-b9eb-b92f702fc360 24 | What=/dev/sdb2 25 | Where=/home/user/Videos 26 | Type=ext4 27 | Options=defaults 28 | 29 | [Install] 30 | WantedBy=multi-user.target 31 | 32 | 33 | 在加入开机启动之前,首先应该测试一下挂载文件的正确性: 34 | 35 | :: 36 | 37 | [Linux]$ systemctl start home-disk.mount 38 | 39 | 40 | 添加开机启动 41 | ************************************ 42 | 43 | :: 44 | 45 | [Linux]# systemctl enable home-disk.mount 46 | -------------------------------------------------------------------------------- /docs/Chapter02/60_systemdUnit.rst: -------------------------------------------------------------------------------- 1 | Systemd 开机自启脚本 2 | #################################### 3 | 4 | 因为现在的 Linux 系统很多默认使用 systemd,所以网上流传的很多 init 开机自启脚本的方法已经过时。 5 | 6 | 下边介绍一种 systemd 的方法。 7 | 8 | 新建服务启动区块 9 | **************************** 10 | 11 | Systemd 的配置文件在 ``/usr/lib/systemd/system`` 下,并且以 ``.service`` 结尾。 12 | 13 | 新建并编辑配置文件,下边是一个简单的示例: 14 | 15 | .. highlight:: none 16 | 17 | :: 18 | 19 | [Unit] 20 | Description=Customize the script 21 | After=network.target sshd-keygen.service 22 | 23 | [Service] 24 | ExecStart=/root/init.sh 25 | 26 | [Install] 27 | WantedBy=multi-user.target 28 | 29 | 30 | Unit 31 | ==================================== 32 | 33 | [Unit] 区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。 34 | 35 | * Description:简短描述 36 | * Documentation:文档地址 37 | * Requires:强依赖,如果指定的 Unit 启动失败,那么当前 Unit 会失败 38 | * Wants:弱依赖,如果指定的 Unit 启动失败,不影响当前 Unit 启动 39 | * Before:在指定的 Unit 启动之前,启动当前 Unit 40 | * After:在指定的 Unit 启动之后,启动当前 Unit 41 | * Conflicts:指定的 Unit 不能与当前 Unit 同时运行 42 | * Condition:当前 Unit 运行时必须满足的条件,否则不会运行 43 | * Assert:当前 Unit 运行时必须满足的条件,否则会启动失败 44 | 45 | .. warning:: 46 | 47 | After 和 Before 字段只涉及启动顺序,不涉及依赖关系。 48 | 49 | Wants 和 Requires 字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动。 50 | 51 | 当某 Web 应用需要 sql 数据库储存数据时。如果在配置文件中,只定义在 sql 之后启动 Web 服务,而没有定义强依赖 sql。上线后,如果 sql 启动失败,该 Web 应用将无法使用。 52 | 53 | 54 | Service 55 | ==================================== 56 | 57 | [Service] 区块用来定义如何启动当前服务,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。 58 | 59 | * Type:定义启动时的进程行为。它有以下几种值。 60 | * Type=simple:默认值,执行 ExecStart 指定的命令,启动主进程 61 | * Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出 62 | * Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行 63 | * Type=dbus:当前服务通过 D-Bus 启动 64 | * Type=notify:当前服务启动完毕,会通知 Systemd,再继续往下执行 65 | * Type=idle:若有其他任务执行完毕,当前服务才会运行 66 | * ExecStart:启动当前服务时执行的命令 67 | * ExecStartPre:启动当前服务之前执行的命令 68 | * ExecStartPost:启动当前服务之后执行的命令 69 | * ExecReload:重启当前服务时执行的命令 70 | * ExecStop:停止当前服务时执行的命令 71 | * ExecStopPost:停止当其服务之后执行的命令 72 | * KillMode:定义 Systemd 如何停止当前服务。 73 | * KillMode=control-group:当前控制组里的所有子进程,都被杀掉(默认值) 74 | * KillMode=process:只杀死主进程 75 | * KillMode=mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号 76 | * KillMode=none:没有进程会被杀掉,只是执行服务的 stop 命令。 77 | * RestartSec:自动重启当前服务间隔的秒数 78 | * Restart:定义何种情况 Systemd 会自动重启当前服务 79 | * Restart=no:退出后不会重启(默认值) 80 | * Restart=on-success:只有正常退出时(退出状态码为 0),才会重启 81 | * Restart=on-failure:非正常退出时,包括被信号终止和超时,才会重启 82 | * Restart=on-abnormal:只有被信号终止和超时,才会重启 83 | * Restart=on-abort:只有在收到没有捕捉到的信号终止时,才会重启 84 | * Restart=on-watchdog:超时退出,才会重启 85 | * Restart=always:不管是什么退出原因,总是重启 86 | * RestartSec:定义 Systemd 重启服务之前,需要等待的秒数 87 | * TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数 88 | * Environment:指定当前服务的环境变量参数文件 89 | 90 | 91 | .. hint:: 92 | 93 | 在所有的启动设置之前,都可以加上一个连词号 ``-`` ,表示“抑制错误”,即发生错误的时候,不影响其他命令的执行。比如 ``EnvironmentFile=-/etc/sysconfig/sshd`` ,表示即使 sshd 文件不存在,也不会抛出错误。 94 | 95 | 96 | Install 97 | ==================================== 98 | 99 | [Install] 通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。 100 | 101 | * WantedBy:一个或多个 Target(服务组),当 Unit 激活时(开机自启动)符号链接会放入 /etc/systemd/system/ + Target 名 + .wants 后缀构成的子目录中 102 | * RequiredBy:一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 * Target 名 + .required 后缀构成的子目录中 103 | * Alias:当前 Unit 可用于启动的别名 104 | * Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit 105 | 106 | 107 | .. hint:: 108 | 109 | 一般来说,常用的 Target 有两个:一个是 multi-user.target,表示多用户命令行状态;另一个是 graphical.target,表示图形用户状态,它依赖于 multi-user.target。 110 | 111 | 可以使用 ``systemctl get-default`` 查看系统默认的启动 Target。 112 | 113 | :: 114 | 115 | [Linux]$ systemctl get-default 116 | graphical.target 117 | 118 | 119 | Unit 配置文件的完整字段清单,请参考官方文档。 120 | 121 | 添加开机自启服务 122 | **************************** 123 | 124 | 1. 添加开机自动启动服务,系统会自动增加由 /lib/systemd/system/ 到 /etc/systemd/system/multi-user.target.wants/ 下的软链接。 125 | 126 | :: 127 | 128 | systemctl enable httpd.service 129 | 130 | 2. 移除开机自动启动服务,删除 /etc/systemd/system/multi-user.target.wants 下的软链接。 131 | 132 | :: 133 | 134 | systemctl disable httpd.service 135 | 136 | 3. 查看开机是否启动 137 | 138 | :: 139 | 140 | systemctl status httpd.service (服务详细信息) 141 | systemctl is-active httpd.service (仅显示是否 Active) 142 | 143 | 4. 查看开机自启动的程序 144 | 145 | :: 146 | 147 | ls /etc/systemd/system/multi-user.target.wants/ 148 | 149 | 5. 列出所有已启动的服务 150 | 151 | :: 152 | 153 | systemctl list-units --type=service 154 | 155 | 6. 列出启动失败的单元 156 | 157 | :: 158 | 159 | systemctl --failed 160 | 161 | 7. 查看 systemd 单元加载及活动情况 162 | 163 | :: 164 | 165 | systemctl 166 | 167 | 8. 查看 systemd 管理的所有单元 168 | 169 | :: 170 | 171 | systemctl list-unit-files 172 | -------------------------------------------------------------------------------- /docs/Chapter02/98_vnc.rst: -------------------------------------------------------------------------------- 1 | VNC 远程桌面 2 | #################################### 3 | 4 | VNC 是基于 RFB(Remote FrameBuffer)的一款开源的远程桌面控制软件。它由客户端、服务端和一个协议组成。 5 | 6 | 开源的 VNC 衍生出了三个重大的分支版本(RealVNC,VNC tight 和 UltraVNC),其中 Real VNC 是当前跨平台的主流应用,分为全功能商业版和免费版。 7 | 8 | 9 | 安装 VNC Server 10 | ************************************ 11 | 12 | yum 安装,CentOS 5.3 yum 源自带了 vnc 与 vnc-server。 13 | 14 | .. highlight:: none 15 | 16 | :: 17 | 18 | [Linux]# yum install vnc 19 | 20 | [Linux]# yum install vnc-server 21 | 22 | 23 | 配置 VNC Server 24 | ************************************ 25 | 26 | VNC Server 的配置文件为 /etc/sysconfig/vncservers,在文件末尾添加以下两句: 27 | 28 | :: 29 | 30 | # 由于 root 用户使用的是第一个 VNC Server,我们添加 Server 是从 2 开始的,所以这里桌面号是 2,用户名是 hubery。 31 | VNCSERVERS="2:hubery" 32 | 33 | # 桌面分辨率为 800*600,阻止图形桌面通过 TCP 端口,不能通过 WEB 访问 vncserver,不能通过不安全的方式从远程登录。 34 | VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -nohttpd -localhost" 35 | 36 | 关于参数配置说明: 37 | 38 | - \-geometry 表示桌面分辨率,默认为 1024x768 39 | - \-nohttpd 表示不监听 HTTP 端口(58xx) 40 | - \-nolisten tcp 表示不监听 TCP 端口(60xx) 41 | - \-localhost 只允许从本机访问 42 | - AlwaysShared 默认只允许一个 VNCVIEWER 连接,此参数表示同一个显示端口允许多用户同时登录 43 | - \-depth 表示色深,参数有 8,16,24,32. 44 | - SecurityTypes None 登录不需要密码认证 VncAuth 默认值,要密码认证。 45 | 46 | VNC 使用的起始端口是 5900 和 5800,桌面号是 2 时,VNC Viewer 访问的端口是 5902,WEB 方式(java)访问的端口号是 5802。 47 | 48 | root 用户的配置也是这个文件,若要配置需要在文件末尾同样加上类似以上两句。 49 | 50 | 以上配置,vncserver 将在服务启动时打开 vncserver :2。 51 | 52 | 53 | 防火墙配置 54 | ************************************ 55 | 56 | 如果不熟悉防火墙 iptables,可以直接关掉(重启失效): 57 | 58 | :: 59 | 60 | [Linux]# iptables -L 61 | 62 | 或 63 | [Linux]# service iptables stop 64 | 65 | 但一般不建议这样做,我们需要在防火墙里打开某些端口: 66 | 67 | :: 68 | 69 | [Linux]# iptables -I INPUT -p tcp --dport 5901:5902 -j ACCEPT 70 | [Linux]# iptables -I INPUT -p udp --dport 5901:5902 -j ACCEPT 71 | 72 | 同样,上述操作在计算机重启之后也会失效,以下操作将配置保存到配置文件,使其永久生效: 73 | 74 | :: 75 | 76 | [Linux]# service iptables save 77 | 78 | 79 | 启动 VNC Server 80 | ************************************ 81 | 82 | 在启动 Server 之前需要给远程控制设置一个访问密码: 83 | 84 | :: 85 | 86 | [Linux]# su hubery 87 | [Linux]$ vncpasswd 88 | Password: 89 | Verify: 90 | [Linux]$ vncserver :2 91 | xauth: creating new authority file /home/hubery/.Xauthority 92 | 93 | New 'localhost:2 (hubery)' desktop is localhost:2 94 | 95 | Creating default startup script /home/hubery/.vnc/xstartup 96 | Starting applications specified in /home/hubery/.vnc/xstartup 97 | Log file is /home/hubery/.vnc/localhost:2.log 98 | 99 | [Linux]$ 100 | 101 | 关闭某个 vncserver: 102 | 103 | :: 104 | 105 | [Linux]$ vncserver -kill :2 106 | 107 | 108 | VNC Viewer 访问 109 | ************************************ 110 | 111 | 我的 VNC 客户端是在 Win XP 下安装的 TigerVNC Viwer,可以从其官网免费下载。安装 VNC Viewer 后以 Server_IP:桌面号的形式访问。 112 | 113 | .. image:: ../Images/vnc.01.png 114 | 115 | 116 | 桌面配置(可选) 117 | ************************************ 118 | 119 | 以上配置登陆之后得到的是 twm 桌面,看起来像一个终端,但它还是桌面,我们可以从命令行启动桌面应用,例如 firefox,但是一般人是用不习惯、不会去用它的,可以换其它的桌面吗?当然可以,其配置文件为 ~/.vnc/xstartup,将 twm 修改为 gnome-session 或 startkde 即可切换成 gnome 或 kde。 120 | 121 | .. image:: ../Images/vnc.02.png 122 | 123 | :: 124 | 125 | #!/bin/sh 126 | 127 | # Uncomment the following two lines for normal desktop: 128 | # unset SESSION_MANAGER 129 | # exec /etc/X11/xinit/xinitrc 130 | 131 | [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup 132 | [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources 133 | xsetroot -solid grey 134 | vncconfig -iconic & 135 | xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & 136 | # twm & 137 | gnome-session & 138 | 139 | 切换之后重启服务是必须的: 140 | 141 | :: 142 | 143 | [Linux]# service vncserver restart 144 | 145 | 或 146 | 147 | [Linux]# su hubery 148 | [hubery@localhost .vnc]$ vncserver -kill :2 149 | Killing Xvnc process ID 20353 150 | [hubery@localhost .vnc]$ vncserver :2 151 | 152 | New 'localhost:2 (hubery)' desktop is localhost:2 153 | 154 | Starting applications specified in /home/hubery/.vnc/xstartup 155 | Log file is /home/hubery/.vnc/localhost:2.log 156 | 157 | [hubery@localhost .vnc]$ 158 | 159 | 使用 Viewer 重新登陆,你会发现我们熟悉的桌面又回来了: 160 | 161 | .. image:: ../Images/vnc.03.png 162 | 163 | 164 | 安全访问 VNC(可选) 165 | ************************************ 166 | 167 | 如果直接使用 vncviewer 来进行访问,有两点不利因素: 168 | 169 | 1. 口令传输是明文,很容易被侦听到。 170 | 171 | 2. 防火墙需要打开 59xx 端口,这在通常的单位里是不可能的。 172 | 173 | 幸运的是,我们有 ssh 这个强大的工具,我们可以使用 ssh 隧道来保护通讯过程,下面就进行简单介绍。 174 | 175 | 我依然使用 Win XP 下的 Tiger VNC 做客户端,其实对于 Linux 下也是可以的(更简单)。 176 | 177 | 1. 在 Session 下配置 Host Name 为 Server IP,Port 为 SSH 端口 22; 178 | 179 | .. image:: ../Images/vnc.04.png 180 | 181 | 2. 在 Connection > SSH > Tunnels 配置 Source port 为 VNC Server 端口号 5902,Destination 为 localhost:5902,并 Add 添加; 182 | 183 | .. image:: ../Images/vnc.05.png 184 | 185 | 3. 使用 TigerVNC Viewer 访问,地址现在是 localhost:2。 186 | 187 | .. image:: ../Images/vnc.06.png 188 | 189 | 至此,我们使用了加密的 VNC,而且也不需要配置防火墙打开端口,也就是说使用 ssh 隧道在没有步骤三的情况下也是有效的。 190 | -------------------------------------------------------------------------------- /docs/Chapter03/00_compress.rst: -------------------------------------------------------------------------------- 1 | 压缩与解压 2 | #################################### 3 | 4 | “小王,把我们郊游的照片压缩一下,发给我”,压缩文件在使用电脑时经常见到。将文件压缩不只是为了节省硬盘空间,同时也可以节省网络传输时间、归档文件方便管理等。 5 | 6 | 压缩可分为无损压缩与有损压缩两种,但不管是采用何种技术模型,其本质内容都是一样的,即通过某种特殊的编码方式将数据信息中存在的重复度、冗余度有效地降低,从而达到数据压缩的目的。例如二进制代码压缩,有 000000,可以把它变成 6 个 0 的写法 60,来减少该文件的空间。解压就是将压缩包中的文件恢复成没有压缩前的样子。 7 | 8 | .. note:: 有损压缩 9 | 10 | 在压缩时去除“不必要”的信息,对文件进行剪裁以使它变得更小,这种压缩方法称为有损压缩。在压缩后将无法复原成原始文件的样子。因此,如果需要完全重现原来的内容(例如软件应用程序、数据库和源代码),应该使用无损压缩。 11 | 12 | 有损压缩广泛应用于动画、声音和图像文件中,典型的代表就是影碟文件格式 mpeg、音乐文件格式 mp3 和图像文件格式 jpg。 13 | 14 | 15 | 在 Linux 中很多压缩程序只能针对一个文件进行压缩,当要压缩一大堆文件时,首先得先将一堆文件打成一个包(tar 命令),然后再用压缩程序进行压缩(gzip、bzip2 命令),就是说压缩会分为两步,先打包再压缩,各干个的事。 16 | 17 | 18 | 打包 19 | ************************************ 20 | 21 | tar 命令可以将多个文件和目录创建一个档案(归档),tar 最初是用来在磁带上创建档案;tar 命令也可以修改档案中的文件,或者加入新的文件;使用 tar 程序打出来的包我们常称为 tar 包,tar 包通常以 ``.tar`` 结尾。 22 | 23 | .. hint:: 归档的一般用途: 24 | 25 | * 把一大堆的文件和目录打包成一个 tar 包,便于网络传输。 26 | * 生成tar包后,再用其它的程序进行压缩。 27 | 28 | 推荐阅读: :ref:`tar 归档命令 ` 29 | 30 | 31 | 压缩 32 | ************************************ 33 | 34 | gzip 35 | ==================================== 36 | 37 | gzip 是 GNUzip 的缩写,它是一个 GNU 自由软件的文件压缩程序,文件经它压缩过后以 ``.gz`` 为扩展名,据统计,gzip 命令对文本文件有 60%~70% 的压缩率。gzip 不能用来压缩目录,需要先归档目录,然后在压缩。gzip 和 tar 一起构成了 Linux 操作系统中流行的文件压缩格式(.tar.gz)。 38 | 39 | gunzip 命令用来解压缩 gz 文件,事实上 gunzip 就是 gzip 的硬连接,因此不论是压缩或解压缩,都可以通过 gzip 命令单独完成。 40 | 41 | 推荐阅读: :doc:`../Chapter01/00_gzip` 42 | 43 | 44 | bzip2 45 | ==================================== 46 | 47 | bzip2 是一款自由软件,以开源软件协议发布的数据压缩算法及程序,以 ``.bz2`` 为扩展名结尾。bzip2 只是一个数据压缩工具,而不是归档工具,在这一点上它与 gzip 类似。 48 | 49 | bzip2 是一个基于 Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的 gzip 或 ZIP 的压缩效率更高,但是它的压缩速度较慢。bzip2 利用先进的压缩技术,能够把文件压缩到 10% 至 15%,压缩的速度和解压的效率都非常高,并且支持大多数压缩格式,包括 tar、gzip 等。 50 | 51 | 52 | 推荐阅读: :doc:`../Chapter01/00_bzip2` 53 | 54 | 55 | zip 56 | ==================================== 57 | 58 | zip 是一个应用广泛的跨平台的打包+压缩工具,压缩文件的扩展名为 ``.zip`` 。 59 | 60 | zip 是一种相当简单的分别压缩每个文件的存档格式。分别压缩文件允许不读取额外的数据而检索独立的文件;理论上,允许对不同的文件使用不同的算法。 61 | 62 | - 推荐阅读: :doc:`../Chapter01/00_zip` 63 | - 推荐阅读: :doc:`../Chapter01/00_unzip` 64 | 65 | .. hint:: 压缩工具对比 66 | 67 | - bzip2 gizp 命令会在压缩文件时替换原始文件,tar zip 不会替换 68 | - 除 bzip2 以外,压缩文件的权限将基于 umask 设置。bzip2 会保留原始文件的权限 69 | - zip 创建的压缩文件可以在 Windows 及 MacOS 和其他 Unix 系统即解压,兼容性更强 70 | 71 | 72 | 常用解压/压缩命令 73 | ************************************ 74 | 75 | **tar** 76 | 77 | :压缩: tar -cvf FileName.tar DirName 78 | :解压: tar -xvf FileName.tar 79 | 80 | 81 | **.gz** 82 | 83 | :压缩: gzip FileName 84 | :解压1: gunzip FileName.gz 85 | :解压2: gzip -d FileName.gz 86 | 87 | 88 | **.tar.gz 或 .tgz** 89 | 90 | :压缩: tar -zcvf FileName.tar.gz DirName 91 | :解压: tar -zxvf FileName.tar.gz 92 | 93 | 94 | **.bz2** 95 | 96 | :压缩: bzip2 -z FileName 97 | :解压1: bzip2 -d FileName.bz2 98 | :解压2: bunzip2 FileName.bz2 99 | 100 | 101 | **.tar.bz2** 102 | 103 | :压缩: tar -jcvf FileName.tar.bz2 DirName 104 | :解压: tar -jxvf FileName.tar.bz2 105 | 106 | 107 | **.Z** 108 | 109 | :压缩: compress FileName 110 | :解压: uncompress FileName.Z 111 | 112 | 113 | **.tar.Z** 114 | 115 | :压缩: tar -Zcvf FileName.tar.Z DirName 116 | :解压: tar -Zxvf FileName.tar.Z 117 | 118 | 119 | **.zip** 120 | 121 | :压缩: zip FileName.zip DirName 122 | :解压: unzip FileName.zip 123 | 124 | 125 | **.rar** 126 | 127 | :压缩: rar -a FileName.rar DirName 128 | :解压: rar -x FileName.rar 129 | -------------------------------------------------------------------------------- /docs/Chapter03/00_inode.rst: -------------------------------------------------------------------------------- 1 | inode 索引节点 2 | #################################### 3 | 4 | inode 是理解 Unix/Linux 文件系统和硬盘储存的基础。 5 | 6 | 理解 inode,不仅有助于提高系统操作水平,还有助于体会 Unix 设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。 7 | 8 | 9 | inode 是什么? 10 | ************************************ 11 | 12 | 理解 inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存 512 字节(相当于 0.5KB)。 13 | 14 | 操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低。而是一次性连续读取多个扇区,即一次性读取一个"块"(block),这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小通常是 4KB,即连续八个 sector 组成一个 block。 15 | 16 | 文件数据都储存在"块"中,那么还需要一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等。这种储存文件元信息的区域就叫做 inode,中文译名为"索引节点"。 17 | 18 | 每一个文件都有对应的 inode,里面包含了与该文件有关的信息。 19 | 20 | 21 | inode 的内容 22 | ************************************ 23 | 24 | inode 包含文件的元信息,具体来说有以下内容: 25 | 26 | * 文件的字节数 27 | * 文件拥有者的 User ID 28 | * 文件用户组的 Group ID 29 | * 文件的读、写、执行权限 30 | * 文件的时间戳,共有三个: 31 | - ctime 指 inode 上一次变动的时间 32 | - mtime 指文件内容上一次变动的时间 33 | - atime 指文件上一次打开的时间 34 | * 链接数,即有多少文件名指向这个 inode 35 | * 文件数据 block 的位置 36 | 37 | 可以用 :ref:`stat ` 命令,查看某个文件的 inode 信息: 38 | 39 | .. highlight:: none 40 | 41 | :: 42 | 43 | [Linux]$ stat abc.txt 44 | File: 'abc.txt' 45 | Size: 7805 Blocks: 16 IO Block: 4096 regular file 46 | Device: fc09h/64521dInode: 152067 Links: 1 47 | Access: (0664/-rw-rw-r--) Uid: ( 5000/shiyanlou) Gid: ( 5000/shiyanlou) 48 | Access: 2018-01-16 15:14:20.419663570 +0800 49 | Modify: 2018-01-16 15:14:28.331874373 +0800 50 | Change: 2018-01-16 15:14:28.331874373 +0800 51 | Birth: - 52 | 53 | 54 | 总之,除了文件名以外的所有文件信息,都存在 inode 之中。至于为什么没有文件名,下文会有详细解释。 55 | 56 | 57 | inode 的大小 58 | ************************************ 59 | 60 | inode 也会消耗硬盘空间,所以在格式化硬盘的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区(inode table),存放 inode 所包含的信息。 61 | 62 | inode 节点一般占用 128 字节或 256 字节。inode 节点的总数,在格式化时会自动设定。一般是每 1KB 或每 2KB 就设置一个 inode。假定在一块 1GB 的硬盘中,每个 inode 节点的大小为 128 字节,每 1KB 就设置一个 inode,那么 inode table 的大小就会达到 128MB,占整块硬盘的 12.8%。 63 | 64 | 查看每个硬盘分区的 inode 总数和已经使用的数量,可以使用 :ref:`df ` 命令。 65 | 66 | :: 67 | 68 | [Linux]$ df -i 69 | Filesystem 70 | Inodes IUsed IFree IUse% Mounted on 71 | /dev/mapper/docker 72 | 786432 109887 676545 14% / 73 | tmpfs 74 | 1021949 17 1021932 1% /dev 75 | tmpfs 76 | 1021949 11 1021938 1% /sys/fs/cgroup 77 | /dev/xvdc1 78 | 19660800 10120 19650680 1% /etc/hosts 79 | shm 80 | 1021949 1 1021948 1% /dev/shm 81 | 82 | 83 | 查看每个 inode 节点的大小,可以用如下命令(需要 root 权限): 84 | 85 | :: 86 | 87 | [Linux]# dumpe2fs -h /dev/hda | grep "Inode size" 88 | dumpe2fs 1.41.14 (22-Dec-2010) 89 | Inode size: 256 90 | 91 | 92 | 由于每个文件都必须有一个 inode,因此有可能发生 inode 已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。 93 | 94 | 95 | inode 号码 96 | ************************************ 97 | 98 | 每个 inode 都有一个号码,操作系统用 inode 号码来识别不同的文件。 99 | 100 | 这里值得重复一遍,Unix/Linux 系统内部不使用文件名,而使用 inode 号码来识别文件。对于系统来说,文件名只是 inode 号码便于识别的别称或者绰号。 101 | 102 | 表面上,用户通过文件名打开文件。实际上,系统内部将这个过程分成三步: 103 | 104 | 1. 系统找到文件名对应的 inode 号码 105 | 2. 通过 inode 号码,获取 inode 信息 106 | 3. 根据 inode 信息,找到文件数据所在的 block,读出数据。 107 | 108 | 使用 :ref:`ls -l ` 命令查看文件名对应的 inode 号码: 109 | 110 | :: 111 | 112 | [Linux]$ ls -i abc.txt 113 | 152067 abc.txt 114 | 115 | 116 | 目录文件 117 | ************************************ 118 | 119 | Unix/Linux 系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。 120 | 121 | 目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的 inode 号码。所以在使用 :ref:`ls -lh ` 命令查看文件夹大小时,所有的文件夹只有 4KB 大小。 122 | 123 | ls 命令只列出目录文件中的所有文件名: 124 | 125 | :: 126 | 127 | [Linux]$ ls -lh 128 | total 48K 129 | drwxr-xr-x 2 glenn glenn 4.0K Jul 9 14:59 Desktop 130 | drwxr-xr-x 10 glenn glenn 4.0K Dec 3 17:39 Documents 131 | drwxr-xr-x 2 glenn glenn 12K Nov 30 13:46 Downloads 132 | drwxr-xr-x 3 glenn glenn 4.0K Nov 30 14:53 Music 133 | drwxr-xr-x 2 glenn glenn 4.0K Nov 30 14:54 Pictures 134 | drwxr-xr-x 2 glenn glenn 4.0K Nov 22 20:33 Public 135 | drwxr-xr-x 2 glenn glenn 4.0K Jul 9 14:59 Templates 136 | drwxr-xr-x 8 glenn glenn 4.0K Oct 19 22:52 Videos 137 | 138 | 139 | 如果要查看文件的详细信息,就必须根据 inode 号码,访问 inode 节点,读取信息。 140 | 141 | .. note:: 目录的执行权限 142 | 143 | 目录文件的读权限(r)和写权限(w)只是针对目录文件本身。由于目录文件内只有文件名和 inode 号码,所以如果只有读权限,只能获取文件名,无法获取其他信息。 144 | 145 | :: 146 | 147 | [Linux]$ ls -l 148 | drw-rw-rw- 2 glenn glenn 4096 Dec 5 18:11 test/ 149 | [Linux]$ls -l test/ 150 | total 0 151 | d????????? ? ? ? ? ? ./ 152 | d????????? ? ? ? ? ? ../ 153 | -????????? ? ? ? ? ? b.txt 154 | 155 | 要读取 inode 节点内的信息具有文件夹的执行权限(x)。 156 | 157 | 158 | inode 的特殊作用 159 | ************************************ 160 | 161 | 由于 inode 号码与文件名分离,这种机制导致了一些 Unix/Linux 系统特有的现象。 162 | 163 | 1. 当文件名包含特殊字符,无法正常删除时。可以删除 inode 节点,就能直接删除文件。 164 | 2. 移动文件或重命名文件,只是改变文件名,不影响 inode 号码。所以在 Linux 中移动文件不论大小基本秒成。 165 | 3. 打开一个文件后,系统就以 inode 号码来识别文件,不再考虑文件名。因此,系统无法从 inode 号码得知文件名。 166 | 167 | 第 3 点使得在更新软件时可以不关闭、不重启软件。因为系统通过 inode 号码,识别运行中的文件,软件更新的时候,新版文件以同样的文件名,生成一个新的 inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode 则被回收。 168 | -------------------------------------------------------------------------------- /docs/Chapter03/00_link.rst: -------------------------------------------------------------------------------- 1 | 硬链接和软链接 2 | #################################### 3 | 4 | 在 Linux 中有两种 link(链接)的概念,一般称之为硬链接和软链接(或符号链接)。在理解链接之前最好了解一下 :doc:`00_inode`。 5 | 6 | 7 | 硬链接 8 | ************************************ 9 | 10 | 一般情况下,文件名和 inode 号码是"一一对应"的关系,每个 inode 号码对应一个文件名(每个文件默认有一个硬链接)。但是,Unix/Linux 系统允许多个文件名指向同一个 inode 号码。 11 | 12 | 这意味着,可以用不同的文件名访问同样的内容,对文件内容进行修改后,会影响所有文件名。但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。 13 | 14 | 创建一个硬链接,就会为文件创建了一个新的文件名。硬链接有两个重要局限性: 15 | 16 | 1. 硬链接不能链接不在同一系统的文件。也就是说硬链接不能链接与文件不在同一磁盘分区上的文件; 17 | 2. 硬链接不能链接目录。 18 | 19 | 一个硬链接和文件本身没有什么区别。当你列出一个包含硬链接的文件时,不会有特殊的链接指示说明。当一个硬链接被删除时,文件本身的内容仍然存在(也就是说,它所占的磁盘空间不会被重新分配),直到所有关联这个文件的硬链接都删掉。 20 | 21 | 使用 :ref:`ln ` 命令创建硬链接: 22 | 23 | .. highlight:: none 24 | 25 | :: 26 | 27 | [Linux]$ ln abc.txt def.txt 28 | [Linux]$ ls -li 29 | total 24 30 | 152410 drwxrwxr-x 2 shiyanlou shiyanlou 4096 Aug 17 2016 Desktop 31 | 152067 -rw-rw-r-- 2 shiyanlou shiyanlou 7805 Jan 16 15:14 abc.txt 32 | 152067 -rw-rw-r-- 2 shiyanlou shiyanlou 7805 Jan 16 15:14 def.txt 33 | 34 | 35 | 运行上面的命令后,多出一个 def.txt 文件,而且两个文件的 inode 号相同。inode 信息中的“链接数”会增加 1。 36 | 37 | 反过来,删除一个文件名,就会使得 inode 节点中的"链接数"减 1。当这个值减到 0,表明没有文件名指向这个 inode,系统就会回收这个 inode 号码,以及其所对应 block 区域。 38 | 39 | .. note:: 目录文件的硬链接 40 | 41 | 创建目录时,默认会生成两个目录项: ``.`` 和 ``..`` 。 ``.`` 相当于当前目录的硬链接; ``..`` 相当于父目录的硬链接。所以,目录的硬链接总数,等于 2 加上它的子目录总数(含隐藏目录)。其实使用 ``ln -d`` 命令也允许 root 用户尝试建立目录硬链接。 42 | 43 | 这些都说明系统限制对目录进行硬链接只是一个硬性规定,并不是逻辑上不允许或技术上不可行。为什么操作系统要进行这个限制呢? 44 | 45 | 由于 Linux 操作系统中的目录是以 ``/`` 为节点的树状结构,对目录的硬链接有可能破坏这种结构,甚至形成循环如: ``/usr/bin -> /usr/`` ,在使用遍历目录的命令时(如: ``ls -R`` )系统就会陷入无限循环中。软链接的 inode 号码不一样,所以不会出现这种问题。 46 | 47 | 48 | 软链接(或符号连接) 49 | ************************************ 50 | 51 | 除了硬链接以外,还有一种软链接,创建软链接是为了克服硬链接的局限性。 52 | 53 | 软链接是通过创建一个特殊类型的文件(指针)链接到文件或目录。就像是 Windows 的快捷方式,当然,符号链接早于 Windows 的快捷方式很多年。 54 | 55 | 文件 A 和文件 B 的 inode 号码虽然不一样,但是文件 A 的内容是文件 B 的路径。读取文件 A 时,系统会自动将访问指向文件 B。因此,无论打开哪一个文件,最终读取的都是文件 B。但是,文件 A 依赖于文件 B 而存在,如果删除了文件 B,打开文件 A 就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件 A 指向文件 B的文件名,而不是文件 B 的 inode 号码。 56 | 57 | 58 | .. hint:: 软链接的应用 59 | 60 | 想象这样一个情景,一个程序需要使用 foo_1.1 文件中的共享资源,由于 foo 经常改变版本号。每次升级后都得将使用 foo_1.1 的所有程序更新到 foo_1.2 文件,那么每次更新 foo 版本后,都要重复上边的工作。 61 | 62 | 符号链接能很好的解决这个问题。比如,创建一个 foo 的软链接指向 foo_1.2。这时,当一个程序访问 foo 时,实际上是访问 foo_1.2。当升级到 foo_1.3 时,只需要更新软链接指向。这不仅解决了版本升级问题,而且还允许在系统中保存两个不同的版本,如果 foo_1.3 有错误,再更新回原来的 foo_1.2 链接就可以。 63 | 64 | 65 | 使用 :ref:`ln -s ` 命令创建软链接: 66 | 67 | :: 68 | 69 | [Linux]$ ln -s abc.txt aaa 70 | [Linux]$ ls -l 71 | total 8 72 | lrwxrwxrwx 1 shiyanlou shiyanlou 7 Jan 16 17:49 aaa -> abc.txt 73 | -rw-rw-r-- 1 shiyanlou shiyanlou 7805 Jan 16 17:49 abc.txt 74 | -------------------------------------------------------------------------------- /docs/Chapter03/00_permission.rst: -------------------------------------------------------------------------------- 1 | 安全模型与权限 2 | ################################ 3 | 4 | 在 Linux 系统中,所有的操作实质上都是在进行进程访问文件的操作。在访问文件之前需要取得相应的权限,而权限是通过 Linux 系统中的安全模型获得的。理论上进程所拥有的权限与执行它的用户的权限相同。其中涉及的一切内容,都是围绕这个核心进行的。 5 | 6 | Linux 系统中的安全模型,有两种类型: 7 | 8 | 1. Linux 系统上最初的安全模型叫自主访问控制(DAC 全称 Discretionary Access Control) 9 | 10 | 2. 后来又增加设计了一个新的安全模型叫强制访问控制(MAC 全称 Mandatory Access Control) 11 | 12 | MAC 和 DAC 不是互斥的,DAC 是最基本的安全模型,也是最常用的访问控制机制,是 Linux 必须具有的功能;而 MAC 是构建在 DAC 之上的加强安全机制,属于可选模块。 13 | 14 | 为区分两者,我们将支持 MAC 的 Linux 系统称作 SELinux,表示它是针对 Linux 的安全加强系统。 15 | 16 | 17 | 用户和组信息 18 | ******************************** 19 | 20 | 用户和组分别用 UID 和 GID 表示,一个用户可以同时属于多个组,默认每个用户必属于一个与之 UID 同值同名的 GID。 21 | 22 | 系统保存用户信息的文件是 ``/etc/passwd`` ,保存组信息的文件是 ``/etc/group`` ,保存密码口令及其变动信息的文件是 ``/etc/shadow`` 。 23 | 24 | .. highlight:: none 25 | 26 | :: 27 | 28 | [Linux]$ cat /etc/passwd 29 | root:x:0:0:root:/root:/bin/bash 30 | daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin 31 | sync:x:4:65534:sync:/bin:/bin/sync 32 | uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin 33 | ... 34 | 35 | 在 passwd 文件中每条记录分别为: 36 | 37 | - 用户名 38 | - 密码口令(在 /etc/shadow 中加密保存) 39 | - UID 40 | - GID(默认 UID) 41 | - 描述注释 42 | - 主目录 43 | - 登录 shell(第一个运行的程序) 44 | 45 | 46 | :: 47 | 48 | [Linux]$ cat /etc/group 49 | root:x:0: 50 | tty:x:5: 51 | cdrom:x:24:xiao,da 52 | ftp:x:113: 53 | ... 54 | 55 | 在 group 文件中每条记录分别为: 56 | 57 | - 组名 58 | - 密码口令(一般不存在组口令) 59 | - GID 60 | - 组成员用户列表(逗号分割的用户 UID 列表) 61 | 62 | :: 63 | 64 | [Linux]# cat /etc/shadow 65 | root:$6$N3FOQjepEb0oy2FynGXqNTpH0eAWe4UF0:18843:0:99999:7::: 66 | sshd:*:18843:0:99999:7::: 67 | xiao:$6$u9TxaH3T.Ks.4wLeZgC9aEzBI8X7AYvW9:18843:0:99999:7::: 68 | ftp:*:18843:0:99999:7::: 69 | ... 70 | 71 | 在 shadow 文件中每条记录分别为: 72 | 73 | - 登录名 74 | - 加密口令 75 | - 最后一次修改时间 76 | - 最小时间间隔 77 | - 最大时间间隔 78 | - 警告时间 79 | - 不活动时间 80 | 81 | 82 | 文件权限控制 83 | ******************************** 84 | 85 | 在 Linux 中 :doc:`一切皆为文件 <00_file>` ,对文件的权限分三组进行控制: 86 | 87 | - user 对文件属主设定的权限 88 | - group 对文件属组设定的权限 89 | - others 对其他者设定的权限 90 | 91 | 常用的可设定的权限值,包括: 92 | 93 | - r 读权限 94 | - w 写权限 95 | - x 执行权限 96 | - s 强制位权限 97 | - t 粘滞位权限 98 | - i 不可修改权限 99 | - a 只追加权限 100 | 101 | .. hint:: 强制位和粘滞位 102 | 103 | 强制位权限可以使其他用户临时拥有文件所有者的身份。典型的是 ``/etc/shadow`` 文件,当用户修改密码时需要获得 root 权限。 104 | 105 | 强制位权限针对可执行文件和目录,包含 S_ISUID、S_ISGID 两个常量; 106 | 107 | - S_ISUID 只能应用于二进制可执行文件(shell 脚本不是二进制文件) 108 | - S_ISGID 可应用于二进制可执行文件和目录,当 S_ISGID 用于目录时,用户进程的用户组 ID 将会设置为该目录的用户组。 109 | 110 | 粘滞位权限,一般对目录针对 others 设置,设置后在目录中只有属主和 root 有删除文件的权限,即用户只能删除自己为属主的文件(多用于共享目录中)。 111 | 112 | .. attention :: 113 | 114 | 当对一个不具备 x 权限的文件设置 s 权限时无效,权限变为大写 S,表明 s 权限未生效。 115 | 116 | 117 | 目录的 x 权限 118 | ==================================== 119 | 120 | 当目录只有读取权限时,是无法用 :ref:`cd 命令 ` 打开或用 :ref:`ls 命令 ` 列出目录中的文件信息的。需要读取目录中的文件时,此目录必须具备 x 权限。 121 | 122 | ====== ====== ====== ====== ====== 123 | 权限 cd ls cat touch 124 | ====== ====== ====== ====== ====== 125 | r-- No No No No 126 | -w- No No No No 127 | --x Yes No Yes No 128 | r-x Yes Yes Yes No 129 | rwx Yes Yes Yes Yes 130 | ====== ====== ====== ====== ====== 131 | 132 | 133 | 查看和修改权限 134 | ==================================== 135 | 136 | 通过 :ref:`ls -l ` 可以查看到其文件类型及权限,通过 :ref:`chmod ` 修改权限,通过 :ref:`chown ` 改变文件或目录的属主,通过 :ref:`chgrp ` 改变文件或目录的所属组。 137 | 138 | :: 139 | 140 | [Linux]$ ls -l / 141 | total 60 142 | lrwxrwxrwx 1 root root 7 Aug 4 15:58 bin -> usr/bin 143 | drwxr-xr-x 3 root root 4096 Aug 4 16:19 boot 144 | drwxr-xr-x 3 root root 4096 Aug 4 16:20 home 145 | ... 146 | 147 | 148 | 输出中,第 1 个字符表示文件类型,第 2-10 字符部分表示文件的权限位,共有 9 位。 149 | 150 | .. image:: ../Images/permission.01.jpg 151 | 152 | 153 | 进程权限控制信息 154 | ******************************** 155 | 156 | 对于进程,有如下属性与文件访问权限相关: 157 | 158 | - effective user id:进程访问文件权限相关的 UID(简写为 euid) 159 | - effective group id:进程访问文件权限相关的 GID(简写为 egid) 160 | - real user id:创建进程的用户登录系统时的 UID(简写为 ruid) 161 | - real group id:创建进程的用户登录系统时的 GID(简写为 rgid) 162 | - saved set user id:当进程被执行时拷贝自 euid 163 | - saved set group id:当进程被执行时拷贝自 egid 164 | 165 | 实际用户ID(RUID):用于标识一个系统中用户是谁,一般就是登陆的用户 uid 166 | 167 | 有效用户ID(EUID):用于系统决定用户对系统资源的权限,一般就是进程的创建者(也就是属主)。 168 | 169 | 可以通过 top 命令查看进程的 euid 和 ruid。 170 | 171 | 172 | 进程访问文件的控制策略 173 | ==================================== 174 | 175 | 对于进程访问文件而言,最重要的是 euid, 所以其权限属性均以 euid 为 “中心”。 176 | 177 | - 进程的 euid 一般为其 ruid 值,若文件具有 s 权限,其 euid 为该文件的 user id 178 | - 进程的 saved set user id 拷贝自 euid. 179 | - 当进程的 euid 与文件的 user id 匹配时,进程才具有文件 user 权限位所设定的权限 180 | - 组权限 egid 的控制规则类似。 181 | 182 | 183 | 通过 exec 调用可执行文件之时: 184 | 185 | - 进程 ruid 值始终不变 186 | - saved set-user ID 始终来自 euid 187 | - euid 值取决于文件的 set-user-ID 位是否被设置 188 | 189 | 假设 man 程序文件被用户 man 所拥有,并且已经被设置了 set-user-ID 位,当用执行它的时候,会有如下情况: 190 | 191 | - real user ID= 我们的用户 UID 192 | - effective user ID= man 用户 UID 193 | - saved set-user-ID= man 用户 UID 194 | 195 | man 程序会访问需要的配置文件,这些文件由 man 用户所拥有,但是由于 effective user ID 是 man,文件的访问就被允许了。 196 | -------------------------------------------------------------------------------- /docs/Chapter03/00_port.rst: -------------------------------------------------------------------------------- 1 | 计算机端口 2 | #################################### 3 | 4 | 简介 5 | ************************************ 6 | 7 | 计算机“端口”是英文 port 的义译,可以认为是计算机与外界通讯交流的出口。其中硬件领域的端口又称接口,如:USB端口、串行端口等。软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和 I/O(基本输入输出)缓冲区。 8 | 9 | .. hint:: 从现实世界理解端口 10 | 11 | 将计算机想象成一栋医院大楼,里边有很多科室,科室里还会有主任医师、副主任医师、主治医师等等的单独诊室。挂号处就相当于 inetd 守护进程,而一个个的诊室就相当于端口(门牌号相当于端口号),每个端口负责不同的服务,处理不同的请求。比如:80 诊室负责处理 Web 请求,访客可以通过 80 端口获得网页内容。后来负责处理 Web 请求的人搬进了 8080 诊室,继续做相同的工作。另外一个人搬进了 80 诊室,但他并不处理 Web 请求(或者 80 诊室停止使用了)。那么再有试图通过 80 诊室获得网页内容的访客就会“吃闭门羹”,只有通过新的 8080 诊室才能获得网页内容。 12 | 13 | 每个端口都拥有一个叫端口号的整数描述符,用来区别不同的端口。由于 TCP/IP 传输层的 TCP 和 UDP 两个协议是两个完全独立的软件模块,因此各自的端口号也相互独立。如 TCP 有一个 255 号端口,UDP 也可以有一个 255 号端口,两者并不冲突。 14 | 15 | .. note:: 面向连接(TCP)和无连接协议(UDP) 16 | 17 | 面向连接服务的特点:面向连接服务要经过三个阶段:数据传数前,先建立连接;连接建立后再传输数据;数据传送完后,释放连接。面向连接服务,可确保数据传送的次序和传输的可靠性。 18 | 19 | 无连接服务的特点是:无连接服务只有传输数据阶段,消除了除数据通信外的其它开销。它的优点是灵活方便、迅速,特别适合于传送少量零星的报文。缺点也很明显,它不能防止报文的丢失、重复或失序。 20 | 21 | 要区分“面向连接服务”和“无连接服务”的概念特别简单,来举两个形象的例子:打电话和写信。两个人要通电话,必须先建立连接——拨号,等待应答后才能相互传递信息,最后还要释放连接——挂电话。而写信就没有那么复杂了,地址姓名填好以后直接往邮筒一扔,收信人就能收到。TCP/IP 协议里面低于 1024 的端口都有确切的定义,它们对应着因特网上常见的一些服务。这些常见的服务可以划分为使用 TCP 端口(面向连接如打电话)和使用 UDP 端口(无连接如写信)两种。 22 | 23 | 端口号有两种基本分配方式:第一种叫全局分配,这是一种集中分配方式,由一个公认权威的中央机构根据用户需要进行统一分配,并将结果公布于众;第二种是本地分配(又称动态连接),即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回本地唯一的端口号,进程再通过合适的系统调用,将自己和该端口连接起来(binding,绑定)。 24 | 25 | TCP/IP 端口号的分配综合了以上两种方式,将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。每一个标准服务器都拥有一个全局公认的端口叫周知口,即使在不同的机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP 和 UDP 规定,小于 256 的端口才能作为保留端口。 26 | 27 | 按端口号可分为三大类: 28 | 29 | 1. 公认端口(Well Known Ports):从 0 到 1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80 端口实际上总是 HTTP 通讯。 30 | 31 | 2. 注册端口(Registered Ports):从 1024 到 49151,它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从 1024 左右开始。 32 | 33 | 3. 动态/私有端口(Dynamic and/or Private Ports):从 49152 到 65535,理论上,不应为服务分配这些端口。实际上,机器通常从 1024 起分配动态端口。但也有例外:SUN 的 RPC 端口从 32768 开始。 34 | 35 | .. note:: 系统管理员可以“重定向”端口: 36 | 37 | 实现重定向是为了隐藏公认的默认端口,降低受破坏率。如果有人要对一个默认端口进行攻击必须先进行端口扫描,确定是否开启了此端口。大多数端口重定向与原端口有相似之处,例如多数 HTTP 端口由 80 变化而来:81、88、8000、8080、8888,许多人有其它原因选择奇怪的数:42,69,666,31337。Blake R. Swopes 指出使用重定向端口还有一个原因,在 UNIX 系统上,想侦听 1024 以下的端口需要有 root 权限,如果你没有 root 权限而又想开 web 服务,就需要将其重定向到较高的端口。此外,一些 ISP 的防火墙(路由器层面)将阻挡低端口的通讯,这样的话即使你拥有主机 root 权限,需要连接外网还是得重定向到较高的端口。 38 | 39 | 将默认的 HTTP 端口 80 重定向到端口 8080,网页的访问地址也要相应的改变:http://wwd.adiba.top:8080/net/port.html。 40 | 41 | 42 | 关闭不必要的端口 43 | ************************************ 44 | 45 | 有人曾经把服务器比作房子,而把端口比作通向不同房间(服务)的门,如果不考虑细节的话,这是一个不错的比喻。入侵者要进入房子,势必要破门窗而入,那么对于入侵者来说,了解房子开了几扇门,都是什么样的门,门后面有什么东西就显得至关重要。 46 | 47 | 入侵者通常会用扫描器对目标主机的端口进行扫描,以确定哪些端口是开放的,从开放的端口,入侵者可以知道目标主机大致提供了哪些服务,进而猜测可能存在的漏洞,因此对端口的扫描可以帮助我们更好的了解目标主机,而对于管理员,扫描本机的开放端口也是做好安全防范的第一步。 48 | 49 | **查看端口信息** 50 | 51 | .. highlight:: none 52 | 53 | :: 54 | 55 | netstat -a #列出所有端口 56 | netstat -at #列出所有tcp端口 57 | netstat -au #列出所有udp端口 58 | 59 | netstat -l #只显示监听端口 60 | netstat -lt #只列出所有监听 tcp 端口 61 | netstat -lu #只列出所有监听 udp 端口 62 | 63 | **关闭一个端口** 64 | 65 | 下面介绍两种关闭 linux 系统端口的方法: 66 | 67 | 1. 通过杀掉进程的方法来关闭端口 68 | 69 | 每个端口都是一个进程占用着,都会有一个守护进程,kill 掉这个守护进程就可以了。 70 | 71 | .. highlight:: none 72 | 73 | :: 74 | 75 | netstat -anp | grep 端口号 # 找出占用端口的进程 76 | kill -9 PID # 通过 PID 杀掉进程 77 | 78 | 2. 通过防火墙限制端口 79 | 80 | 其中 $port 即为端口数字,iptables 的具体用法可以查看 man 手册 81 | 82 | :: 83 | 84 | iptables -A INPUT -p $port -j ACCEPT # 打开端口服务 85 | iptables -A INPUT -p $port -j DROP # 关闭端口服务 86 | 87 | 88 | 特殊的文件 89 | ************************************ 90 | 91 | /etc/services 文件是记录网络服务名和它们对应使用的端口号及协议。文件中的每一行对应一种服务,它由 4 个字段组成,中间用 TAB 或空格分隔,分别表示“服务名称”、“使用端口”、“协议名称”以及“别名”。 92 | 93 | :: 94 | 95 | # /etc/services 文件截取部分 96 | kermit 1649/udp 97 | l2tp 1701/tcp l2f 98 | l2tp 1701/udp l2f 99 | h323gatedisc 1718/tcp 100 | 101 | 102 | 很多的系统程序都要使用这个文件。如果每一个服务都能够严格遵循该机制,在此文件里标注自己所使用的端口信息,则主机上各服务间对端口的使用,将会非常清晰明了,易于管理;在该文件中定义的服务名,可以作为配置文件中的参数使用。例如:在配置路由策略时,使用"www"代替"80",即为调用了此文件中的条目“www 80”; 103 | 104 | 且当有特殊情况,需要调整端口设置,只需要在 /etc/services 中修改 www 的定义,即可影响到服务。 105 | 106 | 例如:在文件中增加条目“privPort 55555”,在某个私有服务中多个配置文件里广泛应用,进行配置。当有特殊需要,要将这些端口配置改为66666,则只需修改 /etc/services 文件中对应行即可。 107 | 108 | 在应用程序中可以通过服务名和协议获取到对应的端口号,通过在该文件注册可以使应用程序不再关心端口号。 109 | -------------------------------------------------------------------------------- /docs/Chapter03/00_uuid.rst: -------------------------------------------------------------------------------- 1 | 硬盘分区的 UUID 2 | #################################### 3 | 4 | UUID 是指通用唯一识别码(Universally Unique Identifier),用于帮助 Linux 系统识别一个磁盘分区而不是块设备文件。UUID 在系统中使用一个 128 位(比特)的数字来标识。 5 | 6 | UUID 最初被用在阿波罗网络计算机系统(NCS)中,之后 UUID 被开放软件基金会(OSF)标准化,成为分布式计算环境(DCE)的一部分。自 Linux 内核 2.15.1 起,libuuid 就是 util-linux-ng 包中的一部分,它被默认安装在 Linux 系统中,UUID 由该库生成,可以认为在一个系统中 UUID 是唯一的,并且在所有系统中也是唯一的。 7 | 8 | 9 | UUID 以 32 个十六进制的数字表示,被连字符分割为 5 组(格式为 8-4-4-4-12)。现在大多数的 Linux 系统都使用 UUID 挂载分区,这一点可以在 /etc/fstab 文件中验证: 10 | 11 | .. highlight:: none 12 | 13 | :: 14 | 15 | # cat /etc/fstab 16 | # /etc/fstab: static file system information. 17 | # 18 | # Use 'blkid' to print the universally unique identifier for a device; this may 19 | # be used with UUID= as a more robust way to name devices that works even if 20 | # disks are added and removed. See fstab(5). 21 | # 22 | # 23 | UUID=69d9dd18-36be-4631-9ebb-78f05fe3217f / ext4 defaults,noatime 0 1 24 | UUID=a2092b92-af29-4760-8e68-7a201922573b swap swap defaults,noatime 0 2 25 | 26 | 27 | 查看 UUID 28 | ************************************ 29 | 30 | 在查看硬盘的 UUID 之前,最好先 :ref:`mount ` 挂载硬盘。 31 | 32 | 33 | 查看 by-uuid 文件夹 34 | ==================================== 35 | 36 | Linux 中 /dev/disk/by-uuid/ 目录包含了 UUID 与实际的块设备文件链接。 37 | 38 | :: 39 | 40 | [Linux]$ ls -lh /dev/disk/by-uuid/ 41 | total 0 42 | lrwxrwxrwx 1 root root 10 Jan 29 08:34 ca307aa4-0866-49b1-8184-004025789e63 -> ../../sdc3 43 | lrwxrwxrwx 1 root root 10 Jan 29 08:34 d17e3c31-e2c9-4f11-809c-94a549bc43b7 -> ../../sdc1 44 | lrwxrwxrwx 1 root root 10 Jan 29 08:34 d92fa769-e00f-4fd7-b6ed-ecf7224af7fa -> ../../sda1 45 | 46 | 47 | lsblk 命令 48 | ==================================== 49 | 50 | 使用 :ref:`lsblk ` 命令列出所有有关可用或指定块设备的信息。lsblk 命令读取 sysfs 文件系统和 udev 数据库以收集信息。 51 | 52 | 如果 udev 数据库不可用或者编译的 lsblk 不支持 udev,它会试图从块设备中读取卷标、UUID 和文件系统类型。这种情况下,必须以 root 身份运行。该命令默认会以类似于树的格式打印出所有的块设备(RAM 盘除外)。 53 | 54 | :: 55 | 56 | [Linux]# lsblk -o name,mountpoint,size,uuid 57 | NAME MOUNTPOINT SIZE UUID 58 | sda 30G 59 | └─sda1 / 20G d92fa769-e00f-4fd7-b6ed-ecf7224af7fa 60 | sdb 10G 61 | sdc 10G 62 | ├─sdc1 1G d17e3c31-e2c9-4f11-809c-94a549bc43b7 63 | ├─sdc3 1G ca307aa4-0866-49b1-8184-004025789e63 64 | ├─sdc4 1K 65 | └─sdc5 1G 66 | sdd 10G 67 | sde 10G 68 | sr0 1024M 69 | 70 | 71 | blkid 命令 72 | ==================================== 73 | 74 | :ref:`blkid ` 是定位或打印块设备属性的命令行实用工具。它利用 libblkid 库在 Linux 系统中获得到磁盘分区的 UUID。 75 | 76 | :: 77 | 78 | [Linux]$ blkid 79 | /dev/sda1: UUID="d92fa769-e00f-4fd7-b6ed-ecf7224af7fa" TYPE="ext4" PARTUUID="eab59449-01" 80 | /dev/sdc1: UUID="d17e3c31-e2c9-4f11-809c-94a549bc43b7" TYPE="ext2" PARTUUID="8cc8f9e5-01" 81 | /dev/sdc3: UUID="ca307aa4-0866-49b1-8184-004025789e63" TYPE="ext4" PARTUUID="8cc8f9e5-03" 82 | /dev/sdc5: PARTUUID="8cc8f9e5-05" 83 | -------------------------------------------------------------------------------- /docs/Chapter03/40_console.rst: -------------------------------------------------------------------------------- 1 | 终端、控制台和 Shell 的区别 2 | #################################### 3 | 4 | 在网上看一些教程或文档时,经常会看到”打开终端输入命令“、”打开 Shell 输入命令“、“在控制台中输入命令”等等许多和系统交互的方式,但是在 Linux 中,控制台、终端和 Shell 又傻傻的分不清楚。 5 | 6 | - 终端(terminal 简称为 term) 7 | - 控制台(console) 8 | - Shell 俗称壳(用来区别于核) 9 | 10 | 从历史说起 11 | ************************************ 12 | 13 | 在计算机发展的最初,有两个最主要的特点:个头大和价格昂贵。在 20 世纪 70 年代 Ken Thompson 在 PDP-11(DEC 公司制造的小型计算机) 上开发 UNIX 系统时,为了解决计算机价格昂贵的问题,他们把 UNIX 设计成了多任务、多用户的操作系统。但是在那个年代所有的机器都非常昂贵,还是为了解决钱的问题,他们选择了一个价格便宜并且可用的机器( Teletype ASR33)来连接到 PDP-11,使计算机可以让多个人使用。 14 | 15 | 最初开发 Teletype ASR33("Teletype" 是一个商标名称。ASR 代表自动发送与接收,即 Automatic Send-Receive)的目的是通过电话线发送和接收消息,所以该机器被称为电传打字机(Teletypewriter 缩写为 TTY)。 16 | 17 | 18 | .. image:: ../Images/console.01.jpg 19 | 20 | .. image:: ../Images/console.02.jpg 21 | 22 | 所有的 Teletype 都有一个键盘用于输入和一卷纸用于打印输出。为了存储和读取数据还自带了一个纸带穿孔机和纸带阅读机。它没有屏幕、没有鼠标,也没有声音,但是它经济实惠并且可用。 23 | 24 | 在 UNIX 系统中,将 Teletype ASR33 称为终端(terminal),而将 PDP-11 称为主机(host)。其中终端只有两个功能:接受输入和打印输出。 25 | 26 | 在所有连接到主机的终端中,有一台终端比较特殊。可以把它看成是主机的一部分,它是用来管理系统的,这台特殊的终端就是控制台(console)。一台主机只有一个控制台。在启动计算机的时候,所有的信息都会显示到控制台上。在操作计算机的过程中,与终端不相关的信息,比如内核消息,后台服务消息,也会显示到控制台上。 27 | 28 | 简单来说,控制台是计算机的基本设备,而终端是附加设备。 29 | 30 | .. note:: 31 | 32 | 来感受一下最初的 UNIX 计算机,PDP-11 主机和多个 Teletype ASR33 终端。 33 | 34 | 35 | .. image:: ../Images/console.03.jpg 36 | 37 | 38 | 39 | 看视频感受一下当时的程序员是怎么工作的。 40 | 41 | `点击查看视频 >> `_ 42 | 43 | 44 | 随着时代的发展,UNIX 终端也越来越先进。键盘越来越完善并且更方便易用,纸上打印的输出方式也被屏幕显示器所取代。在历史上曾经出过数百个不同类型的终端,由于生产厂家不同,所遵循的标准不同,因此有不同的类型和标准(混乱的年代,还好没赶上)。但是其中有一种最流行的终端 VT100(1978 年由 DEC 公司生产),它是如此的流行,以至于被设立为一种永久的标准,大多数终端仿真程序都使用基于 VT100 的规范。 45 | 46 | .. image:: ../Images/console.04.jpg 47 | 48 | 49 | 说完了硬件,在来看一下软件 Shell,Shell俗称壳,是读取并解释命令的程序。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁,用户通过 Shell 访问操作系统内核的服务。常用的几种 shell 解释器:sh、bash、zsh、ash、csh。 50 | 51 | 52 | 虚拟化 53 | ************************************ 54 | 55 | 由于时代的发展计算机的硬件越来越便宜,现在都是一个人独占一台计算机(个人电脑),已经不再需要“终端”。因此,终端和控制台由硬件的概念慢慢演化成了软件的概念,终端和控制台的界限也慢慢模糊了。 56 | 57 | 虽然没有了“硬件终端”,但是在终端或 TTY 硬件接插的地方,操作系统仍然需要一个程序来监视串行端口。getty 就是一个监视串行端口的程序,对一台计算机来说,一个伪装的 TTY(Pseudo-TTY,也叫做“PTY”)就是一个终端。当运行一个 GNOME 终端程序时,就像是连接上了一个“硬件终端”。 58 | 59 | 现在说的终端,都是软件的概念,是用软件来模拟以前硬件的工作方式。比如在 linux 操作系统中,用 ``alt+f1~f6`` 可以切换 6 个虚拟终端,就好像是以前多人共用计算机中的终端设备。当然,你也可以通过串口线连接一个真正的终端,只是这种终端设备已经非常罕见了。 60 | 61 | .. note:: 62 | 63 | 在 linux 操作系统中,控制台和终端的区别越来越模糊。比如下面这条命令: ``echo "hello,world" > /dev/console`` 将 ``"hello,world"`` 显示到控制台上( ``/dev/console`` 是控制台的设备名)。在字符模式下,无论在哪个虚拟终端下执行这条命令,字符 ``hello,world`` 都会显示在当前的虚拟终端下,也就是说,linux 把当前的终端当作控制台来看待。 64 | 65 | 但是在 UNIX 系统中,却很明显的有虚拟终端和控制台的区别。比如在 freeBSD 系统中,只有第一个“终端”才是真正的控制台(就是说按 alt+f1 得到的那个虚拟终端)。无论在哪个虚拟终端上执行 ``echo "hello,world" > /dev/console`` 命令(哪怕是通过网络连接的伪终端上执行这条命令), ``hello,world`` 字符只会显示到控制台上。 66 | 67 | 普通用户可以简单的把终端和控制台理解为:可以输入命令行并显示程序运行过程中的信息以及运行结果的窗口。不必要严格区分这两者的差别。 68 | 69 | 70 | tty 和 getty 也是一个 Unix 命令,用来给出当前终端设备的名称。 71 | 72 | 终端、控制台、Shell 都软件化之后他们的界限很模糊,一般情况下,可以把三者等同。 73 | 74 | -------------------------------------------------------------------------------- /docs/Chapter04/30_unix.abbreviation.rst: -------------------------------------------------------------------------------- 1 | UNIX 缩写习惯 2 | #################################### 3 | 4 | 构建于图形界面之上的操作系统,使用鼠标作为主输入设备, 是否使用缩写并不重要。比如 Windows 系统中的目录,几乎都是全称…… 点击两次鼠标进入文件夹 pf, 并不意味着点击13次才能进入文件夹 Program Files 5 | 6 | 而构建于命令行之上的操作系统,如 Linux,只要3个字母以上的单词,几乎都要缩写。 例如: cd 命令是 Change Directory 的缩写。 作为常用命令,如果使用它的全称 Change Directory,绝对是无聊和乏味的工作。 7 | 8 | 最常见的缩写,取每个单词的首字母,如 9 | 10 | ====== ====== 11 | 缩写 说明 12 | ====== ====== 13 | cd Change Directory 14 | dd Disk Dump 15 | df Disk Free 16 | du Disk Usage 17 | pwd Print Working Directory 18 | ps Processes Status 19 | PS Prompt Strings 20 | su Substitute User 21 | rc Run Command 22 | Tcl Tool Command Language 23 | cups Common Unix Printing System 24 | apt Advanced Packaging Tool 25 | bg BackGround 26 | ping Packet InterNet Grouper 27 | ====== ====== 28 | 29 | 如果首字母后为“h”,通常保留 30 | 31 | ====== ====== 32 | 缩写 说明 33 | ====== ====== 34 | chsh CHange SHell 35 | chmod CHange MODe 36 | chown CHange OWNer 37 | chgrp CHange GRouP 38 | bash Bourne Again SHell 39 | zsh Z SHell 40 | ksh Korn SHell 41 | ssh Secure SHell 42 | ====== ====== 43 | 44 | 递归缩写也属于这一类,如: 45 | 46 | ====== ====== 47 | 缩写 说明 48 | ====== ====== 49 | GNU GNU's Not Unix 50 | PHP PHP: Hypertext Preprocessor 51 | RPM RPM Package Manager 52 | WINE WINE Is Not an Emulator 53 | PNG PNG's Not GIF 54 | nano Nano's ANOther editor 55 | ====== ====== 56 | 57 | 有些缩写可能有多种定义,如: 58 | 59 | **rpm** 60 | 61 | * RPM Package Manager 62 | 63 | * RedHat Package Manager 64 | 65 | **bc** 66 | 67 | * Basic Calculator 68 | 69 | * Better Calculator 70 | 71 | 这方面 Emacs 可谓独领风骚: 72 | 73 | **Emacs** 74 | 75 | * Editor MACroS 76 | 77 | * Emacs Makes A Computer Slow 78 | 79 | * Escape Meta Alt Control Shift 80 | 81 | * Emacs Makers Are Crazy Sickos 82 | 83 | * Emacs Makes All Computing Simple 84 | 85 | * Emacs Makefiles Annihilate C-Shells 86 | 87 | * Emacs Manuals Always Cause Senility 88 | 89 | * Emacs May Allow Customized Screwups 90 | 91 | * Emacs Manuals Are Cryptic and Surreal 92 | 93 | * Eventually Munches All Computer Storage 94 | 95 | * Eight Megabytes And Constantly Swapping 96 | 97 | * Elsewhere Maybe All Commands are Simple 98 | 99 | * Excellent Manuals Are Clearly Suppressed 100 | 101 | * Emacs May Alienate Clients and Supporters 102 | 103 | * Except by Middle Aged Computer Scientists 104 | 105 | * Extended Macros Are Considered Superfluous 106 | 107 | 如果只有一个单词,通常取每个音节的首字母: 108 | 109 | ====== ====== 110 | 缩写 说明 111 | ====== ====== 112 | cp CoPy 113 | ln LiNk 114 | ls LiSt 115 | mv MoVe 116 | rm ReMove 117 | ====== ====== 118 | 119 | 对于目录,通常使用前几个字母作为缩写: 120 | 121 | ====== ====== 122 | 缩写 说明 123 | ====== ====== 124 | bin BINaries 125 | dev DEVices 126 | etc ETCetera 127 | lib LIBrary 128 | var VARiable 129 | proc PROCesses 130 | sbin Superuser BINaries 131 | tmp TeMPorary 132 | usr Unix Shared Resources 133 | ====== ====== 134 | 135 | 这种缩写的其它情况 136 | 137 | ======== ====== 138 | 缩写 说明 139 | ======== ====== 140 | diff DIFFerences 141 | cal CALendar 142 | cat CATenate 143 | ed EDitor 144 | exec EXECute 145 | tab TABle 146 | regexp REGular EXPression 147 | ======== ====== 148 | 149 | 如果某种缩写比较深入人心,例如“mesg”代表“message”,在新的复合缩写中,将沿用这种缩写方式 150 | 151 | ====== ====== 152 | 缩写 说明 153 | ====== ====== 154 | dmesg Diagnostic MESsaGe 155 | sed Stream EDitor 156 | stty Set TTY 157 | fstab FileSystem TABle 158 | passwd PASSWorD 159 | ====== ====== 160 | 161 | 有些缩写中,第一个字母“g”,代表“GNU” 162 | 163 | ====== ====== 164 | 缩写 说明 165 | ====== ====== 166 | awk Aho Weiberger and Kernighan 167 | gawk GNU AWK 168 | gpg GNU Privacy Guard 169 | grep GNU Regular Expression Print 170 | egrep Extended GREP 171 | ====== ====== 172 | -------------------------------------------------------------------------------- /docs/Chapter04/55_github.clone.rst: -------------------------------------------------------------------------------- 1 | GitHub 命令行操作 2 | #################################### 3 | 4 | GitHub 是一个面向开源及私有软件项目的免费托管平台,作为个人开发者可以很方便的托管项目或为已有项目贡献代码。将 GitHub 仓库克隆到本地,并进行增、删、改、查等基本操作,也将作为一个基本技能必不可少。 5 | 6 | 基本的使用流程为: 7 | 8 | 1. 将项目克隆到本地 9 | 2. 新建分支 10 | 3. 常用的修改 11 | 4. 将修改提交到本地仓库 12 | 5. 将分支推送回 GitHub,并合并分支 13 | 14 | 将项目克隆到本地 15 | ************************************ 16 | 17 | 一切可以从新开始,直接将远程项目克隆到本地。但如果已有本地仓库,也可以只获取仓库的变化同步到本地。 18 | 19 | .. highlight:: none 20 | 21 | :: 22 | 23 | # 将项目克隆到本地 24 | $ git clone https://github.com/tonychacon/blink 25 | 26 | 27 | # 拉取远程仓库的变化,并与本地分支合并 28 | $ git pull [remote] [branch] 29 | 30 | # 显示所有远程仓库 31 | $ git remote -v 32 | 33 | 34 | 新建分支 35 | ************************************ 36 | 37 | :: 38 | 39 | # 新建分支,并切换到新分支 40 | $ git checkout -b [branch] 41 | 42 | 43 | # 列出所有分支,包括本地分支和远程分支 44 | $ git branch -a 45 | 46 | # 切换到指定分支,并更新工作区 47 | $ git checkout [branch-name] 48 | 49 | # 合并指定分支到当前分支 50 | $ git merge [branch] 51 | 52 | # 删除本地分支 53 | $ git branch -d [branch-name] 54 | 55 | 56 | 常用的修改 57 | ************************************ 58 | 59 | :: 60 | 61 | # 添加文件,将当前目录下所有文件添加到暂存区 62 | $ git add . 63 | 64 | # 添加指定文件,将指定文件添加到暂存区 65 | $ git add [filename] 66 | 67 | # 删除文件,并更新到暂存区 68 | $ git rm [filename] 69 | 70 | # 重命名文件,并更新到暂存区 71 | $ git mv [file] [file-renamed] 72 | 73 | # 显示被跟踪的文件状态 74 | $ git status 75 | 76 | 77 | 将修改提交到本地仓库 78 | ************************************ 79 | 80 | :: 81 | 82 | # 将暂存区的文件提交到本地仓库,并输入简单说明 83 | $ git commit -m [message] 84 | 85 | # 将工作区的文件提交到本地仓库 86 | $ git commit -a 87 | 88 | # 将所有修改直接提交到本地仓库 89 | $ git commit -am 'three seconds is better' 90 | 91 | 92 | 93 | 将分支推送回 GitHub,并合并分支 94 | ************************************ 95 | 96 | :: 97 | 98 | # 将本地指定分支推送回远程仓库 99 | $ git push [remote] [branch] 100 | 101 | # 将新分支推送回 GitHub 时,会询问帐号和密码 102 | $ git push origin slow-blink 103 | Username for 'https://github.com': tonychacon 104 | Password for 'https://tonychacon@github.com': 105 | Counting objects: 5, done. 106 | ... 107 | 108 | 109 | # 上传所有标签 110 | git push origin --tags 111 | 112 | 最后到 GitHub 网站上查看分支并创建合并请求。 113 | 114 | 115 | 标签 116 | ************************************ 117 | 118 | Git 使用两种主要类型的标签:轻量标签与附注标签。通常建议创建附注标签。 119 | 120 | 轻量标签很像一个不会改变的分支,它只是一个特定提交的引用。然而,附注标签是存储在 Git 数据库中的完整对象。它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间,还有标签信息。 121 | 122 | :: 123 | 124 | # 创建附注标签,并设定标签信息 125 | $ git tag -a v1.4 -m 'my version 1.4' 126 | 127 | # 查看标签信息 128 | $ git show v1.4 129 | 130 | # 列出所有tag 131 | $ git tag 132 | 133 | # 删除本地tag 134 | $ git tag -d [tag] 135 | 136 | # 删除远程tag 137 | $ git push origin :refs/tags/[tagName] 138 | 139 | 140 | 忽略文件 141 | ************************************ 142 | 143 | 通常软件都会自动生成一些文件,比如日志文件,或者编译过程中产生的临时文件等,这些文件无需纳入 Git 的管理。可以在项目的根目录下创建 ``.gitignore`` 文件使 Git 忽略指定的文件,格式规范如下: 144 | 145 | + 所有空行或者以 ``#`` 开头的行都会被 Git 忽略。 146 | 147 | + 可以使用标准的 glob 模式匹配。 148 | 149 | + 匹配模式可以以 ``/`` 开头防止递归。 150 | 151 | + 匹配模式可以以 ``/`` 结尾指定目录。 152 | 153 | + 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号 ``!`` 取反。 154 | 155 | :: 156 | 157 | $ cat .gitignore 158 | 159 | # 忽略所有以 .o 或 .a 结尾的文件 160 | *.[oa] 161 | 162 | # 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件都用这样的文件名保存副本。 163 | *~ 164 | 165 | # 跟踪 lib.a 文件, 即使已经忽略了所以的 .a 结尾的文件 166 | !lib.a 167 | 168 | # 只忽略当前目录下的 TODO 文件 169 | /TODO 170 | 171 | # 忽略 build 目录中的所有文件 172 | build/ 173 | 174 | # 忽略 doc 目录下的以 .txt 结尾的文件(不递归处理) 175 | doc/*.txt 176 | 177 | # 忽略 doc 目录下的所有以 .pdf 结尾的文件(递归处理) 178 | doc/**/*.pdf 179 | -------------------------------------------------------------------------------- /docs/Chapter04/56_gitftp.rst: -------------------------------------------------------------------------------- 1 | 通过 Git 方式管理 FTP 服务 2 | #################################### 3 | 4 | 现在有很多网站依然使用 FTP 上传文件到服务器,但传统的 FTP 客户端在使用过程中,都需要留意本地文件和远程文件之间的差异,很容易忘记更新部分文件或上传到错误的路径等。总之,需要人工干预上传过程,容易出错而且工作效率低。 5 | 6 | 所以就有了 `git-ftp `_ 工具(其实就是一个 shell 脚本)完美的解决这个问题。git-ftp 通过存储在服务器上的 ``.git-ftp.log`` 文件来跟踪每次传输文件之间的变化,用一条命令实现只上传修改的文件,省心省力。 7 | 8 | 9 | 快速开始 10 | ************************************ 11 | 12 | 安装 13 | ==================================== 14 | 15 | git-ftp 已经进入了大部分的软件仓库,可以直接通过系统的安装包工具安装。因为 git-ftp 的有些命令(git-ftp download 和 git-ftp pull)需要用到 lftp,所以建议一并安装 lftp。 16 | 17 | .. highlight:: none 18 | 19 | :: 20 | 21 | [Linux]# apt install git-ftp 22 | [Linux]# apt install lftp 23 | 24 | 25 | 配置 26 | ==================================== 27 | 28 | 在配置文件之前,需要新建一个空白的 Git 仓库。 29 | 30 | :: 31 | 32 | # 新建仓库 33 | [Linux]$ git init new 34 | [Linux]$ cd new 35 | 36 | # 添加配置 37 | [Linux]$ git config git-ftp.url ftp.example.net/new/ 38 | [Linux]$ git config git-ftp.user ftp-user 39 | [Linux]$ git config git-ftp.password secr3t 40 | 41 | [Linux]$ cat .git/config 42 | [core] 43 | bare = false 44 | repositoryformatversion = 0 45 | filemode = false 46 | symlinks = false 47 | ignorecase = true 48 | logallrefupdates = true 49 | [git-ftp] 50 | url = ftp.example.net/new/ 51 | user = ftp-user 52 | password = secr3t 53 | 54 | 55 | .. attention:: 56 | 57 | 因为服务器地址和密码都是以明文保存的,所以本地仓库不要发布到网上公开仓库。 58 | 59 | 60 | 基本命令 61 | ==================================== 62 | 63 | - **git-ftp init** 新建服务器仓库。用于 FTP 服务器没有文件,上传所有本地提交到服务器仓库,并创建 ``.git-ftp.log`` 文件。 64 | - **git-ftp catchup** 初始服务器仓库。用于 FTP 服务器有文件,只在服务器上创建 ``.git-ftp.log`` 文件。 65 | - **git-ftp download** 下载服务器仓库中的文件。在服务器上需要有 ``.git-ftp.log`` 文件,并且本地仓库为空。 66 | - **git-ftp pull** 拉取服务器仓库的提交。 67 | - **git-ftp push** 推送本地提交到服务器仓库。 68 | -------------------------------------------------------------------------------- /docs/Chapter04/57_git.server.rst: -------------------------------------------------------------------------------- 1 | git 服务器 2 | #################################### 3 | 4 | 需要在服务器中安装 git,不在需要其它工具。适合简单的单用户使用。 5 | 6 | - 搭建 Git 服务器非常简单,通常几分钟即可完成; 7 | - 要方便管理公钥,用 Gitosis; 8 | - 要变态地控制权限,用 Gitolite。 9 | 10 | 11 | 创建用户 12 | ************************************ 13 | 14 | 创建 git 用户组和用户,用户名随便定义。 15 | 16 | :: 17 | 18 | # 创建 git 用户组 19 | [Linux]# groupadd git 20 | 21 | # 创建 git 用户,并在 /home 目录下创建用户主目录、添加到 git 组 22 | [Linux]# useradd -m git -g git 23 | 24 | # 修改用户登录密码,上传仓库时会用到 25 | [Linux]# passwd git 26 | 27 | 28 | 初始化仓库 29 | ************************************ 30 | 31 | 用户家目录作为 Git 仓库,输入命令: 32 | 33 | :: 34 | 35 | [Linux]$ cd /home/git 36 | [Linux]$ git init --bare gitrepo.git 37 | 38 | # 修改仓库的用户和用户组(可选,根据实际情况使用) 39 | [Linux]$ chown git:git gitrepo/ 40 | 41 | 42 | 克隆和推送 43 | ************************************ 44 | 45 | 克隆仓库时,需要用户名(@ 前的字符)和路径(: 后边的字符)与服务器相符。 46 | 47 | :: 48 | 49 | [Linux]$ git clone git@192.168.1.2:/home/git/gitrepo.git 50 | 51 | 推送本地修改到服务器时,需要输入 git 用户的密码。 52 | 53 | :: 54 | 55 | [Linux]$ git push 56 | 57 | 58 | 禁止 git 登录 59 | ************************************ 60 | 61 | 出于安全考虑,要禁用 git 用户登录 shell。编辑 ``/etc/passwd`` 文件,找到类似下面的一行: 62 | 63 | :: 64 | 65 | git:x:1001:1001:,,,:/home/git:/bin/bash 66 | 67 | # 将最后的 bash 更改为: 68 | git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell 69 | 70 | 这样,git 用户可以正常通过 ssh 使用 git,但无法登录shell。 71 | 72 | 73 | 创建证书登录 74 | ************************************ 75 | 76 | 将本地用户的公钥(id_rsa.pub)导入到服务器的 /home/git/.ssh/authorized_keys 文件中,一行一个。 77 | 78 | 如果没有该文件创建它: 79 | 80 | :: 81 | 82 | [Linux]$ cd /home/git/ 83 | [Linux]$ mkdir .ssh 84 | [Linux]$ chmod 755 .ssh 85 | [Linux]$ touch .ssh/authorized_keys 86 | [Linux]$ chmod 644 .ssh/authorized_keys 87 | -------------------------------------------------------------------------------- /docs/Chapter04/60_i3wm.rst: -------------------------------------------------------------------------------- 1 | i3 平铺式窗口管理器 2 | ################################ 3 | 4 | i3是平铺式的窗口管理器,完全从头开始编写。目标平台是GNU / Linux和BSD操作系统,i3的代码是是自由的,并且是在BSD许可证下的开源软件(FOSS)。 i3的主要目标是针对高级用户和开发人员。 5 | 6 | 安装 i3 窗口管理器: 7 | 8 | .. highlight:: none 9 | 10 | :: 11 | 12 | apt install i3 13 | 14 | i3 的快捷键 15 | ******************************* 16 | 17 | - <$mod+D> 启动 dmenu 18 | - <$mod+Enter> 启动虚拟终端 19 | - <$mod+1/2/3> 切换桌面 20 | - <$mod+S> 堆叠布局 21 | - <$mod+E> 默认布局 22 | - <$mod+H> 水平分割窗口 23 | - <$mod+V> 垂直分割窗口 24 | - <$mod+W> 标签布局 25 | - <$mod+Shift+Q> 强制关闭当前的窗口 26 | - <$mod+Shift+1/2/3> 将程序移动到桌面 27 | - <$mod+Shift+C> 重新加载配置文件 28 | - <$mod+Shift+R> 重启(并重新加载配置文件) 29 | - <$mod+Shift+E> 退出 i3 30 | -------------------------------------------------------------------------------- /docs/Chapter04/66_code.font.rst: -------------------------------------------------------------------------------- 1 | 适合程序员的开源字体 2 | ################################ 3 | 4 | 在编写代码时,通常来说对字体的要求更具功能性。这也是为什么大多数程序员更偏爱使用固定宽度的等宽字体。每个字符享有相等的空间非常实用,可以随意扫过一段代码来“估测”代码长度;能够轻松地对齐字符和标点,使得高亮显示在视觉上更加明显;等宽字体更容易通过 OCR 识别。 5 | 6 | 选择一款带有容易分辨数字和标点的字体在美学上是令人愉悦的,但它是否拥有满足你需求的版权许可也是非常重要的。 7 | 8 | 大招还是先放吧,好东西实在是留不到最后了: `在线预览编程字体 `_ 9 | 10 | * 左侧选字体,调整字体大小、行距 11 | * 右侧实时预览,并且可敲代码测试 12 | 13 | 网站的字体都是免费的,但不一定开源。字体可以直接从 `GitHub 主页 `_ 下载,每个文件夹下都会有字体的版权许可说明。 14 | 15 | 16 | Firacode 字体 17 | ******************************* 18 | 19 | .. image:: ../Images/fontStyle.01.png 20 | 21 | 推荐的首款字体是 FiraCode,一款真正符合甚至超越了其职责的编程字体。FiraCode 是 Fira 的扩展,而后者是由 Mozilla 委托设计的开源字体族。使得 FiraCode 与众不同的原因是它修改了在代码中常使用的一些符号的组合或连字,使得它看上去更具可读性。 22 | 23 | .. image:: ../Images/fontStyle.02.png 24 | 25 | 这款字体有几种不同的风格,特别是还包含 Retina (视网膜)选项。你可以查看 `Firacode GitHub`_ 下载字体或了解更多信息。 26 | 27 | .. _`Firacode GitHub`: https://github.com/tonsky/FiraCode 28 | 29 | 30 | Inconsolata 字体 31 | ******************************* 32 | 33 | .. image:: ../Images/fontStyle.03.png 34 | 35 | Inconsolata 是最为漂亮的等宽字体之一。从 2006 年开始它便一直是一款开源和可免费获取的字体。它的创造者 Raph Levien 在设计时秉承的一个基本原则是:等宽字体并不应该那么糟糕。使得 Inconsolata 如此优秀的两个原因是: ``0`` 和 ``o`` 这两个字符非常容易识别,不会被混淆;另外它还特别地设计了标点符号。 36 | 37 | 了解更多请查看:https://www.levien.com/type/myfonts/inconsolata.html 38 | 39 | 40 | DejaVu Sans Mono 字体 41 | ******************************* 42 | 43 | .. image:: ../Images/fontStyle.04.png 44 | 45 | 受在 GNOME 中使用的带有版权和闭源的 Vera 字体的启发,DejaVu Sans Mono 是一个非常受欢迎的编程字体,几乎在每个 Linux 发行版中都带有它。在 Book Variant 风格下 DejaVu 拥有惊人的 3310 个字形,相比于一般的字体,它们含有 100 个左右的字形。在工作中你将不会出现缺少某些字符的情况,它覆盖了 Unicode 的绝大部分,并且一直在活跃地增长着。 46 | 47 | 了解更多请查看:https://dejavu-fonts.github.io/ 48 | 49 | 50 | Source Code Pro 字体 51 | ******************************* 52 | 53 | .. image:: ../Images/fontStyle.05.png 54 | 55 | 由 Paul Hunt 和 Teo Tuominen 设计,Source Code Pro 是由 Adobe 创造的,并且成为了它的首款开源字体。Source Code Pro 具有极高的可读性,并且在可能令人困惑的字符和标点符号之间具有出色的区别。Source Code Pro 也是一个字体族,有 7 中不同的风格:Extralight、Light、Regular、Medium、Semibold、Bold 和 Black,每种风格都还有斜体变体。 56 | 57 | 了解更多请查看:https://github.com/adobe-fonts/source-code-pro 58 | 59 | 60 | Noto Mono 字体 61 | ******************************* 62 | 63 | .. image:: ../Images/fontStyle.06.png 64 | 65 | Noto Mono 是 Google 打造的庞大 Note 字体族中的等宽版本。尽管它并不是专为编程所设计,但它在 209 种语言(包括 emoji 颜文字)中都可以使用,并且一直在维护和更新。该项目非常庞大,是 Google 宣称 “组织全世界信息” 的使命的延续。 66 | 67 | 官网链接天朝访问不了,就不放了 ^_^!。 68 | 69 | 70 | CamingoCode 字体 71 | ******************************* 72 | 73 | .. image:: ../Images/fontStyle.07.png 74 | 75 | CamingoCode 是为源代码编辑器设计的免费字体。它基于 CamingoMono,但是有几个特别绘制的符号在小尺寸下工作得很好,包括 Q、l、&、*、~ 和 #。笔画权重相对较轻,这使得 CamingoCode 既适合明亮的视觉主题,也适合黑暗的视觉主题。该系列由四种样式链接字体( Regular、Italic、Bold Italic、Bold )组成。 76 | 77 | 了解更多请查看:https://www.janfromm.de/typefaces/camingomono/camingocode/ 78 | 79 | 80 | 选择合适的字体 81 | ******************************* 82 | 83 | 无论你选择那个字体,你都有可能在每天中花费数小时面对它,所以请确保它在审美和哲学层面上与你产生共鸣。选择正确的开源字体是确保你拥有最佳生产环境的一个重要部分。 84 | -------------------------------------------------------------------------------- /docs/Chapter04/70_firefox.size.rst: -------------------------------------------------------------------------------- 1 | 修改 firefox 的缩放比 2 | #################################### 3 | 4 | 现在笔记本的分辨率都很高,在 Gnome 桌面环境中,Firefox 浏览器查看网页时字体显得太小,每个网页单独放大效率非常的低。 5 | 6 | .. hint:: 浏览器设置选项 7 | 8 | 最近使用 Firefox-78.13 版本,在设置 > 常规页面下有一个全局缩放选项,而且可以选择之缩放文本。这样设置后上边的选项卡大小不会改变,下边的设置方法可以将选项卡也等比缩放。 9 | 10 | 修改浏览器的配置文件,设置浏览器的默认缩小放大比例。 11 | 12 | 首先,打开 Firefox 浏览器,在网址栏中输入: 13 | 14 | .. highlight:: none 15 | 16 | :: 17 | 18 | about:config 19 | 20 | 然后点击接受风险 [I accept the risk!] ,进入设置页面。在设置页面搜索: 21 | 22 | :: 23 | 24 | layout.css.devPixelsPerPx 25 | 26 | 默认为负值,修改该选项的数值,1.5 为 150%,1.2 为 120%,以此类推。 27 | -------------------------------------------------------------------------------- /docs/Chapter04/70_gnome.solarized.rst: -------------------------------------------------------------------------------- 1 | GNOME 终端使用 solarized 配色 2 | #################################### 3 | 4 | 首先,下载配色文件,配色文件分为两种一个亮色主题一个暗色主题,选择喜欢的安装。也可以使用 ``./set_light.sh`` 进行预览。 5 | 6 | .. highlight:: none 7 | 8 | :: 9 | 10 | [Linux]$ git clone git://github.com/sigurdga/gnome-terminal-colors-solarized.git 11 | [Linux]$ cd gnome-terminal-colors-solarized 12 | [Linux]$ ls -l 13 | total 36 14 | drwxr-xr-x 5 glenn glenn 4096 Aug 28 10:31 colors 15 | -rwxr-xr-x 1 glenn glenn 5285 Aug 28 10:31 install.sh 16 | -rw-r--r-- 1 glenn glenn 1077 Aug 28 10:31 LICENSE.mkd 17 | -rw-r--r-- 1 glenn glenn 4376 Aug 28 10:31 README.mkd 18 | -rwxr-xr-x 1 glenn glenn 93 Aug 28 10:31 set_dark.sh 19 | -rwxr-xr-x 1 glenn glenn 94 Aug 28 10:31 set_light.sh 20 | drwxr-xr-x 2 glenn glenn 4096 Aug 28 10:31 src 21 | [Linux]$ ./install.sh 22 | 23 | 安装成功后进入终端设置主题颜色。 24 | 25 | .. hint:: 26 | 27 | 主题在使用 ls 命令时,权限为 777 的文件夹会看不清楚。可以在 ``~/.bashrc`` 文件中加入以下配置禁用文件夹背景色。 28 | 29 | :: 30 | 31 | LS_COLORS='ex=0;35:ow=1;32' 32 | -------------------------------------------------------------------------------- /docs/Chapter04/70_ventoy.rst: -------------------------------------------------------------------------------- 1 | 在 U 盘上引导多个操作系统 2 | ################################ 3 | 4 | 在一个 U 盘上放入喜欢的所有 Linux 发行版,想试哪个就试哪个,是不是很爽! 5 | 6 | `Ventoy `_ 是一个制作多合一启动 U 盘的开源工具(支持 Linux 和 Windowns 平台),无需反复地格式化 U 盘,只需要把 ISO 文件拷贝到 U 盘里面就可以启动,简单快捷。当有多个不同类型的 ISO 文件时,在启动 Ventoy 时会显示一个菜单来选择需要引导的系统。无差异支持 Legacy BIOS 和 UEFI 模式。 7 | 8 | 因为 Ventoy 是国内程序员开发的,所以不管是文档和 `下载安装 `_ 都十分的友善。 9 | 10 | .. image:: ../Images/ventoy.01.png 11 | 12 | .. hint:: 13 | 14 | 在安装 Ventoy 时会格式化 U 盘,所以在安装前请先备份 U 盘上的数据! 15 | 16 | 安装完成之后,会把 U 盘格式化两个分区,将喜欢的 ISO 系统文件拷贝到 ``Ventoy`` 镜像分区, ``VTOYEFI`` 为启动分区。 17 | 18 | 重启电脑,开机启动出现品牌 Logo 时按 键选择 U 盘启动。大功告成! 19 | -------------------------------------------------------------------------------- /docs/Chapter04/99_raspberryPi.rst: -------------------------------------------------------------------------------- 1 | 树莓派 ZERO W 配置 2 | #################################### 3 | 4 | 树莓派 Zero W 是树莓派基金会 17 年 2 月底为庆祝其第五个生日发布的特别版,本质上是树莓派 Zero 加无线和蓝牙。完整配置如下: 5 | 6 | - 1GHz 单核 CPU 7 | - 512MB 内存 8 | - 802.11n WiFi 9 | - 蓝牙 4.1(BLE) 10 | - mini-HDMI 接口 11 | - Micro-USB OTG 端口 12 | - Micro-USB 电源接口 13 | - 40 针 GPIO 扩展口 14 | 15 | 16 | 安装系统镜像 17 | ************************************ 18 | 19 | 软件准备:Raspbrain 系统镜像文件,SDFormatter,Win32diskim,PuTTY。 20 | 21 | 1. 下载 `Raspbrain 系统 `_ ,建议下载 ``Raspberry Pi OS Lite`` 不带图形界面的版本。 22 | 23 | 2. 下载 `Pi Imager `_ SD 卡烧录工具,并安装到电脑。 24 | 25 | 3. 将 SD 卡插入读卡器然后接入电脑,用 Pi Imager 烧录系统: 26 | 27 | - 点击 ``CHOOSE OS`` 选择 ``Use custom`` 然后选择下载到本地的系统 28 | - 点击 ``CHOOSE SD CARD`` 选择 SD 卡的路径 29 | - 点击 ``WRITE`` 写入系统。 30 | - 最后点击 ``CONTINUE`` 完成系统写入。 31 | 32 | .. hint:: 33 | 34 | 系统写入会提示格式化 SD 卡的选项,确认就可以。 35 | 36 | 系统写入完成之后,SD 卡会被分成两个分区,一个是 ``/boot`` 分区,一个是 ``/`` 分区。在 Windows 系统中是不会识别根分区的,会提示需要格式化分区,千万不要点击格式化,忽略即可。 37 | 38 | 39 | 无线连接 40 | ==================================== 41 | 42 | 在 SD 卡的 ``/boot`` 分区中新建 ``wpa_supplicant.conf`` 文件,输入如下内容并保存。 43 | 44 | .. highlight:: none 45 | 46 | :: 47 | 48 | # This is /boot/wpa_supplicant.conf 49 | ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev 50 | update_config=1 51 | country=CN 52 | network={ 53 | ssid="WiFi名称" 54 | psk="WiFi密码" 55 | priority=5 56 | } 57 | network={ 58 | ssid="WiFi" 59 | psk="WiFi" 60 | priority=1 61 | } 62 | 63 | 64 | 可以配置多个无线网络连接,各部分含义如下: 65 | 66 | - ssid:WIFI名称 67 | - psk:WIFI密码 68 | - priority:连接优先级,数字越大优先级越高 69 | - scan_ssid:连接隐藏 WiFi 时需要指定该值为 1 70 | 71 | 72 | 当系统开机后, ``/boot`` 分区中的配置文件会消失,再次配置请参阅 :doc:`wpa_supplicant 连接 wifi <../Chapter02/32_wpa.supplicant>` 73 | 74 | 75 | 开启 SSH 远程连接 76 | ==================================== 77 | 78 | 在 SD 卡的 ``/boot`` 分区中新建命名为 ``ssh`` 的文件,内容为空。 79 | 80 | 81 | 上电开机 82 | ==================================== 83 | 84 | 将 SD 卡插入树莓派的 SD 卡槽,连接电源线自动开机。 85 | 86 | 使用 SSH 登陆,默认用户名 ``pi`` ,默认密码 ``raspberry`` 。 87 | 88 | 89 | 配置系统 90 | ************************************ 91 | 92 | 修改默认密码 93 | ==================================== 94 | 95 | 使用 ``passwd`` 命令修改密码。 96 | 97 | :: 98 | 99 | # 修改 pi 密码 100 | [Linux]$ sudo passwd pi 101 | 重复输入两次密码 102 | 103 | # 修改 root 密码,开启 root 账号 104 | [Linux]$ sudo passwd root 105 | 106 | 107 | 修改清华大学软件源 108 | ==================================== 109 | 110 | 在配置文件 ``/etc/apt/sources.list`` 中注释其他行,加入以下软件源: 111 | 112 | :: 113 | 114 | deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi 115 | deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi 116 | 117 | 118 | 在配置文件 ``/etc/apt/sources.list.d/raspi.list`` 中注释其他行,加入以下软件源: 119 | 120 | :: 121 | 122 | deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui 123 | 124 | 125 | 网址末尾的 raspbian 重复两次是必须的。因为 Raspbian 的仓库中除了 APT 软件源还包含其他代码。APT 软件源不在仓库的根目录,而在 ``raspbian/`` 子目录下。 126 | 127 | 编辑镜像站后,请使用 ``sudo apt-get update`` 命令,更新软件源列表,同时检查您的编辑是否正确。 128 | 129 | 130 | 其它源 131 | -------------------------------- 132 | 133 | 注意以下列出的都是 ``buster`` 版本,粘贴时注意区分版本。 134 | 135 | :: 136 | 137 | # 中国科学技术大学 138 | # `/etc/apt/sources.list` 文件 139 | deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi 140 | deb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/ buster main contribnon-free rpi 141 | # `/etc/apt/sources.list.d/raspi.list` 文件 142 | deb http://mirrors.ustc.edu.cn/archive.raspberrypi.org/debian/ buster main ui 143 | 144 | # 阿里云 145 | # `/etc/apt/sources.list` 文件 146 | deb http://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi 147 | deb-src http://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi 148 | # `/etc/apt/sources.list.d/raspi.list` 文件 149 | deb http://mirrors.aliyun.com/archive.raspberrypi.org/debian/ buster main ui 150 | 151 | # 华中科技大学 152 | # `/etc/apt/sources.list` 文件 153 | deb http://mirrors.hustunique.com/raspbian/raspbian/ buster main contrib non-free rpi 154 | deb-src http://mirrors.hustunique.com/raspbian/raspbian/ buster main contrib non-free rpi 155 | # `/etc/apt/sources.list.d/raspi.list` 文件 156 | deb http://mirrors.hustunique.com/archive.raspberrypi.org/debian/ buster main ui 157 | 158 | 159 | 禁用自动休眠 160 | ==================================== 161 | 162 | 树莓派默认开启了自动休眠,可以使用 systemctl 命令来禁用自动休眠。 163 | 164 | :: 165 | 166 | [Linux]$ sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 167 | Created symlink /etc/systemd/system/sleep.target → /dev/null. 168 | Created symlink /etc/systemd/system/suspend.target → /dev/null. 169 | Created symlink /etc/systemd/system/hibernate.target → /dev/null. 170 | Created symlink /etc/systemd/system/hybrid-sleep.target → /dev/null. 171 | 172 | 173 | 修改时区 174 | ==================================== 175 | 176 | 通过修改时区的链接文件来修改时区,修改为上海时间。 177 | 178 | :: 179 | 180 | [Linux]$ sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 181 | 182 | 183 | 修改系统语言 184 | ==================================== 185 | 186 | 以 root 身份运行: 187 | 188 | :: 189 | 190 | [Linux]# dpkg-reconfigure locales 191 | -------------------------------------------------------------------------------- /docs/Chapter04/99_transmission-daemon.rst: -------------------------------------------------------------------------------- 1 | BT 下载工具 2 | #################################### 3 | 4 | `Transmission `_ 是一个强大的 BitTorrent 开源客户端,实现了 BT 协议中描述的大多数功能。在官网上提供了多个版本下载,包括:Mac、GTK+、QT 版本,还有 Daemon(守护进程)版本。 5 | 6 | Transmission 支持 DHT、Magnet Link、uTP 以及 PEX 等,最重要的是支持 Magnet Link 磁力链接下载。 7 | 8 | Transmission 软件包含多个套件,分别是: 9 | 10 | - transmission-gtk:GTK+ 界面的客户端 11 | - transmission-qt:QT 界面的客户端 12 | - transmission-cli:命令行界面的客户端,一个完整的 BT 客户端 13 | - transmission-daemon:一个后台守护程序,本身不具备操作性,只能通过 Web 或客户端来进行控制。 14 | - transmission-remote-cli:用来控制守护程序的客户端,只能配合 transmission-daemon 使用。 15 | 16 | 17 | 安装 18 | ************************************ 19 | 20 | 安装 transmission-daemon 后台守护进程版本,此版本特别适合安装在服务器上或者嵌入式系统中,以及一些没有显示器的设备上。 21 | 22 | .. highlight:: none 23 | 24 | :: 25 | 26 | [Linux]# apt install transmission-daemon 27 | 28 | 安装过程中会安装多个命令行工具: 29 | 30 | - transmission-cli:独立的命令行客户端 31 | - transmission-create:建立 ``.torrent`` 种子文件的命令行工具 32 | - transmission-daemon:后台守护程序 33 | - transmission-edit:修改 ``.torrent`` 种子文件的 announce URL 34 | - transmission-remote:控制 daemon 的程序 35 | - transmission-show:查看 ``.torrent`` 文件的信息 36 | 37 | 38 | 修改默认配置 39 | ************************************ 40 | 41 | 默认配置文件路径: 42 | 43 | ============ ============ 44 | 说明 默认文件路径 45 | ============ ============ 46 | 启动脚本 ``/etc/init.d/transmission-daemon`` 47 | 配置文件 ``/etc/default/transmission-daemon`` 48 | 主配置目录 ``/var/lib/transmsision-daemon/info`` 49 | ============ ============ 50 | 51 | 在主配置目录中包含如下文件: 52 | 53 | - settings.json:主要的配置文件,设置 daemon 的各项参数。它是一个符号链接指向 ``/etc/transmission-daemon/settings.json`` 。 `官方说明 `_ 54 | - torrents/:存放种子文件的目录,添加到下载任务中的种子都存放在这里。命名包含种子文件本身的名字和种子的 SHA1 HASH 值。 55 | - resume/:存放下载信息的文件,后缀名为 ``.resume`` 。文件包含了文件中哪些部分被下载,下载的数据存储的位置等等。 56 | - blocklists/:存储被屏蔽的 peer 地址。 57 | - dht.dat:存储 DHT 节点信息。 58 | 59 | :: 60 | 61 | # 主配置文件各项说明 62 | [Linux]# vim /etc/transmission-daemon/settings.json 63 | 64 | { 65 | //下载目录 66 | "download-dir": "/var/lib/transmission-daemon/downloads", 67 | //下载队列开关 68 | "download-queue-enabled": true, 69 | //下载队列数量 70 | "download-queue-size": 5, 71 | //未完成目录 72 | "incomplete-dir": "/var/lib/transmission-daemon/Downloads", 73 | //未完成目录启用开关 74 | "incomplete-dir-enabled": false, 75 | //是否需要rpc鉴权 RPC(Remote Procedure Call)—远程过程调用 76 | "rpc-authentication-required": true, 77 | //rpc绑定地址 78 | "rpc-bind-address": "0.0.0.0", 79 | //rpc是否启用 80 | "rpc-enabled": true, 81 | //rpc主机白名单 82 | "rpc-host-whitelist": "", 83 | //rpc是否开启主机白名单 84 | "rpc-host-whitelist-enabled": true, 85 | //rpc密码 86 | "rpc-password": "{ffe0479ff38ffb6bbe6de697313a63a5847e41eaFgNw3iaZ", 87 | //rpc端口 88 | "rpc-port": 9091, 89 | //rpc访问地址 90 | "rpc-url": "/transmission/", 91 | //rpc用户名 92 | "rpc-username": "transmission", 93 | //rpc IP白名单 94 | "rpc-whitelist": "127.0.0.1", 95 | //rpc 是否开启IP白名单 96 | "rpc-whitelist-enabled": true, 97 | //速度下限(KB/s) 98 | "speed-limit-down": 100, 99 | //是否启用速度下限 100 | "speed-limit-down-enabled": false, 101 | //速度上限(KB/s) 102 | "speed-limit-up": 100, 103 | //是否启用速度上限 104 | "speed-limit-up-enabled": false, 105 | //上传数量 106 | "upload-slots-per-torrent": 14, 107 | //是否启用TP协议 108 | "utp-enabled": true 109 | } 110 | 111 | 112 | .. hint:: 113 | 114 | 在修改配置文件之前需要停止守护进程,否则编辑的参数将无法正确保存。 115 | 116 | :: 117 | 118 | [Linux]# systemctl stop transmission-daemon.service 119 | 120 | 121 | 最小修改项: 122 | 123 | - ``rpc-username`` 设置用户名 124 | - ``rpc-password`` 设置密码 125 | - ``rpc-whitelist`` 设置访问 IP 白名单 126 | 127 | .. attention:: Web 访问时服务器提示 403 错误 128 | 129 | 403: Forbidden 130 | Unauthorized IP Address. 131 | Either disable the IP address whitelist or add your address to it. 132 | If you're editing settings.json, see the 'rpc-whitelist' and 'rpc-whitelist-enabled' entries. 133 | If you're still using ACLs, use a whitelist instead. See the transmission-daemon manpage for details. 134 | 135 | 根据官方文档的说明,需要将访问者 ip 加入白名单,ip 支持通配符 ``*`` 136 | 如:"rpc-whitelist": "127.0.0.1, 192.168.0.*" 137 | 138 | 139 | 通过 web 访问服务 140 | ************************************ 141 | 142 | 配置完成后,可以使用浏览器来访问 Transmission 服务,格式为:主机 ip(或域名)+ 端口(默认 9091),例如: ``http://192.168.0.100:9091/`` 。 143 | 144 | 145 | 客户端 146 | ************************************ 147 | 148 | 嫌弃网页控制功能太少,可以使用第三方客户端进行链接。 149 | 150 | - windows 系统推荐使用 `Transmission Remote GUI`_ 151 | - android 系统推荐使用 `Transdroid`_ 152 | 153 | .. _`Transmission Remote GUI`: https://sourceforge.net/projects/transgui/ 154 | .. _`Transdroid`: http://www.transdroid.org/ 155 | -------------------------------------------------------------------------------- /docs/Chapter05/00_shortcuts.rst: -------------------------------------------------------------------------------- 1 | Shell 快捷键 2 | #################################### 3 | 4 | 命令行用户在使用命令行时并不喜欢敲入太多文本,所以命令中才会有 cp、ls、mv 和 rm 那么多缩写的命令名。命令行最大的目标之一就是减少操作(省事),用最少的击键次数执行最多的任务。为了提高命令行下的工作效率,使用一些快捷键是提高效率的最简单也是最直接方式。 5 | 6 | Bash 使用了一个名为 Readline 的库(供不同的应用程序共享使用的线程集合),来实现命令行编辑。例如:用箭头键来移动光标,此外还有许多特性。 7 | 8 | .. highlight:: none 9 | 10 | .. attention:: 11 | 12 | Shell 中有两种命令行编辑的模式,即 vi 模式和 Emacs 模式(Bash 默认使用的是 Emacs 模式)。在两种模式中使用不同的快捷键操纵在命令行中键入的内容,包括使用历史列表和自动补全的功能。 13 | 14 | 如果快捷键不能使用,可以将命令行编辑模式设置为 Emacs 默认值。 15 | 16 | :: 17 | 18 | [Linux]$ set -o emacs 19 | 20 | 21 | 控制 Shell 进程 22 | ************************************ 23 | 24 | ========== ========== 25 | 按键 作用 26 | ========== ========== 27 | 挂起终端(有点像卡住了,但输入的命令还会执行) 28 | 恢复挂起的终端(恢复输入状态,并输出挂起时执行的命令) 29 | 终止前台命令的执行 30 | 发送表示标准输入结束的 EOF 信号。经常用于退出程序或 Shell。 31 | 暂停前台命令的执行,并放入后台保存 32 | ========== ========== 33 | 34 | 35 | 移动光标 36 | ************************************ 37 | 38 | ========== ========== 39 | 按键 作用 40 | ========== ========== 41 | 上一条命令(相当于 ) 42 | 下一条命令(相当于 ) 43 | 光标左移一个字符(相当于 ) 44 | 光标右移一个字符(相当于 ) 45 | 移动光标到行首 46 | 移动光标到行尾 47 | ========== ========== 48 | 49 | 50 | 剪切和粘贴 51 | ************************************ 52 | 53 | Readline 的文档使用术语 killing 和 yanking 来指代我们平常所说的剪切和粘贴。剪切的本文存储在一个叫做剪切环(kill-ring)的缓冲区中。 54 | 55 | ========== ========== 56 | 按键 作用 57 | ========== ========== 58 | 删除一个字符(相当于 ) 59 | 剪切从光标处到行首的字符 60 | 剪切从光标处到行尾的字符 61 | 剪切从光标处到词尾的字符 62 | 粘贴文本到光标处 63 | 清空行(如果命令是从历史列表中复制的,则会恢复到原始命令) 64 | ========== ========== 65 | 66 | 67 | 其它常用功能 68 | ************************************ 69 | 70 | ========== ========== 71 | 按键 作用 72 | ========== ========== 73 | 清空屏幕(相当于 ``clear`` 命令) 74 | 反向递增搜索历史列表中的命令 75 | 换行符(相当于 ) 76 | 返回符(相当于 ) 77 | 插入控制字符 78 | 互换光标处和光标前面的字符位置 79 | ========== ========== 80 | 81 | 82 | .. hint :: 83 | 84 | 在开发 Unix 时因为成本的原因,使用了电传打字机作为终端。在电传打字机上执行回车时,包含两种操作,首先将托盘返回到最左边的位置上(即 CR 码返回信号),然后将打印纸向上移动一行(即 LF 码换行信号)。 85 | 86 | 在终端快捷键中, 发送返回信号, 发送换行信号。在终端执行命令时,软件会把 CR 和 LF 信号转换为 CR+LF 回车信号。 87 | 88 | 89 | 自定义快捷键 90 | ************************************ 91 | 92 | 使用 ``bind`` 命令可以自定义快捷键,Bash 中的快捷键其实是 Readline 来提供的,因此,这里快捷键的设置其实就是配置 Readline,Readline 中分两种快捷键,一种是 Readline 内部的函数快捷键,另外一种是执行 Shell 命令,设置的时候稍有不同: 93 | 94 | :: 95 | 96 | # 查看 Readline 中可以使用的函数名称 97 | bind -l 98 | 99 | # 已经绑定的快捷键 100 | bind -p 101 | 102 | # 自定义快捷键 103 | # 绑定后,按[C-x,C-L]就能执行ls -al 104 | bind -x '"/C-x/C-l":ls -al' 105 | 106 | 107 | 这种设置只针对当前的会话有效,一旦会话丢失,设置的快捷键就会丢失。为了让设置的快捷键永久有效,需要编辑配置文件,在 Linux 系统中,有两个配置文件(全局的和用户的),全局的配置文件是 ``/etc/inputrc`` ,而用户的配置文件在家目录下 ``~/.inputrc`` 。inputrc 文件的大概样子像下面这样: 108 | 109 | :: 110 | 111 | # 本例来自 CentOS6.4 112 | $if mode=emacs 113 | 114 | # for linux console and RH/Debian xterm 115 | "/e[1~": beginning-of-line 116 | "/e[4~": end-of-line 117 | # commented out keymappings for pgup/pgdown to reach begin/end of history 118 | #"/e[5~": beginning-of-history 119 | #"/e[6~": end-of-history 120 | "/e[5~": history-search-backward 121 | "/e[6~": history-search-forward 122 | "/e[3~": delete-char 123 | "/e[2~": quoted-insert 124 | "/e[5C": forward-word 125 | "/e[5D": backward-word 126 | "/e[1;5C": forward-word 127 | "/e[1;5D": backward-word 128 | 129 | # for rxvt 130 | "/e[8~": end-of-line 131 | "/eOc": forward-word 132 | "/eOd": backward-word 133 | 134 | # for non RH/Debian xterm, can't hurt for RH/DEbian xterm 135 | "/eOH": beginning-of-line 136 | "/eOF": end-of-line 137 | 138 | # for freebsd console 139 | "/e[H": beginning-of-line 140 | "/e[F": end-of-line 141 | $endif 142 | 143 | 144 | 在配置文件中,``/C`` 代表 键,``/M`` 代表 键,``/e`` 代表 键,``//`` 代表反斜杠,``/'`` 代表单引号,``/"`` 代表双引号; 145 | 146 | 可以通过 来查看某一个功能键的字符序列,或者输入 cat 后回车,进入编辑中,直接按快捷键。配置文件中可能会使用八进制或者十六进制来表示字符。 147 | 148 | -------------------------------------------------------------------------------- /docs/Chapter05/09_init.rst: -------------------------------------------------------------------------------- 1 | Shell 脚本之始 2 | ############################ 3 | 4 | Shell 脚本是一种以 Shell 程序为解释器的脚本程序。由于习惯的原因,业界所说的“Shell 编程”都是指编写 Shell 脚本,不是指 Shell 程序扩展开发。 5 | 6 | Linux 操作系统本身就像是一个 API,所以 Shell 编程跟常见的解释型语言(Python、PHP、Ruby)一样,只要有一个文本编辑器和一个脚本解释器就可以了。 7 | 8 | 9 | Hello world 10 | *************************** 11 | 12 | 在终端窗口新建一个 ``hello.sh`` 脚本文件(扩展名并不影响脚本执行)。输入以下内容: 13 | 14 | :: 15 | 16 | [Linux]$ echo "#!/bin/bash" > hello.sh 17 | [Linux]$ echo "echo 'hello world' " >> hello.sh 18 | 19 | 20 | 运行脚本: 21 | 22 | :: 23 | 24 | [Linux]$ chmod +x hello.sh 25 | [Linux]$ ./hello.sh 26 | hello world 27 | 28 | 29 | 不要惊讶,这就是一个 shell 脚本了。 30 | 31 | .. attention:: 32 | 33 | 在执行脚本时一定要写成 ``./hello.sh`` ,直接写 ``hello.sh`` ,Linux 系统会去系统变量 PATH 里寻找有没有 test.sh 的命令,要用 ``./test.sh`` 告诉系统,就在当前目录找。 34 | -------------------------------------------------------------------------------- /docs/Chapter06/00_debian.firmware.rst: -------------------------------------------------------------------------------- 1 | 安装 Debian 时缺少无线网卡固件 2 | ############################################# 3 | 4 | 笔记本电脑安装 Debian 10,检测网卡时出现以下错误提示: 5 | 6 | .. highlight:: none 7 | 8 | :: 9 | 10 | Some of your hardware needs non-free firmware files to operate. 11 | The firmware can be loaded from removable media, such as a USB stick or floopy. 12 | 13 | The missing firmware files are: iwlwifi-5000-5.ucode iwlwifi-5000-4.ucode 14 | iwlwifi-5000-3.ucode iwlwifi-5000-2.ucode iwlwifi-5000-1.ucode 15 | 16 | If you have such media available now, insert it, and continue. 17 | 18 | Load missing firmware from removable media? 19 | 20 | 21 | 22 | **简单翻译一下:** 23 | 24 | 您的一些硬件需要非自由固件文件才能运转。固件可以从可移动介质加载,比如 U 盘或者软盘。 25 | 26 | 缺失的固件文件是:iwlwifi-5000-5.ucode iwlwifi-5000-4.ucode iwlwifi-5000-3.ucode iwlwifi-5000-2.ucode iwlwifi-5000-1.ucode 27 | 28 | 如果现在您有可用的介质,请将其插入,然后继续。 29 | 30 | 从可移动介质加载缺失的固件吗? 31 | 32 | <是> <否> 33 | 34 | 35 | 什么是固件? 36 | ************************* 37 | 38 | 有些硬件除了需要设备驱动程序之外,还要在使用之前加载固件(firmware)或微码(microcode)。这对于网卡(特别是无线网卡)来说很常见,但有些 USB 设备甚至是硬盘控制器也需要加载固件。对于许多显卡,可以在毋须固件的情况下使用基本的功能,但使用高级功能就需要先安装合适的固件到系统中。 39 | 40 | 有些老的设备需要固件才能工作,这些固件被厂商永久性地置于设备的 EEPROM/Flash 芯片中。现今新设备不再采用这种方式嵌入固件,因此固件必须在系统引导的时候从宿主系统上传到设备中。 41 | 42 | 根据 Debian GNU/Linux 项目的标准,大多数情况下这些固件属于 non-free,不能被包含在主发行版或安装系统里面。如果设备驱动程序被包含到发行版里面,并且 Debian GNU/Linux 可以合法地发布固件,它通常被单独地放置在仓库的 non-free 区里面。 43 | 44 | 然而,这并不意味着该硬件不能在安装时使用。从 Debian GNU/Linux 5.0 开始,debian-installer 支持从可移动的介质,比如 U 盘,加载固件或包含固件的软件包。 45 | 46 | 假如 debian-installer 提示需要固件文件而您又没有该固件,或者不想装非自由的固件到系统上,您可以试着跳过固件加载。有些情况下驱动程序只是在特定情况下提示需要额外的固件,而这个设备在很多系统上可以不使用它就能工作(这通常出现在使用 tg3 驱动的网卡上)。 47 | 48 | 49 | 如何加载缺失的固件 50 | ************************* 51 | 52 | 如上所述,大部分情况下,没有固件设备就无法工作;有时没有固件不会影响基本的功能,但增强功能就无法使用。 53 | 54 | 如果没有设备驱动程序所需的固件,debian-installer 将显示对话框要求加载缺失的固件。假如选取了选项,debian-installer 将扫描现有设备松散的固件文件或包含固件的软件包。如果搜索到,固件会被复制到正确的位置 ``/firmware`` ,然后加载驱动程序模块。 55 | 56 | .. note:: 57 | 58 | 具体哪些设备会被扫描和支持哪个文件系统,取决于系统的架构、安装方法和安装的阶段。特别是在安装的早期阶段,从 FAT 格式的软盘或 U 盘加载固件更容易成功。在 i386 和 amd64 上固件可以从 MMC 或 SD 卡加载。 59 | 60 | 假如了解设备毋需固件也可以工作,或者设备在安装时并不需要使用,您可以跳过加载固件。 61 | 62 | .. note:: 63 | 64 | debian-installer 只提示安装过程中加载的内核模块所需的固件。并不是所有驱动程序都包含在 debian-installer 中,特别是 radeon 没有,因此这意味着一些设备在安装结束时的功能可能与开始时没有什么不同。因此,您的一些硬件可能没有充分发挥其潜力。如果您怀疑是这样,或者只是好奇,那么可以检查 dmesg 命令在新引导的系统上的输出并搜索“固件”名称。 65 | 66 | 67 | 准备介质 68 | ======================= 69 | 70 | 官方的 CD 映像不含商用的固件。这些固件通常是从移动介质,比如 U 盘来加载。另外,包含这些商用固件的非官方的 CD 位于 http://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/。制作这种 U 盘(或者其他的介质,比如硬盘分区或者软盘)时,固件文件或软件包必须放置在文件系统的根目录或者名为 ``/firmware`` 的目录下。推荐使用 FAT 文件系统,因为在安装过程的早期阶段它肯定能被支持。 71 | 72 | 大多数固件的压缩包和 zip 文件可以从这里获得: http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/ 73 | 74 | 下载对应版本的压缩包或 zip 文件,然后解压到介质的文件系统里面。 75 | 76 | 如果您需要的固件没有包含在压缩包里面,可以从档案库(non-free 部分)下载特定的固件。以下概要列出大多数固件软件包,但不保证完整,有些还是非固件软件包: http://packages.debian.org/search?keywords=firmware 77 | 78 | 也可以复制单独的固件文件到介质。要求不严的固件还可以从已经安装的系统或硬件制造商那里获得。 79 | 80 | 固件和安装好的系统 81 | ============================ 82 | 83 | 任何安装期间加载的固件会自动被复制到安装好的系统。多数情况下这可以保证需要固件的设备可以在系统重新启动之后正常工作。然而,如果安装好的系统运行在与安装程序不同的内核版本,有可能由于版本的偏差造成固件不能加载。 84 | 85 | 如果固件从一个固件软件包加载,debian-installer 会为安装好的系统也安装该软件包,并自动添加软件包仓库的 non-free 部分到 APT 的 sources.list。这样做的优点在于如果有固件的新版本存在会自动更新。 86 | 87 | 如果安装过程中跳过加载固件,相关的设备可能无法在安装好的系统中工作,直到手动安装好固件或软件包。 88 | 89 | .. note:: 90 | 91 | 如果固件从不严格的固件文件加载,复制到安装好的系统的固件将不会自动更新,除非对应的固件软件包(如果有的话)在系统安装之后安装。 92 | 93 | 94 | 进入系统之后如何安装固件? 95 | ************************************** 96 | 97 | 如果安装的时候跳过了加载缺失的固件文件,在系统安装完成之后,只需要将固件文件放在 ``/lib/firmware/`` 目录下即可。如果目录不存在,请新建目录 makir /lib/firmware/ 。 98 | 99 | .. note:: 100 | 101 | /lib/firmware/ 目录不存在也可能是没有安装 firmware。请安装 ``apt-get install firmware-*``。再将固件文件放在 /lib/firmware/ 目录下即可。 102 | 103 | 参考链接 104 | ************************************ 105 | 106 | * `Debian GNU/Linux 安装手册 `_ 107 | * `Intel wifi 固件下载 1 `_ 108 | * `Intel wifi 固件下载 2 `_ 109 | 110 | -------------------------------------------------------------------------------- /docs/Chapter06/backtty.rst: -------------------------------------------------------------------------------- 1 | 在终端中把命令放到后台执行 2 | ########################## 3 | 4 | 在终端中执行命令时,在程序命令之后加上 ``&`` 字符,可以启动一个程序并将它放到后台运行。 5 | 6 | 可以用 ``jobs`` 命令查看后台执行程序的列表,用 ``fg %1`` 将程序拉到前台来(1 为后台的编号,默认为 1 所有 fg = fg %1),这样就可以用 Ctrl-c 来杀死程序。 7 | 8 | .. highlight:: none 9 | 10 | :: 11 | 12 | [me@linuxbox ~]$ xlogo & 13 | [1] 28236 14 | [me@linuxbox ~]$ jobs 15 | [1]+ Running xlogo & 16 | [me@linuxbox ~]$ fg %1 17 | xlogo 18 | 19 | 如果在输入命令时,忘记加上 ``&`` 字符,又或者在程序执行过程中才发现需要很长的时间执行完程序,那么这时怎么将程序放到后台去执行呢? 20 | 21 | 只需要两步: 22 | 23 | 1. Ctrl-z 停止当前进程,并移动到后台。 24 | 2. ``bg %1`` 在后台执行程序 25 | -------------------------------------------------------------------------------- /docs/Chapter06/backup.rst: -------------------------------------------------------------------------------- 1 | 系统备份与还原 2 | ############################ 3 | 4 | 在一个折腾无极限的年纪,手残、尝鲜、测试...谁都不能保证你的 Linux 每次都能顺利启动,提前做好系统备份会是一个明智的选择。 5 | 6 | 网上有好多的 ``tar`` 命令备份方法,但是按方法测试后一次都没有成功过。 7 | 转而求其次,使用 ``dd`` 命令备份系统,简单直接。缺点是装系统时需要提前设计分区,系统备份需要占用单独的分区。 8 | 9 | 操作步骤 10 | **************************** 11 | 12 | 1. 使用 ``df -h`` 命令查看系统分区,确定根目录的磁盘号 13 | 2. 使用 ``dd if=/dev/sda of=/dev/sdb`` 命令备份磁盘分区,sda 为根分区,sdb 为备份分区 14 | 15 | 两步系统就备份完成,如果需要还原系统,只需要颠倒分区位置 ``dd if=/dev/sdb of=/dev/sda`` 。 16 | 17 | 18 | 推荐阅读: :doc:`../Chapter01/00_dd` 19 | -------------------------------------------------------------------------------- /docs/Chapter06/commandNotFound.rst: -------------------------------------------------------------------------------- 1 | 未找到命令的解决办法 2 | #################################### 3 | 4 | 由于 Linux 的发行版多种多样,有时在终端中输入部分常用命令会找不到,如下: 5 | 6 | .. highlight:: none 7 | 8 | :: 9 | 10 | [Linux]$ fdisk 11 | bash: Command 'fdisk' not found 12 | 13 | 14 | **原因分析:** 15 | 16 | 首先应该使用 :ref:`whereis 命令 ` 查看系统中是否包含该命令,如果没有找到命令则需要安装。 17 | 18 | 由于部分命令运行时需要 root 权限,在某些发行版中会将其放入 ``/sbin`` 目录中,而在命令搜索路径 ``$PATH`` 中又不包含 ``/sbin`` 目录,所以会导致未找到命令。 19 | 20 | :: 21 | 22 | # 查找 fdisk 命令的路径 23 | [Linux]$ whereis fdisk 24 | fdisk: /sbin/fdisk /usr/share/man/man8/fdisk.8.gz 25 | 26 | # 查看命令搜索路径 27 | [Linux]$ echo $PATH 28 | /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games 29 | 30 | 31 | 解决方法: 32 | ************************************ 33 | 34 | **方法一:** 使用 ``su -`` 命令直接切换到 root 用户及其环境变量中,注意 su 命令后要带有中划线。 35 | 36 | **方法二:** 使用 切换虚拟终端,以 root 用户登陆。 37 | 38 | **方法三:** 将没有的命令路径添加到 ``$PATH`` 变量中(如果想永久生效请将 ``export PATH=/sbin`` 添加到配置文件中)。 39 | 40 | :: 41 | 42 | # 临时修改变量 43 | [Linux]$ PATH=$PATH:/sbin 44 | 45 | -------------------------------------------------------------------------------- /docs/Chapter06/gitHubWeb.rst: -------------------------------------------------------------------------------- 1 | 通过 GitHub 发布网站 2 | ########################## 3 | 4 | 发布一个网页并不是三言两语就能简单说明的,这主要是因为有太多方法可以去完成。现在,只需 3 步就可以通过 Github 在线发布网站。 5 | 6 | 1. 创建一个新的资源库(repository)来存放网页文件。 7 | 8 | .. note:: 9 | 10 | 资源库名为 name.github.io(name 为资源库名)。 11 | 12 | 2. 将你的网页文件上传到资源库。 13 | 14 | .. note:: 15 | 16 | 确保资源库中有一个 index.html 首页文件。 17 | 18 | 3. 访问 name.github.io 来查看网站(资源库名为 gavin,请访问 gavin.github.io)。 19 | 20 | .. note:: 21 | 22 | 网站可能需要几分钟才能投入使用。如果它不能立即工作,请等待几分钟再试一次。 23 | 24 | 想要了解更多,请看 `GitHub Pages Help`_ 。 25 | 26 | 本文摘自 `DMN web docs`_ 。 27 | 28 | .. _`GitHub Pages Help`: https://help.github.com/categories/github-pages-basics/ 29 | 30 | .. _`DMN web docs`: https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/Publishing_your_website 31 | -------------------------------------------------------------------------------- /docs/Chapter06/hidden.file.rst: -------------------------------------------------------------------------------- 1 | 隐藏 lost+found 文件夹 2 | ############################ 3 | 4 | 使用 ext2/ext3/ext4 格式化硬盘后,当挂载硬盘时会自动产生一个 ``lost+found/`` 目录,用来存放 fsck 过程中部分修复的文件。在日常使用系统时,这个文件夹可以忽略,所以最好在文件管理器中隐藏 ``lost+found/`` 文件夹。 5 | 6 | 在 LInux 中主要有两种隐藏文件的方法: 7 | 8 | 1. 重命名文件法,通过以点(“.”)前缀重命名一个文件或文件夹的方式隐藏文件 9 | 2. 非重命名文件法,通过 ``.hidden`` 文件指定隐藏的文件或文件夹 10 | 11 | 因为 ``lost+found/`` 是系统自动创建的文件,所以使用第二种方法隐藏文件。 12 | 13 | 14 | .hidden 文件 15 | **************************** 16 | 17 | 一些文件管理器,比如 Nautilus、Nemo、Caja 和 Thunar,支持一种很原始的方法来隐藏文件,不需要重命名。只需在想要隐藏文件的地方创建一个 ``.hidden`` 文件,然后把想隐藏的文件名和文件夹名一行一个地加进来。 18 | 19 | .. hint:: 20 | 21 | .hidden 文件只需要写入文件名,如果要隐藏文件夹,末尾不能带有 ``/`` 目录分隔符。 22 | 23 | -------------------------------------------------------------------------------- /docs/Chapter06/softwareSource.rst: -------------------------------------------------------------------------------- 1 | 将 ISO 镜像设置为本地源 2 | ############################ 3 | 4 | 软件源就是一个应用程序的安装库,很多很多的应用软件都在这个库里面。它可以是网络服务器、光盘,甚至是硬盘上的一个目录。通常大家都会设置网络源,但在一些特殊情况下(如没有网卡驱动),需要从本地安装软件或驱动,这时将 ISO 文件设置为软件源就很实用。 5 | 6 | Debian 7 | **************************** 8 | 9 | 以下操作需要 root权限。 10 | 11 | 1. 挂载 iso 文件: 12 | 13 | .. highlight:: none 14 | 15 | :: 16 | 17 | mount -t iso9660 -o loop /mnt/debian-x.x.x-amd64-DVD-1.iso /media/cdrom/ 18 | 注意:挂载到的目录,和步骤 3 使用的是同一个目录。 19 | 20 | 21 | 2. 备份 /etc/apt/sources.list,并清空(注释)文件内容。 22 | 23 | 3. 添加本地源: 24 | 25 | :: 26 | 27 | apt-cdrom -m -d /media/cdrom/ add 28 | 29 | 4. 更新一下: 30 | 31 | :: 32 | 33 | apt-get update 34 | 35 | Centos(待测试) 36 | **************************** 37 | 38 | 操作系统:CentOS 5.5 ,需要 root 权限。 39 | 40 | 1. 挂载 iso 文件到挂载点: 41 | 42 | :: 43 | 44 | mount -o loop /mnt/iso/CentOS5.iso /mnt/cdrom 45 | 46 | 2. 备份并修改 yum 的配置文件: 47 | 48 | :: 49 | 50 | # 备份文件 51 | cd /etc/yum.repos.d/ 52 | cp CentOS-Media.repo CentOS-Media.repo.bak 53 | 54 | # 修改文件 55 | vi CentOS-Media.repo 56 | 57 | [c5-media] 58 | 59 | name=CentOS-$releasever - Media 60 | 61 | baseurl=file:///mnt/ # 表明 yum 源在 /mnt 目录下,其它的源注释掉 62 | 63 | # baseurl=file:///media/CentOS/ 64 | 65 | # file:///media/cdrom/ 66 | 67 | # file:///media/cdrecorder/ 68 | 69 | gpgcheck=1 70 | 71 | enabled=1 # 启用 yum 72 | 73 | gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 74 | 75 | 3. 清除缓存 76 | 77 | :: 78 | 79 | yum clean all 80 | yum list 81 | -------------------------------------------------------------------------------- /docs/Chapter06/wordless.terminal.rst: -------------------------------------------------------------------------------- 1 | 关闭终端响铃 2 | #################################### 3 | 4 | 在使用终端自动补全功能时会发出讨厌的嘟嘟声,可通过编辑配置文件 ``/etc/inputrc`` 关闭终端响铃: 5 | 6 | .. highlight:: none 7 | 8 | :: 9 | 10 | # 取消该行的注释,或添加该行 11 | [Linux]# vim /etc/inputrc 12 | 13 | set bell-style none 14 | 15 | 16 | 关闭 vi 响铃 17 | ************************************ 18 | 19 | 在 vi 的配置文件 ``/etc/virc`` 中,添加一行: 20 | 21 | :: 22 | 23 | set vb t_vb= 24 | 25 | 26 | 注意:vim 的配置文件是 ``/etc/vimrc`` 。 -------------------------------------------------------------------------------- /docs/Chapter06/xfce4i3.rst: -------------------------------------------------------------------------------- 1 | xfce4+i3 环境配置 2 | #################################### 3 | 4 | i3wm 是一个极简主义的平铺管理器,它能以无缝、不重叠的方式智能地排列屏幕上的窗口。其他平铺管理器包括 xmonad 和 wmii 等。 5 | 6 | i3wm 窗口管理器底层使用 Xorg server,xfce4.16 也使用 Xorg server 底层操作,所以两者可以无缝的衔接。 7 | 8 | i3wm 状态栏配置繁琐,直接使用 xfce4 的状态栏配置,简洁高效。 9 | 10 | 操作环境要求: 11 | 12 | - Debian11 操作系统 13 | - xfce4.16 桌面环境 14 | 15 | 16 | 状态栏配置 17 | ************************************ 18 | 19 | 启动 i3 窗口管理器后,默认的配置文件目录是 ``~/.config/i3/config`` 。 20 | 21 | .. highlight:: none 22 | 23 | :: 24 | 25 | 1. 注释掉 i3 默认的状态栏配置 26 | 27 | # bar { 28 | # status_command i3status 29 | # } 30 | 31 | 32 | 2. 添加 xfce4 状态栏 33 | 34 | # 添加 xfce4 状态栏 35 | exec --no-startup-id xfce4-panel --disable-wm-check 36 | # 启动 xfce4 电源管理模块 37 | exec --no-startup-id xfce4-power-manager 38 | 39 | 一些细节调整: 40 | 41 | 1. 在状态栏中加入多桌面,并设置成按钮,关闭桌面名显示。 42 | 2. 输入法图标强制大小显示。 43 | 3. 时间设置成 24 小时带秒显示。 44 | 45 | 46 | 桌面背景 47 | ************************************ 48 | 49 | xfce4 默认使用 LightDM 登陆管理器。修改登陆管理器背景后会同步到桌面中。 50 | 51 | :: 52 | 53 | /etc/lightdm/lightdm-gtk-greeter.conf 54 | ----------------------------------------------------------- 55 | 56 | [greeter] 57 | background=/usr/share/pixmaps/bg.jpg 58 | 59 | 60 | 触控板点击和自然滚动 61 | ************************************ 62 | 63 | :: 64 | 65 | /usr/share/X11/xorg.conf.d/40-libinput.conf 66 | ----------------------------------------------------------- 67 | 68 | Section "InputClass" 69 | Identifier "libinput touchpad catchall" 70 | MatchIsTouchpad "on" 71 | MatchDevicePath "/dev/input/event*" 72 | Driver "libinput" 73 | # 添加以下两行,第一行开启点击,第二行双指自然滚动 74 | Option "Tapping" "on" 75 | Option "NaturalScrolling" "true" 76 | EndSection 77 | 78 | 79 | 已知问题 80 | ************************************ 81 | 82 | - xfce4 锁屏管理器有 bug,锁屏后不能登陆。在设置禁用锁屏功能 83 | - Debian11 暂时不支持 i3-gaps,设置窗口间隙。 84 | -------------------------------------------------------------------------------- /docs/Chapter07/dhcpd.rst: -------------------------------------------------------------------------------- 1 | DHCP 服务配置文件 2 | ############################### 3 | 4 | /etc/dhcpd.conf 是DHCP服务的配置文件,DHCP 服务所有参数都是通过修改 dhcpd.conf 文件来实现,安装后 dhcpd.conf 是没有做任何配置的,将 /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample 复制为 dhcpd.conf 文件进行配置: 5 | 6 | updatedb 一下,然后执行 ``locate dhcpd.conf`` 会发现所有与 dhcpd.conf 有关的配置文件。 7 | 8 | 备份文件之后对 /etc/dhcpd.conf 文件修改,配置 DHCP 服务参数 9 | 10 | .. highlight:: none 11 | 12 | :: 13 | 14 | [root@linux-a ~]# vim /etc/dhcpd.conf 15 | 16 | ddns-update-style interim; 17 | ignore client-updates; 18 | 19 | subnet 192.168.124.0 netmask 255.255.255.0 { 20 | 21 | # --- default gateway 22 | option routers 192.168.124.1; 23 | option subnet-mask 255.255.255.0; 24 | 25 | option time-offset -18000; # Eastern Standard Time 26 | # option ntp-servers 192.168.1.1; 27 | # option netbios-name-servers 192.168.1.1; 28 | # --- Selects point-to-point node (default is hybrid). Don't change this unless 29 | # -- you understand Netbios very well 30 | # option netbios-node-type 2; 31 | 32 | range dynamic-bootp 192.168.124.200 192.168.124.230; 33 | default-lease-time 21600; 34 | max-lease-time 43200; 35 | 36 | # we want the nameserver to appear at a fixed address 37 | host www { 38 | hardware ethernet 12:34:56:78:AB:CD; 39 | fixed-address 207.175.42.254; 40 | } 41 | } 42 | 43 | 44 | dhcpd.conf参数说明 45 | ******************************* 46 | 47 | /etc/dhcpd.conf 通常包括三部分:parameters、declarations 、option。 48 | 49 | 1. DHCP 配置文件中的 parameters(参数):表明如何执行任务,是否要执行任务,或将哪些网络配置选项发送给客户 50 | 51 | ddns-update-style 配置DHCP-DNS 互动更新模式。 52 | default-lease-time 指定确省租赁时间的长度,单位是秒。 53 | max-lease-time 指定最大租赁时间长度,单位是秒。 54 | hardware 指定网卡接口类型和MAC地址。 55 | server-name 通知DHCP客户服务器名称。 56 | get-lease-hostnames flag 检查客户端使用的IP地址。 57 | fixed-address ip 分配给客户端一个固定的地址。 58 | authritative 拒绝不正确的IP地址的要求。 59 | 60 | 61 | 2. DHCP 配置文件中的 declarations (声明):用来描述网络布局、提供客户的IP地址等 62 | 63 | shared-network 用来告知是否一些子网络分享相同网络。 64 | subnet 描述一个IP地址是否属于该子网。 65 | range 起始IP 终止IP 提供动态分配IP 的范围。 66 | host 主机名称 参考特别的主机。 67 | group 为一组参数提供声明。 68 | allow unknown-clients;deny unknown-client 是否动态分配IP给未知的使用者。 69 | allow bootp;deny bootp 是否响应激活查询。 70 | allow booting;deny booting 是否响应使用者查询。 71 | filename 开始启动文件的名称. 应用于无盘工作站。 72 | next-server 设置服务器从引导文件中装如主机名,应用于无盘工作站。 73 | 74 | 75 | 3. DHCP配置文件中的option(选项):用来配置DHCP可选参数,全部用option关键字作为开始 76 | 77 | subnet-mask 为客户端设定子网掩码。 78 | domain-name 为客户端指明DNS名字。 79 | domain-name-servers 为客户端指明DNS服务器IP地址。 80 | host-name 为客户端指定主机名称。 81 | routers 为客户端设定默认网关。 82 | broadcast-address 为客户端设定广播地址。 83 | ntp-server 为客户端设定网络时间服务器IP地址。 84 | time-offset 为客户端设定和格林威治时间的偏移时间,单位是秒。 85 | 86 | 注意:如果客户端使用的是视窗操作系统,不要选择"host-name"选项,即不要为其指定主机名称 87 | 88 | 89 | 启动和检查DHCP服务器 90 | ******************************* 91 | 92 | 使用命令启动DHCP服务器:: 93 | 94 | #service dhcpd start 95 | 96 | 关闭DHCP服务器:: 97 | 98 | #service dhcpd stop 99 | 100 | 重启DHCP服务器:: 101 | 102 | #service dhcpd restart 103 | 104 | 使用ps命令检查dhcpd进程:: 105 | 106 | #ps -ef | grep dhcpd 107 | root 2402 1 0 14:25 ? 00:00:00 /usr/sbin/dhcpd 108 | root 2764 2725 0 14:29 pts/2 00:00:00 grep dhcpd 109 | 110 | 使用检查dhcpd运行的端口:: 111 | 112 | # netstat -nutap | grep dhcpd 113 | udp 0 0 0.0.0.0:67 0.0.0.0:* 2402/dhcpd 114 | 115 | 配置DHCP客户端 116 | ********************************* 117 | 118 | 通常网管员使用选择手工配置 DHCP 客户,需要修改 /etc/sysconfig/network 文件来启用联网;并修改 /etc/sysconfig/network-scripts 目录中每个网络设备的配置文件。在该目录中,每个设备都有一个叫做 ifcfg-eth? 的配置文件,eth?是网络设备的名称。如 eth0 等。如果你想在引导时启动联网,NETWORKING 变量必须设为 yes。 除了此处之外 /etc/sysconfig/network 文件应该包含以下行: 119 | 120 | :: 121 | 122 | NETWORKING=yes 123 | DEVICE=eth0 124 | BOOTPROTO=dhcp 125 | ONBOOT=yes 126 | -------------------------------------------------------------------------------- /docs/Chapter07/images/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Chapter07/images/001.jpg -------------------------------------------------------------------------------- /docs/Images/console.01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/console.01.jpg -------------------------------------------------------------------------------- /docs/Images/console.02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/console.02.jpg -------------------------------------------------------------------------------- /docs/Images/console.03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/console.03.jpg -------------------------------------------------------------------------------- /docs/Images/console.04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/console.04.jpg -------------------------------------------------------------------------------- /docs/Images/desktop.01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/desktop.01.png -------------------------------------------------------------------------------- /docs/Images/desktop.02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/desktop.02.png -------------------------------------------------------------------------------- /docs/Images/desktop.03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/desktop.03.png -------------------------------------------------------------------------------- /docs/Images/desktop.04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/desktop.04.png -------------------------------------------------------------------------------- /docs/Images/desktop.05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/desktop.05.png -------------------------------------------------------------------------------- /docs/Images/desktop.06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/desktop.06.png -------------------------------------------------------------------------------- /docs/Images/desktop.07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/desktop.07.png -------------------------------------------------------------------------------- /docs/Images/desktop.08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/desktop.08.png -------------------------------------------------------------------------------- /docs/Images/desktop.09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/desktop.09.png -------------------------------------------------------------------------------- /docs/Images/fdisk.01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/fdisk.01.jpeg -------------------------------------------------------------------------------- /docs/Images/fontStyle.01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/fontStyle.01.png -------------------------------------------------------------------------------- /docs/Images/fontStyle.02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/fontStyle.02.png -------------------------------------------------------------------------------- /docs/Images/fontStyle.03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/fontStyle.03.png -------------------------------------------------------------------------------- /docs/Images/fontStyle.04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/fontStyle.04.png -------------------------------------------------------------------------------- /docs/Images/fontStyle.05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/fontStyle.05.png -------------------------------------------------------------------------------- /docs/Images/fontStyle.06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/fontStyle.06.png -------------------------------------------------------------------------------- /docs/Images/fontStyle.07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/fontStyle.07.png -------------------------------------------------------------------------------- /docs/Images/git.01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/git.01.jpg -------------------------------------------------------------------------------- /docs/Images/locale.01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/locale.01.jpg -------------------------------------------------------------------------------- /docs/Images/locale.02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/locale.02.jpg -------------------------------------------------------------------------------- /docs/Images/permission.01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/permission.01.jpg -------------------------------------------------------------------------------- /docs/Images/ventoy.01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/ventoy.01.png -------------------------------------------------------------------------------- /docs/Images/vnc.01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/vnc.01.png -------------------------------------------------------------------------------- /docs/Images/vnc.02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/vnc.02.png -------------------------------------------------------------------------------- /docs/Images/vnc.03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/vnc.03.png -------------------------------------------------------------------------------- /docs/Images/vnc.04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/vnc.04.png -------------------------------------------------------------------------------- /docs/Images/vnc.05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/vnc.05.png -------------------------------------------------------------------------------- /docs/Images/vnc.06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dz2904/Linux/cf0c5426adc4b6059031f55e94a306d3c57654ba/docs/Images/vnc.06.png -------------------------------------------------------------------------------- /docs/TOC/Chapter01.rst: -------------------------------------------------------------------------------- 1 | 第一章 基本命令 2 | ==================================== 3 | 4 | 命令说明以简洁实用为主,不追求大而全。实际上没有任何人了解全部的 Linux 命令及选项。 5 | 6 | 随着 Linux 的发展,现在几乎所以的发行版都带有 GUI 图形桌面系统,桌面系统可以满足大部分的操作。但是在生产环境中几乎是没有图形界面的,大部分是通过 SSH 连接到服务器,从而依靠命令行操作服务器。Linux 的精髓也更多的体现在命令行上,其强大的功能,海量的工具,可以帮你轻而易举的完成各种复杂的系统管理操作。 7 | 8 | .. toctree:: 9 | :maxdepth: 2 10 | :glob: 11 | 12 | ../Chapter01/* 13 | -------------------------------------------------------------------------------- /docs/TOC/Chapter02.rst: -------------------------------------------------------------------------------- 1 | 第二章 配置文件 2 | ==================================== 3 | 4 | 每个 Linux 程序都是一个可执行文件,几乎每个程序的行为都可以通过修改其配置文件来按照你的偏好或需求去定制,所以修改配置文件是使用 Linux 的重中之重。 5 | 6 | 一切皆文件 7 | 8 | .. toctree:: 9 | :maxdepth: 2 10 | :glob: 11 | 12 | ../Chapter02/* 13 | -------------------------------------------------------------------------------- /docs/TOC/Chapter03.rst: -------------------------------------------------------------------------------- 1 | 第三章 概念释义 2 | ==================================== 3 | 4 | 理解 Linux 中的基本概念,讲解详细深入。 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | :glob: 9 | 10 | ../Chapter03/* 11 | -------------------------------------------------------------------------------- /docs/TOC/Chapter04.rst: -------------------------------------------------------------------------------- 1 | 第四章 其他 2 | ==================================== 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | :glob: 7 | 8 | ../Chapter04/* 9 | -------------------------------------------------------------------------------- /docs/TOC/Chapter05.rst: -------------------------------------------------------------------------------- 1 | 第五章 Shell 编程 2 | ==================================== 3 | 4 | Shell 是一个应用程序,充当用户界面和脚本解释器,是用户使用 Linux 系统的桥梁。同时,Shell 也是一种类似于 Python、PHP、Ruby 的脚本语言。 5 | 6 | 7 | .. toctree:: 8 | :maxdepth: 2 9 | :glob: 10 | 11 | ../Chapter05/* 12 | -------------------------------------------------------------------------------- /docs/TOC/Chapter06.rst: -------------------------------------------------------------------------------- 1 | 常见错误及解决方法 2 | ==================================== 3 | 4 | 躺过的各种坑,都在这里... 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | :glob: 9 | 10 | ../Chapter06/* 11 | -------------------------------------------------------------------------------- /docs/TOC/Chapter07.rst: -------------------------------------------------------------------------------- 1 | 待处理文档 2 | ==================================== 3 | 4 | 看见好东西先收集起来,待时间充裕集中消灭他们。 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | :glob: 9 | 10 | ../Chapter07/* 11 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | GNU/Linux 点滴 2 | ==================================== 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | :titlesonly: 7 | :glob: 8 | 9 | preface 10 | TOC/* 11 | -------------------------------------------------------------------------------- /docs/preface.rst: -------------------------------------------------------------------------------- 1 | 前言 2 | #################################### 3 | 4 | 2012 年被同事带入了 Linux 的世界,在此之前我只知道有 Microsoft Windows 和 Mac OS,当时只接触过 Windows。第一次接触 Linux 是从 U 盘中启动的 Fedora,印象最深的就是关机的时候必须按住 Alt 键才会出现关机键,关机速度特别的快。 5 | 6 | 就此打开了另外的一扇门,从《鸟哥的 Linux 私房菜》开始自学,Fedora、Ubuntu、CentOS、Debian、Arch ... 7 | 8 | 这么多年过去了,折腾的挺多,记住的没多少,所以决定记下自己折腾的脚步,权当留个纪念。 9 | 10 | .. image:: ./Images/console.04.jpg 11 | 12 | 大部分内容整理于网络,如有侵权请联系删除! 13 | --------------------------------------------------------------------------------