分类目录归档:操作系统

完全备份、增量备份和差异备份的区别

完全备份是指对某一时间点上的所有数据进行备份,是完全的所有的全量的备份。

增量备份指的是在第一次完全备份或最后一次备份的基础上,只对新添加或改变过的数据进行备份。增量备份是针对上一次备份(可以是全量备份也可以是增量备份或差异备份)后,发生变化的文件。增量备份是建立在上一次备份基础之上的,因此它和上一次备份会建立起依存的关系,也即是说每一次备份都会生成一个镜像文件,增量备份中产生的所有镜像文件是关联在一起的,最后一个增量备份的镜像文件以前一个文件为基础,如果删除了前一个镜像文件,则它后面的所有镜像文件都将变成无效状态。

差异备份是备份上一次完全备份后发生变化的文件。它的优点也是提高备份效率与降低镜像文件占用的磁盘空间,它是增量备份另一种表现形式。

差异备份具有增量备份需要时间短、节省磁盘空间的优势;其次又具有完全备份的恢复效率高、恢复时间短的特点。

举个例子:在周一时,系统管理员做了一次完全备份,周二至周六每天各做了一次完全备份、增量备份和一次差异备份,到周日时管理员想恢复到周六的数据,那么只需要恢复周六的完全备份,也可以使用周一的完全备份加周二、周三、周四、周五、周六的增量备份来恢复,也可以使用周一的完全备份和周六的差异备份来恢复。

一般按照备份数据量从多到少的排序是:完全备份>差异备份>增量备份,因为完全备份的重复数据最多,其实是差异备份的重复数据最多。按照恢复速度从快到慢的排序是:完全备份>差异备份>增量备份,因为完全备份只需要恢复一个步骤即可,差异备份需要先恢复上一次的完全备份再导入差异备份的数据这两个步骤,增量备份则是先恢复上一次的完全备份,再依次恢复每一次的增量备份的数据这些步骤。

一般实际使用中会用完全备份加增量备份的组合,或者完全备份加差异备份的组合,有时候更建议采用完全备份加差异备份的组合。

Windows 蓝屏为什么是蓝色

蓝屏主要是因为有操作试图往 OS 系统控制之外的内存中写入数据,这时候就会被 CPU 识别出来,并触发异常,进而显示蓝屏错误。

至于 Windows 蓝屏为什么是蓝底,微软程序员 Dave Plummer 解释说很早之前他的同事 John Vert 使用的办公机是 MIPS RISC Box,它的固件就是蓝底,同时他最喜欢的编辑器 Slick Edit 也是这样的设计,所以 John Vert 就设计了这样的样式,一直用到现在。

HP服务器redhat操作系统升级网卡驱动的方法

现有一台HP DL580 G7服务器,redhat linux5.6 64位操作系统,需要升级网卡驱动,步骤如下:

1、安装源RPM包
#rpm -ivh hp-nx_nic-xxx.src.rpm
2、为hp-nx-nic和hp-nx_nic-tools软件包构建二进制RPM
#rpmbuild -bb /usr/src/redhat/SPECS/hp-nx_nic.spec
3、检查是否已存在现有版本的nx_nic软件包
#rpm -q kmod-hp-nx_nic-<flavor>
如果存在旧版本,需要删除
#rpm -e kmod-hp-nx_nic-<flavor>
验证是否已经被删除
#rpm -q kmod-hp-nx_nic-<flavor>
然后删除相应的工具包
#rpm -e hp-nx_nic-tools
4、验证是否有旧版本的nx_nic或者netxen_nic加载到内核中
#lsmod |grep nx_nic
或者
#lsmod |grep netxen_nic
删除驱动前需要将网口down掉
#ifconfig eth<n> down
然后删除驱动
#modprobe -r nx_nic
或者
#modprobe -r netxen_nic
5、安装相关的hp-nx_nic-tools版本,然后再安装驱动程序包
#rpm -ivh /usr/src/redhat/RPMS/<arch>/hp-nx_tools-<version>-<arch>.rpm
6、安装新的二进制驱动程序RPM软件包
#rpm -ivh /usr/src/redhat/RPMS/<arch>/kmod-hp-nx_nic-<flavor>-<version>.<arch>.rpm
7、运行modinfo nx_nic并验证驱动程序版本
#modinfo nx_nic
8、运行modprobe nx_nic以安装新的nx_nic驱动
#modprobe nx_nic
9、完成

升级网卡固件版本,可以参考https://www.eumz.com/2021-01/2120.html

HP服务器升级网卡固件、驱动来解决网卡bug的操作办法

现有一台HP DL580 G7服务器,运行redhat linux5.6 64位操作系统,突然出现宕机现象,重启后查看/var/log/messages,发现有:interface1 kernel:eth0:firmware hang detected相关信息,考虑到HP G7的服务器曾经出现过网卡BUG,再通过ethtool -i eth0查看网卡固件版本,发现是固件版本是4.0.555,需要升级固件。

HP DL580 G7服务器的网卡由QLogic代工,这个网卡的固件存在缺陷,在流量过载或正常情况下也会出现网卡驱动崩溃的情况,会导致服务器宕机,需要更新固件。并且使用该型号NC375i的服务器都会受影响,比如HP DL370 G6、HP DL585 G7、HP DL980 G7等型号。

本次升级固件、驱动需要使用引导盘smartstart8.7、网卡固件文件CP016410.scexe、网卡驱动文件hp-nx_nic-4.0.590-2.src.rpm。

引导盘smartstart8.7下载链接:https://downloads.hpe.com/pub/softlib2/software1/cd/p1760479716/v71252/smartstart-8.70B-0-x64.zip
网卡固件文件CP016410.scexe,可下载Smart Update Firmware DVD10.10,可参考链接:
https://support.hpe.com/hpsc/swd/public/detail?swItemId=MTX_4372f442c3424063809e3d9198
网卡驱动文件hp-nx_nic-4.0.590-2.src.rpm下载链接:
https://downloads.hpe.com/pub/softlib2/software1/pubsw-linux/p280489831/v80579/hp-nx_nic-4.0.590-2.src.rpm

升级固件的步骤如下:
1、使用引导盘smartstart8.7引导,进入下图界面时,按Ctrl+Alt+F1,进入再按回车,进入命令行界面。

2、将带有固件文件的U盘插入,在命令行下使用fdisk -l命令查看U盘路径,下图中U盘在/dev/sda1。

3、通过mount /dev/sda1 /mnt挂载U盘,进入/mnt目录,执行命令 ./CP016410.scexe升级固件,按y进行升级,升级完成后执行命令reboot重启服务器,进入操作系统。

4、进入操作系统,使用命令ethtool -i eth0查看固件版本,发现固件版本已由4.0.555升级到4.0.585,此时可以正常ping通网关,网络正常。
5、再升级网卡驱动,升级网卡驱动详见:https://www.eumz.com/2021-01/2127.html

dos2unix介绍及ubuntu下dos2unix下载链接

linux和windows下的换行符不同,linux使用/n换行,windows使用/r/n来表示换行,windows的文本文件直接拿到linux中使用会报错,因为多了/r字符。

可以通过dos2unix工具来将windows下写的文件转换成unix格式。

ubuntu可以从http://cn.archive.ubuntu.com/ubuntu/pool/universe/d/dos2unix/dos2unix_6.0.4-1_amd64.deb下载dos2unix工具。

Linux 命令行,bash shell和环境变量

bash shell

bashshell 是可用于 Linux 的几个 shell 之一,也被称为 Bourne-again shell,是根据一个早期的 shell (/bin/sh) 的创建者 Stephen Bourne 来命名的。Bash 高度兼容 sh,但它在函数和编程功能上都提供了许多改进。它合并了来自 Korn shell (ksh) 和 C shell (csh) 的特性,想要成为一个符合 POSIX 的 shell。

在深入了解 bash 之前,回想一下 shell是一个接受和执行命令的程序。它还支持编程结构,允许使用更小的部件构建复杂的命令。这些复杂命令或 脚本可保存为文件,独自成为新命令。实际上,典型 Linux 系统上的许多命令 都是脚本。

Shell 有一些 内置命令,比如 cdbreakexec。其他命令是 外部命令。

Shell 也使用 3 种标准 I/O

  • stdin标准输入流,它向命令提供输入。
  • stdout标准输出流,它显示来自命令的输出。
  • stderr标准错误流,它显示来自命令的错误输出。

输入流向程序提供输入,这些输入通常来自终端击键。输出流打印文本字符,通常打印到终端。终端最初为 ASCII 打字机或显示终端,但现在通常是图形桌面上的窗口。

如果您使用的是没有图形桌面的 Linux 系统,或者在图形桌面上打开一个终端窗口,那么您会看到一个提示符,它可能类似于 清单 1中所示的 3 个提示符之一。

清单 1. 一些典型的用户提示符

[ian@atticf20 ~]$
jenni@atticf20:data
$

请注意,这 3 个提示符都来自我的测试系统 atticf20,但面向的是不同用户。前两个是 bash 提示符,二者都显示了已登录的用户、系统名和当前工作目录。第三个提示符是我的系统上针对 ksh shell 的默认提示符。不同发行版和不同 shell 默认使用不同的提示符,所以如果您的发行版看起来有所不同,不要恐慌。我们将在本系列的另一篇教程中介绍如何更改提示符。

如果您以根用户(或超级用户)身份登录,您的提示符可能类似于 清单 2中所示的提示符之一。

清单 2. 超级用户或根用户提示符示例

[root@atticf20 ~]#
atticf20:~#

根用户有很大的权力,所以使用该身份时请小心。在拥有根用户特权时,大部分提示符都包含结尾的井号 (#)。普通用户特权通常使用不同的字符表示,这个字符通常为美元符号 ($)。您的实际提示符可能看起来与本教程中的示例有所不同。您的提示符可能包含您的用户名、主机名、当前目录、日期或打印该提示符的时间,等等。

备注:一些系统(比如 Debian)和基于 Debian 的发行版(比如 Ubuntu)不允许根用户登录,要求所有特权(根用户)命令都使用 sudo命令执行。在这种情况下,您的提示符不会发生更改,但您应该知道需要使用 sudo执行普通用户无权执行的命令。

这些教程包含从真实的 Linux 系统剪切并粘贴的代码示例,其中使用了这些系统的默认提示符。根用户提示符有一个结尾 #,所以您可以将它们与普通用户提示符(有一个结尾 $)区分开来。这种约定与许多有关这一主题的图书一致。如果某项功能似乎对您不起作用,您可以检查示例中的提示符。

环境变量

当您在 bash shell 中运行时,许多因素构成了您的 环境,比如您的提示符的形式、主目录、工作目录、shell 的名称、您打开的文件、您定义的函数,等等。您的环境包含许多可由 bash 或您设置的 变量。bash shell 还允许您拥有 shell 变量,您可以将这些变量 导出到环境中,供 shell 中运行的其他进程或您可能从当前 shell 衍生的其他 shell 使用。

环境变量和 shell 变量都有一个 名称。可以在名称前面加上 ‘ $ ’ 作为前缀来引用变量的值。您会遇到的一些常见的 bash 环境变量如 下表中所示。

一些常见的 bash 环境变量
名称功能
USER登录用户的名称
UID登录用户的用户 id 数字
HOME用户的主目录
PWD当前工作目录
SHELLshell 的名称
$运行的 bash shell(或其他)进程的进程 id(或 PID
PPID启动此进程的进程的进程 id(也就是父进程的 id)
?上一个命令的退出代码

展示了您可能在其中一些常见 bash 变量中看到的结果

环境变量和 shell 变量
[ian@atticf20 ~]$ echo $USER $UID
ian 1000
[ian@atticf20 ~]$ echo $SHELL $HOME $PWD
/bin/bash /home/ian /home/ian
[ian@atticf20 ~]$ (exit 0);echo $?;(exit 4);echo $?
0
4
[ian@atticf20 ~]$ echo $$ $PPID
3175 2457

可通过键入一个名称后立即键入等号 (=) 来创建或 设置shell 变量。如果该变量存在,可以修改它来分配新值。变量是区分大小写的,所以 var1 和 VAR1 是不同的变量。根据约定,变量(特别是导出的变量)采用大写,但这不是必须的。从技术上讲,$$ 和 $? 是 shell 参数而不是变量。它们只能被引用;不能向它们分配值。

创建 shell 变量时,您通常希望将它 导出到环境中,以便从此 shell 启动的其他进程可以使用它。导出的变量 可用于父 shell。可使用 export命令导出变量名。作为 bash 中的快捷方式,可以在一个步骤中分配一个值并导出变量。

为了演示分配和导出过程,我们将在 bash shell 中运行该 bash 命令,然后从新的 bash shell 运行 Korn shell (ksh)。我们将使用 ps命令显示正在运行的命令的信息。

[ian@atticf20 ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
3175  2457 bash
[ian@atticf20 ~]$ bash
[ian@atticf20 ~]$  ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
4325  3175 bash
[ian@atticf20 ~]$ VAR1=var1
[ian@atticf20 ~]$ VAR2=var2
[ian@atticf20 ~]$ export VAR2
[ian@atticf20 ~]$ export VAR3=var3
[ian@atticf20 ~]$ echo $VAR1 $VAR2 $VAR3
var1 var2 var3
[ian@atticf20 ~]$ echo $VAR1 $VAR2 $VAR3 $SHELL
var1 var2 var3 /bin/bash
[ian@atticf20 ~]$ ksh$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
4427  4325 ksh
$ export VAR4=var4
$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var2 var3 var4 /bin/bash
$ exit[ian@atticf20 ~]$ echo $
VAR1 $VAR2 $VAR3 $VAR4 $SHELLvar1 var2 var3 /bin/bash
[ian@atticf20 ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
4325  3175 bash
[ian@atticf20 ~]$ exit
exit
[ian@atticf20 ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
3175  2457 bash
[ian@atticf20 ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
/bin/bash
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2559  2558 -bash
[ian@echidna ~]$ bash
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2811  2559 bash
[ian@echidna ~]$ VAR1=var1
[ian@echidna ~]$ VAR2=var2
[ian@echidna ~]$ export VAR2
[ian@echidna ~]$ export VAR3=var3
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3
var1 var2 var3
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $SHELL
var1 var2 var3 /bin/bash
[ian@echidna ~]$ ksh$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2840  2811 ksh
$ export VAR4=var4$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var2 var3 var4 /bin/bash
$ exit
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var1 var2 var3 /bin/bash
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2811  2559 bash
[ian@echidna ~]$ exit
exit
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2559  2558 -bash
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
/bin/bash

备注:

  1. 在此序列的开头,bash shell 拥有 PID 3175。
  2. 第二个 bash shell 拥有 PID 4325,它的父 shell 为 PID 3175(原始的 bash shell)。
  3. 我们在第二个 bash shell 中创建了 VAR1、VAR2 和 VAR3,但仅导出了 VAR2 和 VAR3。
  4. 在 Korn shell 中,我们创建了 VAR4。echo命令仅显示了 VAR2、VAR3 和 VAR4 的值,可以确认 VAR1 未导出。您看到 SHELL 变量的值未发生改变是否感到很奇怪,因为提示符已发生改变?您不能始终依靠 SHELL 来告诉您在哪些 shell 下运行,但 ps命令会告诉您实际命令。请注意,ps在第一个 bash shell 前面放入了一个连字符 (-),表明这是一个 登录 shell
  5. 返回到第二个 bash shell,我们可以看到 VAR1、VAR2 和 VAR3。
  6. 最后,当返回到原始 shell 时,所有新变量都不存在。

之前对引号的讨论中已提到,可以使用单引号或双引号。它们之间有一个重要区别。shell 会扩展双引号之间的 shell 变量,但使用单引号 (‘) 时不会扩展。在上一个示例中,我们在 shell 中启动了另一个 shell 并获得了一个新进程 id。使用 -c选项,您可以将一个命令传递给其他 shell,该 shell 将执行该命令并返回。如果传递一个带引号的字符串作为命令,外部 shell 将消除引号并传递字符串。如果使用双引号,变量扩展会在传递字符串 之前执行,所以结果可能不符合预期。该 shell 和命令将在另一个进程中运行,所以它们将拥有另一个 PID。清单 9演示了这些概念。顶级 bash shell 的 PID 已突出显示。

添加引号和 shell 变量
[ian@atticf20 ~]$ echo “$SHELL” ‘$SHELL’ “$$” ‘$$’
/bin/bash $SHELL 3175$$
[ian@atticf20 ~]$ bash -c “echo Expand in parent $$ $PPID”
Expand in parent 31752457
[ian@atticf20 ~]$ bash -c ‘echo Expand in child $$ $PPID’
Expand in child 4541 3175

目前为止,我们的所有变量引用都以空白终止,所以很清楚变量名在何处结束。事实上,变量名仅能由字母、数字或下划线组成。shell 知道变量名会在找到另外的字符时结束。有时,您需要在含义模糊表达式中使用变量。在这些情况下,可以使用花括号来表示变量名,如 清单中所示。

将花括号用于变量名
[ian@atticf20 ~]$ echo “-$HOME/abc-“
-/home/ian/abc-
[ian@atticf20 ~]$ echo “-$HOME_abc-“
[ian@atticf20 ~]$ echo “-${HOME}_abc-“
-/home/ian_abc-

Env

没有任何选项或参数的 env命令显示当前环境变量。也可以使用它在自定义环境中执行命令。-i(或者只是 -)选项在运行命令前清除当前环境,而 -u选项取消设置您不希望传递的环境变量。

清单 11显示了没有任何参数的 env命令的部分输出,然后给出了 3 个调用没有父环境的不同 shell 的示例。在我们讨论它们之前请仔细看看它们。

备注:如果您的系统未安装 ksh (Korn) 或 tcsh shell,您需要安装它们来自行执行这些练习。
env 命令

[ian@atticf20 ~]$ env
XDG_VTNR=2
XDG_SESSION_ID=1
HOSTNAME=atticf20
GPG_AGENT_INFO=/run/user/1000/keyring/gpg:0:1
SHELL=/bin/bash
TERM=xterm-256color
XDG_MENU_PREFIX=gnome-
VTE_VERSION=4002
HISTSIZE=1000
GJS_DEBUG_OUTPUT=stderr
WINDOWID=35651982
GJS_DEBUG_TOPICS=JS ERROR;JS LOG
QT_GRAPHICSSYSTEM_CHECKED=1
USER=ian
=/usr/bin/env OLDPWD=/home/ian/Documents [ian@atticf20 ~]$ env -i bash -c ‘echo $SHELL; env’ /bin/bash PWD=/home/ian SHLVL=1 =/usr/bin/env
[ian@atticf20 ~]$ env -i ksh -c ‘echo $SHELL; env’
/bin/sh
_=3175/usr/bin/env
PWD=/home/ian
SHLVL=1
_AST_FEATURES=UNIVERSE – ucb
A__z=”*SHLVL
[ian@atticf20 ~]$ env -i tcsh -c ‘echo $SHELL; env’
SHELL: Undefined variable.

当 bash 设置 SHELL 变量时,会将其导出至环境中。新 bash shell 已在环境中创建了 3 个其他变量。在 ksh 示例中,我们有 5 个环境变量,但我们尝试回送 SHELL 变量值时,获得了输出 /bin/sh。一些更早的 ksh 版本仅提供一个空白行来表明 SHELL 变量未设置。最后,tcsh 未创建任何环境变量,并在我们尝试引用 SHELL 的值时生成了一个错误。

取消设置和设置

清单 11显示了 shell 处理变量和环境的不同行为。尽管本教程重点介绍的是 bash,但也有必要知道不是所有 shell 都具有相同的行为。此外,shell 将根据它是否是 登录 shell来采取不同行为。就目前而言,我们仅假设登录 shell 是您登录到系统时获得的 shell;如果愿意,您还可以启动其他 shell 来充当登录 shell。上面使用 env -i启动的 3 个 shell 都不是登录 shell。尝试将 -l选项传递给 shell 命令本身,看看您使用登录 shell 会获得哪些区别。

让我们尝试在这些非登录 shell 中显示 SHELL 变量的值:

  1. 当 bash 启动时,它会设置 SHELL 变量,但不会自动将其导出到环境中。
  2. 当 ksh 启动时,它会将其 SHELL 变量的视图设置为 /bin/sh。相较而言,在之前的示例中,ksh 继承了从调用 bash shell 导出的 /bin/bash 值。
  3. 当 tcsh 启动时,没有设置 SHELL 变量。在这种情况下,默认行为与 ksh(和 bash)不同,因为在我们尝试使用一个不存在的变量时报告了错误。

可以使用 unset命令取消设置变量,并从 shell 变量列表中删除它。如果变量已导出到环境中,此命令还会从环境中删除它。可以使用 set命令控制 bash(或其他 shell)的工作方式的许多方面。Set 是一个 shell 内置命令,所以各种选项都是特定于 shell 的。在 bash 中,-u选项导致 bash 报告变量未定义的错误,而不是将它们视为已定义但是空的。可以使用 -打开 set的各种选项,使用 +关闭它们。可以使用 echo $-显示当前设置的选项。

[ian@atticf20 ~]$ echo $-
himBH
[ian@atticf20 ~]$ echo $VAR1

[ian@atticf20 ~]$ set -u;echo $-
himuBH
[ian@atticf20 ~]$ echo $VAR1
bash: VAR1: unbound variable
[ian@atticf20 ~]$ VAR1=v1;echo $VAR1
v1
[ian@atticf20 ~]$ unset VAR1;echo $VAR1
bash: VAR1: unbound variable
[ian@atticf20 ~]$ set +u;echo $VAR1;echo $-

himBH

如果使用没有任何选项的 set命令,它会显示所有 shell 变量和它们的值(如果有)。还有另一个 declare命令,可用于创建、导出和显示 shell 变量的值。可以使用手册页了解许多剩余的 set选项和 declare命令。本教程后面部分将讨论 手册页

Exec

最后一个要介绍的命令是 exec。可使用 exec命令运行另一个程序来 取代当前 shell。清单 13启动了一个子 bash shell,然后使用 exec将它替换为一个 Korn shell。从 Korn shell 退出时,会返回到原始 bash shell(在本例中为 PID 2852)。

使用 exec
[ian@atticf20 ~]$ echo $$
3175
[ian@atticf20 ~]$ bash
[ian@atticf20 ~]$ echo $$
4994
[ian@atticf20 ~]$ exec ksh
$ echo $$
4994
$ exit
[ian@atticf20 ~]$ echo $$
3175

Linux 基础知识:学习容器之前的必备知识

为了获得部署、管理和维护现代云技术所需的技能,您需要了解大量有关当前主题的必备信息:Linux® 命令和概念。由于许多现代云技术都以 GNU/Linux 操作系统为核心,因此本教程将带您逐步了解 Linux 命令行界面 (CLI) 的一些基础知识,让您准备好使用 CLI。如果您是 Linux 新手,那么本教程可以为您提供简单的用法介绍。对于已经入门的用户,我希望本教程能使您想到一些命令概念,或许能向您介绍一些新知识。

文件和目录

我们首先专门介绍标准 GNU/Linux 操作系统的基本文件结构。标准 GNU/Linux 操作系统具有一种文件管理层次结构,用于组织计算机上存储的数据。确定特定数据的存储位置是开始了解操作系统的结构方式的初步课程之一。为了避免低估您现有的 Linux 体验,我暂时不讨论“Linux 文件系统层次结构简介”。更好的是,这里有一篇详实的文章,其中详细地介绍了文件系统层次结构。这里,我们假设您知道学习方法,所以我将向您提供一些有关如何轻松浏览的提示(或者可能是一些提醒)。当您需要编辑文件,浏览文件系统,进行更改或观察配置时,您将需要此技能。

使用 cd 更改目录

cd 命令用于在终端 shell中从当前目录更改为所需目录。浏览 GNU/Linux 文件系统的目录结构时,会频繁用到此命令。语法如下所示:

$ cd [directory]

显示更多

[directory] 参数是指您想要更改到的所需目录或目标目录,并且可以通过多种方式提供通过文件系统层次结构到达该目录的路径

  1. 绝对路径
  2. 相对路径
  3. 波浪号扩展
  4. 特殊索引节点

绝对路径

绝对路径是从根目录(通常用 / 表示)到文件系统层次结构中存在的目标目录或目标文件的“完整路径”。 下面的简明示例展示了绝对路径:

如果用户名是 jsmith,那么在标准 GNU/Linux 操作系统上,到其主目录的绝对路径将为:

/home/jsmith

简明提示:在标准 GNU/Linux 操作系统上,您可以通过在命令提示符下键入 cd 进入主目录,不必指定目标目录。

在上面提供的示例中,到目标目录的路径都相当短,但是在很多情况下,到目录的路径可能很长。在本文中,我们将使用如下所示的文件系统层次结构:

采用这种目录结构,到 pacific_rose 文件的绝对路径将如下所示:

/home/jsmith/grocery_store/foods/produce/fruits/apples/pacific_rose

相对路径

GNU/Linux 操作系统的真正强大之处在于其命令行界面 (CLI)。在 Linux 上执行任务常常会使用可输入命令的 CLI。每次需要时在命令行中键入完整路径会很麻烦,这时,相对路径便为我们提供了一些支持。

相对路径定义为目标目录(或文件)相对于当前工作目录的路径。我们再次使用上面的例子。如果当前工作目录为 /home/jsmith/grocery_store/foods/produce/ 目录,那么进入 fruits 目录便很简单了:

$ cd fruits

由于当前工作目录包含 fruits 子目录,因此上述命令有效,因为它使用相对路径。只要未在 cd 命令旁边指定绝对路径,您就几乎可以将其描述为操作系统做出的“假设”。现在您已经导航到 fruits 目录,所以可以使用 pwd 命令查看此目录的完整路径:

$ pwd
/home/jsmith/grocery_store/foods/produce/fruits

pwd(或打印工作目录)命令对于查看当前工作目录非常方便(通常以绝对路径格式显示)。此命令显示了如何使用绝对路径和相对路径浏览文件系统层次结构。

波浪号扩展

为了让更方便地浏览文件层次结构(特别是在用户的主目录下创建的文件层次结构),包含 Bash Shell 的标准 GNU/Linux 操作系统为我们提供了波浪号扩展,也可以帮助我们。为了说明波浪号扩展的含义,我们来看看下面的示例:

$ cd ~

以上命令中的波浪号 ~ 字符映射到 $HOME 环境变量的值,此值通常设置为当前用户的主目录。这意味着该变量的值将根据当前登录的用户而更改。在同一系统上,对于 Jane Smith,cd ~ 命令会进入 /home/jsmith 目录,而对于 Mark Jones(以用户名 mjones 登录),同样的命令会进入 /home/mjones目录。

下面是一些使用波浪号扩展的示例:

  • ~ – 映射到 $HOME 目录
  • ~/grocery_store – $HOME 目录中存在的 grocery_store 子目录
  • ~mjones/grocery_store – mjones 用户的 $HOME 目录中专门存在的 grocery_store 子目录

特殊索引节点

为了深入探讨,我们简单谈谈索引节点。按照 Ian D. Allen 的定义:“在 Unix 上,组成目录或文件内容的数据集合不以某个名称存储;数据存储为称为数据结构的一部分,也称为索引节点。”简而言之,目录和文件是映射到索引节点编号的名称,并且有许多“特殊索引节点”可用于浏览文件系统层次结构。为了说明,请看下面的示例:

..(双点)索引节点可用于更改到文件系统层次结构中的父目录(上移一层):

$ cd ..

您还可以通过将 ..(双点)索引节点连接在一起,从而在文件系统层次结构中上移多层:

$ pwd
/home/jsmith/grocery_store/foods/produce/fruits
$ cd ../../
$ pwd
/home/jsmith/grocery_store/foods
$

在这里,我们将文件系统层次结构从 fruits 目录上移到 foods 目录(上移两层)。

-(短横线)可用于切换到上一个工作目录:

$ cd -

如果您需要从一个目录浏览到另一个目录然后再返回,那么无论当前在文件系统层次结构中的哪个位置,都可以使用 -(短横线)返回到上一个工作目录。

使用 pushd/popd 更改目录

这为我们提供了 Linux 用户可用来浏览文件系统层次结构的另一种方法:pushdpopd 和 dirs 命令。这三个 shell 内置命令允许您操作目录堆栈,也就是最近访问过的目录的列表。用于存储最近访问过的目录列表的数据结构实际上是堆栈或 LIFO(后进先出)数据结构。pushd 可将当前目录更改为目标目录,并将这个新目录添加到堆栈中,而 popd 会删除堆栈顶部列出的目录,然后将目录更改为堆栈顶部的目录。

根据我的个人经验,pushd 和 popd 命令是我在自动化脚本中最常用的命令,这是一种创建所访问目录的“面包屑痕迹”的方式。当自动化任务要求您以特定方式或特定顺序更改文件(和目录)时,使用此列表将有所帮助。先前访问过的目录可以从堆栈中剥离并且可以轻松地重新访问。

dirs 命令是我最近偶尔使用的命令,但这个命令也很好用。此命令可用于查看目录堆栈自身,以查看最近访问过的目录的列表。此命令还有一些选项,可用于根据需要来管理堆栈。下面是 pushdpopd 和 dirs 命令用法的示例:

从 /home/jsmith/grocery_store/foods/ 开始,我们将使用 pushd 来切换到 produce 目录:

$ pushd produce

当前目录现在是 /home/jsmith/grocery_store/foods/produce 目录,由于我们已经使用了 pushd 来切换到此目录,所以这个目录已经被添加到目录堆栈中,如 dirs 命令所示:

$ dirs
/home/jsmith/grocery_store/foods/produce /home/jsmith/grocery_store/foods
$

注意,目录的列表(从左到右)是按照最近访问的时间列出的。我们将再次使用 pushd 来进入 meats 目录,然后再次查看目录堆栈:

$ pushd /home/jsmith/grocery_store/foods/meats
$ dirs
/home/jsmith/grocery_store/foods/meats /home/jsmith/grocery_store/foods/produce /home/jsmith/grocery_store/foods
$

目录列表现在已经增长为 3 个最近访问过的目录。现在,如果我们使用 popd命令,则将删除堆栈顶部列出的目录,并将当前目录更改回 /home/jsmith/grocery_store/foods/produce,因为它现在是目录堆栈顶部列出的目录:

$ popd
$ pwd
/home/jsmith/grocery_store/foods/produce

再看一下目录堆栈,我们会发现,该列表又回到了最近访问的两个目录:

$ dirs
/home/jsmith/grocery_store/foods/produce /home/jsmith/grocery_store/foods
$

在接下来的文章和教程中,轻松地浏览目录结构肯定是不可或缺的方便技能,希望这篇关于浏览文件系统层次结构的简要介绍已经足够吸引您深入研究。

创建目录

我们已经讨论了目录浏览,现在让我们快速地介绍目录创建,可以通过 mkdir命令来创建目录:

$ mkdir [target]

在这一示例中,[target] 是您希望创建的目录的名称。执行后,mkdir 将在当前工作目录中创建此目录(因为未指定完整路径)。您还可以在文件系统层次结构的任何级别创建新目录,只要可以确定完整路径,并且您的用户帐户具有执行此操作的权限。例如:

$ mkdir /home/jsmith/grocery_store/foods/produce/veggies

这将在 home/jsmith/grocery_store/foods/produce 目录中创建 veggies 目录。通常,您可能需要在文件系统层次结构中的同一级别上创建多个目录,在某些情况下,甚至需要创建全新的目录结构。此时,-p 命令选项就很有用了。下面是一个更高级的示例:

$ mkdir -p /home/jsmith/grocery_store/foods/meats/{beef,fish,chicken,pork/{bacon,sausage}}

在此示例中,有几个概念在起作用。首先,-p 选项允许我们创建指定的“路径”,无论此路径中的目录先前是否已创建。使用括号,可以同时创建多个目录。这里,我们已经在 meats 目录中(并非先前创建的目录)创建了 beeffishchicken 和 pork 子目录。此外,我们还继续在 pork 目录下创建了两个子目录:bacon 和 sausage 子目录。 这样,您可以轻松地看到起作用的命令行的强大功能,只需一个命令即可创建全新的目录结构。

有关 mkdir 命令的更多信息,请参阅这篇有关如何使用 mkdir 创建目录的 lifewire 文章

查看文件和目录

我们讨论了如何在标准 GNU/Linux 操作系统上浏览和创建目录。现在,我们将讨论如何列出目录、查看文件和编辑文件。除了基于 GUI 的应用程序之外,还有几种直接从 CLI 查看文件和目录的方法。

使用 ls 查看目录内容

可以采用多种方法来使用 ls 命令查看目录内容。命令提示符下的简单 ls 以水平方式显示当前工作目录的内容:

$ ls

还有几个常用的命令选项。例如,向命令中添加一个 -l 标志以显示目标目录的内容,包括文件/目录名称、权限、所有者、修改日期和文件/目录大小:

$ ls -l

-a 选项可显示目录的内容,包括隐藏文件,隐藏文件是指主要用于桌面的自定义和个性化以及用于应用程序配置的文件:

$ ls -a

ls 的不常用命令选项

我们目前介绍的 ls 命令选项都是广泛采用的选项。然而,还有一些选项也很好用。下面是这些命名的简要列表:

ls 命令描述
ls -lh通过将 -l 与 -h 组合,以“人类可读”格式来显示文件/目录大小。
ls -F向输出中列出的子目录中附加 /
ls -R以递归方式列出子目录的内容
ls -r以相反的顺序显示输出
ls -lS显示按文件大小排序的输出,最先显示最大的文件
ls -ltr将 -l-t 和 -r 选项组合可显示按修改日期排序的输出,最新的文件最后显示

使用 cat 查看文件

要查看文件内容,最简单的命令之一是 cat 命令。cat 是“concatenate(拼接)”的缩写,不仅用于查看文件的内容,还用于通过重定向输出来创建文件:

$ cat pacific_rose
This is a test file.
$

在这里,pacific_rose 文件包含文本“This is a test file.”cat 直接在终端窗口中显示此文件的内容,这是查看所包含内容的快速、简便方法。

重定向运算符组合后,您也可以使用 cat 来创建文件:

$ cat > granny_smith

以上命令将在当前工作目录中创建一个名为 granny_smith 的新文件。

$ cat apple1.txt apple2.txt apple3.txt > three_apples.txt

如前所述,cat 是“concatenate(拼接)”的缩写,上面的示例说明了如何使用 > 重定向运算符将多个文件的内容组合成一个文件。

下面列出的命令标志(或选项)也可以方便地与 cat 命令一起使用:

  • cat -n 将在文件输出旁边显示行号。
  • cat -e 将在文件输出中显示行结尾和行空白,通常以 $ 字符表示。
  • cat -T 将在文件输出中显示以制表符分隔的行。

有关如何使用 cat 命令的更多提示,请查看这篇有关 cat 命令的 LINFO 文章

使用 more/less 查看文件

要在终端中直接查看文件,另外两种方法是使用 more 和 less 命令。more 和 less 都允许您查看文件的内容,在文件内容填满屏幕缓冲区时暂停文件输出。您可以选择在此时暂停,或按任意键继续查看剩余的输出。但是,less命令略有不同。虽然在查看文件方面,less 命令与 more 命令功能相同,但使用 less,您还可以在输出中后退,而 more 命令只允许向前查看输出。

终端文本编辑器 (vim/emacs/pico)

在实践中学习时,学习 Linux 通常需要您进行更改,以便创建配置文件、更新配置文件和/或从配置文件中删除信息。这些操作都可以通过使用大多数 Linux 操作系统上提供的文本编辑器来完成。这些文本编辑器包括:

  • vi/vim
  • emacs
  • pico

每个编辑器都有自己的优点、缺点和特色。下面是一个简短的资源列表,并非吹嘘这个编辑器比另一个编辑器更强大,而是为您提供每个编辑器的提示/技巧:

vi/vim:

emacs

pico

文件权限

作为 Linux 用户,我们可以精细地控制您作为用户可以对 Linux 操作系统上存储的文件执行的操作。在许多情况下,应该为文件和目录设置一定级别的权限才能让文件和目录生效,例如,让某个脚本变为可执行。我们简要介绍一下文件权限。

$ ls -l
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 brisket.txt
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 ground.txt
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 ribs.txt
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 tar_tar.txt

在此示例目录列表中,文件权限由 -rw-r--r-- 数据表示,将为目录中包含的每个文件提供此数据。在文件和目录上为 3 个帐户角色设置了权限:用户、组和其他(即其他所有人)。可以授予的权限为读 (r)、写 (w) 和执行 (x)。为了说明这一点,我们看看下表,其描述了对每个文件应用权限的方式(根据访问文件的帐户和组):

如果我们从左到右阅读 brisket.txt 文件的文件权限(并且忽略第一个 - 字符),那么文件权限如下所示:

用户其他
rw (读写)r (读)r (读)

对文件或目录的完全访问权限将表示为 rwx。在此示例中,用户 jdoe 具有读写权限,staff 组具有读权限,所有其他用户均具有读权限。为了理解 UGO(用户、组、其他)的概念,我建议您通读浅析 Linux 文件权限一文以进行更深入了解。

使用 chmod 更改权限

在某些情况下,需要修改应用于文件的权限。这时候,chmod 命令就派上用场了。如上所述,可以通过更改权限使 bash 脚本可执行(即,可以通过在命令行上调用脚本自身来“运行”):

$ ls -l script_to_run.sh
-rw-r--r--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh
$ chmod u+x script_to_run.sh
$ ls -l script_to_run.sh
-rwxr--r--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh

在以上示例中,script_to_run.sh 现在已经为用户添加了 +x 属性。 这意味着脚本现在可以由用户 jdoe 执行。

$ chmod ug+x script_to_run.sh
$ ls -l script_to_run.sh
-rwxr-xr--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh

以上示例将 u(用户)和 g(组)与 chmod 命令一起使用,说明了您还可以如何将帐户角色合并到一起来并行修改文件权限。+ 字符添加可执行属性,相比之下,- 字符可删除此属性:

$ ls -l script_to_run.sh
-rwxr-xr--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh
$ chmod ug-x script_to_run.sh # note the - character here
$ ls -l script_to_run.sh
-rw-r--r--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh

如您所见,chmod 是一个非常好用的命令,可用于根据需要微调文件权限。

基本的 Docker 命令

我们讨论了许多命令行示例,这些示例可以让您快速入门,让您在使用标准 GNU/Linux 操作系统时轻松浏览文件系统、查看和创建文件和目录以及自定义终端 shell。但是,由于本教程是作为深入研究更高级的 Docker、Kubernetes 和 Istio 教程和 Code Pattern 的入门材料,因此,我们简要列出一些 Docker 命令以帮助您入门:

构建 Docker 镜像

命令描述
docker images列出本地存储的镜像
docker rmi [IMG]从本地镜像存储库中删除 [IMG] 镜像
docker build -t [TAG] .通过当前工作目录中的 Dockerfile 构建一个 Docker 镜像,并将其标记为 [TAG]

运行 Docker 镜像

命令描述
docker run --name [CNT]运行一个容器并将其命名为 [CNT]
docker run -it附加到容器的终端会话
docker rm -f $(docker ps -aq)删除所有容器
docker ps列出正在运行的容器

发放 Docker 镜像

命令描述
docker pull从容器注册表中拉取镜像
docker push [IMG]将名为 [IMG] 的镜像推送到注册表

基本的 Kubernetes 命令

我们已经介绍了一些基本的 Docker 命令,我们再看几个对您有所帮助的好用 Kubernetes 命令。Kubernetes 采用 kubectl,这是一个针对 Kubernetes 集群运行命令的命令行界面工具。在下面,您将找到一些常用命令的简短列表,这些命令用于从 Kubernetes 部署中更新和/或提取数据:

列出 Kubernetes 资源

命令描述
kubectl get services列出当前名称空间中的所有 Kubernetes 服务
kubectl get pods --all-namespaces列出所有名称空间中的所有 Pod
kubectl get pods -o wide从当前名称空间生成更详细的 Pod 输出
kubectl describe nodes [node-name]显示节点 [node-name] 的简要描述
kubectl describe pods [pod-name]显示 Pod [pod-name] 的简要描述

操作 Kubernetes 资源

命令描述
kubectl create deployment foo --image=foo部署 foo 的单个实例
kubectl create -f ./local-manifest.yaml通过名为 local-manifest.yaml 的 Kubernetes 清单文件创建资源
kubectl delete -f ./bar.json删除名为 bar.json 的文件中定义的 Pod
kubectl delete pod,service silver gold删除名称为 silver 和 gold 所有 Pod 和服务

有关 kubectl 命令的完整列表,请参阅:https://kubernetes.io/docs/reference/kubectl/cheatsheet/

结束语

本教程旨在作为命令行预热,随着您继续学习诸如 DockerKubernetes 和 Istio 等容器技术,实现自我突破。在学习新技能之前,重温基础知识可能更有意义,我希望本教程中介绍的主题可以帮助您复习已掌握的知识或学习新知识。

后续步骤

完成本教程后,请务必查看 Kubernetes 学习路径中的后续步骤。如果您喜欢使用容器,还可以查看以下资源和 Code Pattern。

linux学习路线图

一、系统架构
1、确定和配置硬件设置
2、引导系统
3、运行级别、关闭和重新引导

二、Linux安装和包管理
1、设计硬盘布局
2、安装引导管理器
3、管理共享库
4、Debian包管理
5、RPM和YUM包管理功能

三、GNU和UNIX命令
1、Linux命令行
2、文本流和过滤器
3、文件和目录管理
4、流、管道和重定向
5、创建、监视和结束进程
6、处理进程执行优先级
7、使用正则表达式搜索文本文件
8、使用vi编辑文件

四、设备、Linux文件系统、文件系统分层结构标准
1、创建分区和文件系统
2、维护文件系统的完整性
3、控制文件系统的挂载和卸载
4、管理磁盘配额
5、管理文件权限和所有权
6、创建和更改硬链接和符号链接
7、查找和放置系统文件

五、Shell、脚本和数据管理
1、自定义和使用shell环境
2、自定义或编写简单脚本
3、SQL数据管理

六、用户界面和桌面
1、安装和配置X11
2、设置显示管理器
3、可访问性

七、管理任务
1、管理用户和组账户和相关系统文件
2、通过调度作业来自动化系统管理任务
3、本地化和国际化

八、基本系统服务
1、维护系统时间
2、系统日志
3、邮件传输代理(MTA)基础知识
4、管理打印机和打印

九、网络基础
1、Internet协议基础
2、基本网络配置
3、基本网络故障诊断
4、配置客户端DNS

十、安全性
1、执行安全性管理任务
2、设置主机安全
3、通过加密保护数据

redhat6.5使用ntfs格式U盘的方法

linux系统对于fat32一般默认就可以识别使用,但是对于ntfs需要安装ntfs-3g来使用。

如果配置好yum,则通过命令yum install ntfs-3g即可。

如果没有配置yum,需要先安装gcc,再安装ntfs-3g。

安装gcc可以参见这篇文章:https://www.eumz.com/2020-08/1958.html

安装好gcc后,下载ntfs-3g,可以通过这个链接下载:https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz

将安装包上传到/opt目录,解压tar -zxvf ntfs-3g_ntfsprogs-2017.3.23.tgz

进入到解压缩的目录下:
#cd ntfs-3g_ntfsprogs-2017.3.23
# ./configure
#make
#make install

插入ntfs格式U盘,fdisk -l查看,比如是/dev/sdb1
#mkdir /ntfs
#mount -t ntfs-3g /dev/sdb1 /ntfs

配置完成。