Iridescent-zhang

醉后不知天在水,满船清梦压星河

UbuntuNote

Linux is not Unix

重装双系统(Ubuntu)

彻底卸载Ubuntu

原因:重装windows系统,Ubuntu引导不见了,Ubuntu无法使用了。或者想重装Ubuntu,或者不再使用,腾出空间。

删除Ubuntu系统磁盘空间

如果在之前安装Ubuntu时选择的是下图选项:

则一般有三种创建分区的方式:

  1. 分为两个区(‘/‘、’/home’)、
  2. 分为四个区(‘swap’、’/‘、’/home’、’efi’)
  3. 分为五个区(‘swap’、’/‘、home’、’efi’、’/usr’)

我之前装的时侯分成了四个区即(‘swap’、’/‘、’/home’、’efi’),因此在电脑的磁盘管理可以看到这四个区,其中’efi’也即系统分区,很重要,之前的话里面有Ubuntu和Windows的启动项,不放在一起的话Ubuntu的启动项会自己放在另一个efi系统分区,后面再说。其它三个分区都可以直接删除,在磁盘管理处直接删除卷即可。

其实ubuntu的启动项应该还是会和windows的启动项放在一起都放在windows系统的EFI分区,ubuntu的EFI系统分区可以直接删除,详见这篇文章:
教你彻底卸载Ubuntu双系统

删除Ubuntu的系统启动项

键盘按住 Win + R,输入 diskpart 进入相应命令行,输入 list disk 查看所有磁盘,并输入 select disk 盘编号 选择的盘应该是Ubuntu的启动项所在的那个盘,我的情况是Windows和Ubuntu的启动项所在的efi系统分区,和系统盘(C盘)并不在同一个磁盘,很奇怪。输入 list partition 查看该磁盘所有分区,并select partition 分区编号选择“系统”分区(即该efi) ,输入 assign letter=字母 将其分配成一个独立磁盘(磁盘字母随意只要不和现有磁盘冲突即可,如assign letter T)。磁盘T不可访问,可以通过软件 Total Commander来删除Ubuntu系统启动项,也可以以管理员身份打开“记事本”,点击菜单栏“文件 -> 打开”,选择刚刚创建的磁盘T,打开其中文件夹“EFI”,并选择该目录下的“Ubuntu”文件夹右键删除,最后remove letter=磁盘字母删除创建的磁盘。

把引导菜单中原Ubuntu系统涉及的启动项删除,可以在软件easybcd里编辑引导菜单:

删除Ubuntu项,这样在电脑开机进入bios的时候就看不到Ubuntu了。

至此彻底删除Ubuntu。

可参考:
双系统如何删除一个系统
彻底卸载Ubuntu双系统
双系统下重装Ubuntu系统

安装Ubuntu

准备过程

下载Ubuntu镜像文件,我下载了最新的LTS版本,即Ubuntu 22.04.2 LTS,可以选择桌面版(Desktop)或服务器版(Server)。
下载Ubuntu桌面系统 | Ubuntu

之后使用Rufus制作启动盘,至少大于4G,注意:制作启动盘会格式化硬盘。注意不要选错U盘,分区类型务必选择GPT分区表,目标系统类型务必选择UEFI(非CSM),若你的BIOS只支持NTFS,要改成NTFS,不过一般都是支持FAT32的,先用FAT32,如果不行再回来改。

选择以iso镜像模式写入,进度条满之后即可。

压缩磁盘空间得到一个未分配的空间,推荐大小为:

  1. 只是玩一玩linux系统,则分配30GB
  2. 学习ROS,80GB以上
  3. 深度学习、机器学习,100GB以上
  4. 软件开发,50GB

联想电脑Y9000P进入BIOS是F2,不行的话就Fn+2(数字键盘的2也可以),F12可以选择以什么方式启动。

在BIOS中关闭安全启动(secure boot)和快速启动(fast boot),我只关了安全启动。

安装过程

插入U盘,进入BIOS设置从U盘启动或者直接F12选择从U盘启动,启动后进入Grub界面,类似这样:

我的是:

  1. Ubuntu
  2. Ubuntu高级选项
  3. Windows Boot manager
  4. something else

安装时都选择中文,不联网(没换源,下载的话会很慢),我选择了最小安装(简洁无敌)。一定要选择其他选项:

分区

这个过程十分关键

找到你刚刚压缩出来的空闲空间,根据大小判断,我的是260G左右。

选中空闲的空间,点击底下的➕建立分区,这次总共建立三个分区。

  1. EFI系统分区
    也即启动分区,系统将从这里加载启动,内核文件也放在这里,大小选择512MB。分区类型选择逻辑分区,空间起始位置,”用于”选择EFI系统分区,如下:
  1. 根目录
    这个越大也好,因为很多程序默认安装在根目录的opt文件夹下,新手不建议乱改安装位置。实际上剩余的全给根目录(‘/‘)也没关系,因为Linux文件系统采用的是”使用时分配”的策略。也就是说,你用了多少,就会给那个分区分配多少分区,没用的时候,剩下的空间就处于”待分配”的状态。这里分区类型选择主分区,”用于”选择Ext4日志文件系统,如下:
  1. /home目录
    这个是用户自己的空间,和Windows下的C盘以外的空间差不多,保存用户自己的数据,重装系统时这部分不会丢失,其余的空间都给/home。这里分区类型选择逻辑分区,空间起始位置,”用于”选择Ext4日志文件系统

这次安装Ubuntu没有分配Swap区(虚拟内存),因为现在大家内存都很大了,没有这个必要了,很多教程都比较老了,对现在的环境来说就是坑了。

可以发现存在两个EFI系统分区,我知道448MB里面存放了Windows系统的启动项,488MB应该就是刚刚为Ubuntu创建的EFI系统分区,里面有启动项。

ELSE

分区完后注意,在安装启动引导器的设备处,一定要选择刚刚为Ubuntu系统分配的EFI系统分区,还是根据大小判断(我们分配的大小会是511MB),别选成了Windows的EFI系统分区(因为我为Ubuntu重新分配了EFI系统分区,这次两个系统的启动项就不在同一个EFI系统分区里了)

确定选择正确后便可以安装。

设置密码图方便可以设置为空格(我就是这么做的),root密码我设为了123,进入root的命令是su root

拔掉U盘之后就可以重启了,重启后进入Grub界面,选择Ubuntu则启动Ubuntu,选择Windows Boot Manager则启动Windows。如果嫌每次都进Grub太麻烦可以在BIOS中调整顺序把Windows放到Ubuntu前面,则每次默认直接进Windows。

可参考:
Ubuntu/Windows双系统安装巨详细

学习Ubuntu

Linux系统目录结构

  • /bin:
    bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。

  • /boot:
    这里存放的是启动 Linux 时使用的一些核心文件,包括一些链接文件以及镜像文件。

  • /dev :
    dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

  • /etc:
    etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

  • /home:
    用户的主目录(lczhang),在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 eve。

  • /lib:
    lib 是 Library(库) 的缩写,这个目录里存放着系统最基本的动态链接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

  • /media:
    linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。

  • /mnt:
    系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。

  • /opt:
    opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如我安装一个谷歌就放到了这个目录下。默认是空的。

  • /proc:
    proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
    这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

  • /root:
    该目录为系统管理员,也称作超级权限者的用户主目录。

  • /sbin:
    s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

  • /sys:
    这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
    sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
    该文件系统是内核设备树的一个直观反映。
    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp:
    tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。

  • /var:
    var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

  • /run:
    是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

  • /usr:
    usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

  • /usr/bin:
    系统用户使用的应用程序。

  • /usr/sbin:
    超级用户使用的比较高级的管理程序和系统守护程序。

  • /usr/src:
    内核源代码默认的放置目录。


在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。
/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。
值得提出的是 /bin、/usr/bin 是给系统用户使用的指令(除 root 外的通用用户),而/sbin, /usr/sbin 则是给 root 使用的指令。
/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下。

在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。
文件系统的最顶层是由根目录开始的,系统使用 / 来表示根目录。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。
在Linux文件系统中有两个特殊的目录,一个用户所在的工作目录,也叫当前目录,可以使用一个点 . 来表示;另一个是当前目录的上一级目录,也叫父目录,可以使用两个点 .. 来表示。

  • . :代表当前的目录,也可以使用 ./ 来表示;
  • .. :代表上一层目录,也可以 ../ 来代表。

如果一个目录或文件名以一个点 . 开始,表示这个目录或文件是一个隐藏目录或文件(如:.bashrc)。即以默认方式查找时,不显示该目录或文件。

Linux 文件基本属性

Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。

为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。

在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:

chown (change owner) : 修改所属用户与组。
chmod (change mode) : 修改用户的权限。

在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如:

1
2
3
4
5
[root@www /]# ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
……

实例中,bin 文件的第一个属性用 d 表示。d 在 Linux 中代表该文件是一个目录文件。

在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。

当为 d 则是目录
当为 - 则是文件;
若是 l 则表示为链接文档(link file);
若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。

每个文件的属性由左边第一部分的 10 个字符来确定(如下图):

从左至右用 0-9 这些数字来表示。

第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。

第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
其中,第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限;

第 2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限。

Linux文件属主和属组

1
2
3
4
5
[root@www /]# ls -l
total 64
drwxr-xr-x 2 root root 4096 Feb 15 14:46 cron
drwxr-xr-x 3 mysql mysql 4096 Apr 21 2014 mysql
……

对于文件来说,它都有一个特定的所有者,也就是对该文件具有所有权的用户。

同时,在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。

文件所有者以外的用户又可以分为文件所属组主的同组用户和其他用户。

因此,Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。

在以上实例中,mysql 文件是一个目录文件,属主和属组都为 mysql,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。

对于 root 用户来说,一般情况下,文件的权限对其不起作用。

更改文件属性

chgrp:更改文件属组

语法:

1
chgrp [-R] 属组名 文件名

选项与参数:
-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。


chown:更改文件属主,也可以同时更改文件属组

语法:

1
2
chown [-R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
1
2
3
4
5
6
7
8
9
10
进入 /root 目录(~)将install.log的拥有者改为bin这个账号:
[root@www ~] cd ~
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r-- 1 bin users 68495 Jun 25 08:53 install.log

将install.log的拥有者与群组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log

Linux文件属性有两种设置方法,一种是数字,一种是符号。

Linux 文件的基本权限就有九个,分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限。

先复习一下刚刚上面提到的数据:文件的权限字符为: -rwxrwxrwx , 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照为:r:4,w:2,x:1。(其实就是二进制,有权限rwx就是1,没有权限-就是0)

chmod :变更文件权限

语法:

1
chmod [-R] xyz 文件或目录

选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,以及连同次目录下的所有文件都会变更

1
2
3
4
5
6
7
举例来说,如果要将 .bashrc 这个文件所有的权限都设定启用,那么命令如下:
[root@www ~]# ls -al .bashrc
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
那如果要将权限变成 -rwxr-xr-- 呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754

符号类型改变文件权限

还有一个改变权限的方法,从之前的介绍中我们可以发现,基本上就九个权限分别是:

user:用户
group:组
others:其他
那么我们就可以使用 u, g, o 来代表三种身份的权限。

此外, a 则代表 all,即全部的身份。读写的权限可以写成 r, w, x,也就是可以使用下表的方式来看:

如果我们需要将文件权限设置为 -rwxr-xr– ,可以使用 chmod u=rwx,g=rx,o=r 文件名 来设定。

1
2
3
4
5
6
#  touch test1    // 创建 test1 文件
# ls -al test1 // 查看 test1 默认权限
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1
# chmod u=rwx,g=rx,o=r test1 // 修改 test1 权限
# ls -al test1
-rwxr-xr-- 1 root root 0 Nov 15 10:32 test1

而如果是要将权限去掉而不改变其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:

1
2
3
#  chmod  a-x test1
# ls -al test1
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1

Linux 文件与目录管理

我们知道 Linux 的目录结构为树状结构,最顶级的目录为根目录 /。

其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。

我们需要先知道什么是绝对路径与相对路径:

  • 绝对路径:
    路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。

  • 相对路径:
    路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法。

处理目录的常用命令

接下来我们就来看几个常见的处理目录的命令吧:

ls(英文全拼:list files): 列出目录及文件名
cd(英文全拼:change directory):切换目录
pwd(英文全拼:print work directory):显示目前的目录
mkdir(英文全拼:make directory):创建一个新的目录
rmdir(英文全拼:remove directory):删除一个空的目录
cp(英文全拼:copy file): 复制文件或目录
rm(英文全拼:remove): 删除文件或目录
mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称

你可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp。


ls (列出目录)

语法:

1
2
3
4
[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称
[root@www ~]# ls [--color={never,auto,always}] 目录名称
[root@www ~]# ls [--full-time] 目录名称
[root@www ~]# ls -al ~ // 查看~目录下的所有文件,以列表形式给出,

选项与参数:
-a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-l :长数据串列出,包含文件的属性与权限等等数据;(常用)
-h: 将文件的大小以人类能看懂的形式表现出来,如kb,mb,本来默认以b(byte)为单位。


cd (切换目录)
cd是Change Directory的缩写,这是用来变换工作目录的命令。

语法:

1
cd [相对路径或绝对路径]

pwd (显示目前所在的目录)
pwd 是 Print Working Directory 的缩写,也就是显示目前所在目录的命令。

语法:

1
[root@www ~]# pwd [-P]

选项与参数:
-P :显示出确实的路径,而非使用链接 (link) 路径。

启动一个终端程序的时候默认是在HOME目录中打开,HOME目录就是用户的主目录,也就是/home/“用户名”,我的就是在/home/lczhang,即HOME=/home/lczhang,特殊符号是~,cd不输入参数也会回到HOME这里。如果进入了root,~就代表/root这个目录,pwd也会打印/root,cd不输入参数回到/root。


mkdir (创建新目录)
如果想要创建新的目录的话,那么就使用mkdir (make directory)吧。

语法:

1
mkdir [-mp] 目录名称

选项与参数:
-m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~
-p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
实例:在/tmp底下尝试创建数个新目录:
[root@www ~]# cd /tmp
[root@www tmp]# mkdir test <==创建一名为 test 的新目录
[root@www tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4':
No such file or directory <== 没办法直接创建此目录啊!
[root@www tmp]# mkdir -p test1/test2/test3/test4
加了这个 -p 的选项,可以自行帮你创建多层目录!

实例:创建权限为 rwx--x--x 的目录。
[root@www tmp]# mkdir -m 711 test2 // 这里我们使用 -m 711 来给予新的目录 drwx--x--x 的权限。
[root@www tmp]# ls -l
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
上面的权限部分,如果没有加上 -m 来强制配置属性,系统会使用默认属性。

cp (复制文件或目录)
cp 即拷贝文件和目录。

语法:

1
2
[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)
[root@www ~]# cp [options] source1 source2 source3 .... directory

选项与参数:
-a:相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
-d:若来源档为链接档的属性(link file),则复制链接档属性而非文件本身;
-f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
-i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l:进行硬式链接(hard link)的链接档创建,而非复制文件本身;
-p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);
-r:递归持续复制,用於目录的复制行为;(常用)
-s:复制成为符号链接档 (symbolic link),亦即『捷径』文件;
-u:若 destination 比 source 旧才升级 destination !

1
2
3
4
用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc
[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n <==n不覆盖,y为覆盖

rm (移除文件或目录)

语法:

1
rm [-fir] 文件或目录

选项与参数:
-f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!

1
2
3
4
将刚刚在 cp 的实例中创建的 bashrc 删除掉!
[root@www tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
如果加上 -i 的选项就会主动询问喔,避免你删除到错误的档名!

mv (移动文件与目录,或修改名称)

语法:

1
2
[root@www ~]# mv [-fiu] source destination
[root@www ~]# mv [options] source1 source2 source3 .... directory

选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会升级 (update)

1
2
3
4
5
6
7
8
9
复制一文件,创建一目录,将文件移动到目录中
[root@www ~]# cd /tmp
[root@www tmp]# cp ~/.bashrc bashrc
[root@www tmp]# mkdir mvtest
[root@www tmp]# mv bashrc mvtest
将某个文件移动到某个目录去,就是这样做!

将刚刚的目录名称更名为 mvtest2(这里是因为不存在mvtest2这个文件夹,不然就会将mvtest这个文件夹移动到mvtest2下面)
[root@www tmp]# mv mvtest mvtest2

Linux 文件内容查看

Linux系统中使用以下命令来查看文件的内容:

cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行

cat
由第一行开始显示文件内容

语法:

1
cat [-AbEnTv]

选项与参数:
-A :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字节 $ 显示出来;
-n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符

1
2
3
4
检看 /etc/issue 这个文件的内容:
[root@www ~]# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m

Linux 链接概念

Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。

硬连接

硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

软连接

另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
通过实验加深理解
[oracle@Linux]$ touch f1 #创建一个测试文件f1
[oracle@Linux]$ ln f1 f2 #创建f1的一个硬连接文件f2
[oracle@Linux]$ ln -s f1 f3 #创建f1的一个符号连接文件f3
[oracle@Linux]$ ls -li # -i参数显示文件的inode节点信息
total 0
9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx 1 oracle oinstall 2 Apr 21 08:11 f3 -> f1
从上面的结果中可以看出,硬连接文件 f2 与原文件 f1 的 inode 节点相同,均为 9797648,然而符号连接文件的 inode 节点不同。

[oracle@Linux]$ echo "I am f1 file" >>f1
[oracle@Linux]$ cat f1
I am f1 file
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
I am f1 file
[oracle@Linux]$ rm -f f1
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
cat: f3: No such file or directory
通过上面的测试可以看出:当删除原始文件 f1 后,硬连接 f2 不受影响,但是符号连接 f3 文件无效

总结

依此您可以做一些相关的测试,可以得到以下全部结论:

  1. 删除符号连接f3,对f1,f2无影响;
  2. 删除硬连接f2,对f1,f3也无影响;
  3. 删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
  4. 同时删除原文件f1,硬连接f2,整个文件会真正的被删除。

Linux 用户和用户组管理

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

每个用户账号都拥有一个唯一的用户名和各自的口令。

用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录

实现用户账号的管理,要完成的工作主要有如下几个方面:

  1. 用户账号的添加、删除与修改。
  2. 用户口令的管理。
  3. 用户组的管理。

Linux 磁盘管理

Linux 磁盘管理好坏直接关系到整个系统的性能问题。

Linux 磁盘管理常用三个命令为 df、du 和 fdisk

df(英文全称:disk free):列出文件系统的整体磁盘使用量
du(英文全称:disk used):检查磁盘空间使用量
fdisk:用于磁盘分区

Linux vi/vim

所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。

但是目前我们使用比较多的是 vim 编辑器

vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。

什么是vim

Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。

Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

简单的来说, vi 是老式的文字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。

vim 的官方网站 自己也说 vim 是一个程序开发工具而不是文字处理软件。

中文版

vi/vim 的使用

基本上 vi/vim 共分为三种模式,命令模式(Command Mode)、输入模式(Insert Mode)和命令行模式(Command-Line Mode)

命令模式

用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符,比如我们此时按下 i,并不会输入一个字符,i 被当作了一个命令。

以下是普通模式常用的几个命令:

i – 切换到输入模式,在光标当前位置开始输入文本。
x – 删除当前光标所在处的字符。
: – 切换到底线命令行模式,以在最底一行输入命令
a – 进入插入模式,在光标下一个位置开始输入文本。
o:在当前行的下方插入一个新行,并进入插入模式。
O – 在当前行的上方插入一个新行,并进入插入模式。
dd – 删除当前行。
yy – 复制当前行。
p(小写) – 粘贴剪贴板内容到光标下方。
P(大写)– 粘贴剪贴板内容到光标上方。
u撤销上一次操作
Ctrl + r重做上一次撤销的操作
:w保存文件
:q退出 Vim 编辑器
:wq保存并退出 Vim 编辑器
:q! – 强制退出Vim 编辑器,不保存修改。(有用的,有时候不想保存又懒得删了)

若想要编辑文本,只需要启动 Vim,进入了命令模式,按下 i 切换到输入模式即可。
命令模式只有一些最基本的命令,因此仍要依靠底线命令行模式输入更多命令

输入模式

在命令模式下按下 i 就进入了输入模式,使用 Esc 键可以返回到普通模式(命令模式)。

在输入模式中,可以使用以下按键:

字符按键以及Shift组合,输入字符
ENTER,回车键,换行
BACK SPACE,退格键,删除光标前一个字符
DEL,删除键,删除光标后一个字符
方向键,在文本中移动光标
HOME/END,移动光标到行首/行尾
Page Up/Page Down,上/下翻页
Insert(INS),切换光标为输入/替换模式,光标将变成竖线/下划线
ESC,退出输入模式,切换到命令模式

底线命令模式

在命令模式下按下 :(英文冒号)就进入了底线命令模式。

底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。

在底线命令模式中,基本的命令有(已经省略了冒号):

:w:保存文件。
:q:退出 Vim 编辑器。
:wq:保存文件并退出 Vim 编辑器。
:q!:强制退出Vim编辑器,不保存修改。
ESC 键可随时退出底线命令模式。

vi/vim 使用实例

你想要使用 vim 来建立一个名为 runoob.txt 的文件时,你可以这样做:
vim runoob.txt

直接输入 vim 文件名 就能够进入 vim 的一般模式了。请注意,记得 vim 后面一定要加文件名,不管该文件存在与否!

在一般模式之中,只要按下 i, o, a 等字符就可以进入输入模式(编辑模式)了!

在编辑模式当中,你可以发现在左下角状态栏中会出现 –INSERT- 的字样,那就是可以输入任意字符的提示。

这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。

在一般模式中按下 :wq 即可保存并退出 vim。

vi/vim 按键说明

特别注意,在 vi/vim 中,数字是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。

举例来说,要剪切 50 行,则是用 『50dd』 对吧! 数字加在动作之前,如我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。

另外要注意:这些都是在一般模式(命令模式)下操作的。

一般模式 (光标移动、复制粘贴、搜索替换)

光标移动

  • [Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
  • [Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
  • 0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
  • $(shift+4) 或功能键[End] 移动到这一行的最后面字符处(常用)
  • nG : n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
  • G 移动到这个档案的最后一行(常用)
  • gg 移动到这个档案的第一行,相当于 1G 啊! (常用)
  • n n 为数字。光标向下移动 n 行(常用)

删除、复制与粘贴

  • x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键,会删除当前光标覆盖的那个字符,因为ubuntu里光标是有宽度的), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键,要先按住shift再按x) (常用)
  • dd 剪切游标所在的那一整行(常用),用 p/P 可以粘贴。
  • d1G 删除光标所在到第一行的所有数据
  • dG 删除光标所在到最后一行的所有数据
  • d$ 删除游标所在处,到该行的最后一个字符
  • d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
  • yy 复制游标所在的那一行(常用)
  • nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
  • p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行(只推了第20行)。 (常用)
  • u 复原前一个动作(撤销)。(常用)
  • [Ctrl]+r 重做上一个动作。(常用)
    这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
  • . 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了!(对u、[Ctrl]+r无效,不记录这两个操作) (常用)

搜索替换

  • /word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird(输完按回车进入搜索模式。然后用n/N来找) 即可! (常用)
  • n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。
  • N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
    使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词!
  • :n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:
    『:100,200s/vbird/VBIRD/g』。(常用)
  • :1,$s/word1/word2/g 或 :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
  • :1,$s/word1/word2/gc 或 :%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)

一般模式切换到编辑模式的可用的按钮说明

进入输入或取代的编辑模式

  • i, I 进入输入模式(Insert mode):
    i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用)
  • a, A 进入输入模式(Insert mode):
    a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用)
  • o, O 进入输入模式(Insert mode):
    这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行!(常用)
  • r, R 进入取代模式(Replace mode):
    r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
  • [Esc] 退出编辑模式,回到一般模式中(常用)

上面这些按键中,在 vi 画面的左下角处会出现『–INSERT–』或『–REPLACE–』的字样。 由名称就知道该动作了吧!!特别注意的是,上面也提过了,你想要在档案里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔!

一般模式切换到命令行模式的可用的按钮说明

指令行的储存、离开等指令

  • :w 将编辑的数据写入硬盘档案中(常用)
  • :w! 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
  • :q 离开 vim (常用)
  • :q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
    注意一下啊,那个惊叹号 (!) 在 vim 当中,常常具有『强制』的意思~
  • :wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用) 虽说强制但也不一定能存上。
    vim 环境的变更
  • :set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
  • :set nonu 与 set nu 相反,为取消行号!

Extract

vim 中批量添加注释

方法一 :块选择模式

批量注释:

Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I 进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,按两下 ESC,Vim 会自动将你选中的所有行首都加上注释,保存退出完成注释。

取消注释:

Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号(选中注释符号,不要多选了),注意 // 要选中两个,选好之后按 d 即可删除注释,ESC 保存退出。

方法二: 替换命令

批量注释:

使用下面命令在指定的行首添加注释。
使用命令格式: :起始行号,结束行号s/^/注释符/g(注意冒号)。

取消注释:

使用命令格式: :起始行号,结束行号s/^注释符//g(注意冒号)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
实例:
1、在 10 - 20 行添加 // 注释
:10,20s#^#//#g

2、在 10 - 20 行删除 // 注释
:10,20s#^//##g

3、在 10 - 20 行添加 # 注释
:10,20s/^/#/g

4、在 10 - 20 行删除 # 注释
:10,20s/#//g

删除注释的时候好像都不需要\^符号,添加的时候需要\^。

注意事项

su与sudo su的区别

sudo = Super user do 超级用户do
su = Shift user 切换用户

  1. su
    su命令是当前用户用来切换到另一个用户的命令,参数为用户名。执行时会要求输入密码,这个密码是你要切换到的用户的密码。
    注意,当你是root用户时,切换到本机的其他任何用户都是不需要输入密码的。

  2. sudo su
    sudo su命令和su命令相似,都是用来切换用户的。区别就是两个命令需要输入的密码不一样。
    sudo su的含义就是要用root权限运行su命令,既然是用root权限运行su命令,那么就不需要输入切换到的用户的密码了。
    此外,sudo su命令不保留原来shell的环境变量。

本来你如果要从普通用户切换到root用户,你要使用命令:su root 或者 su - 此时你必须要输入root用户的密码,正如上边所讲。
但是如果你使用:sudo su 这个命令,直接输入当前用户的密码(也就是当前使用sudo命令的密码)即可切换到root用户。

要区分这两个密码:

  • sudo命令的密码:执行任何sudo开头的命令都要输的密码。
  • root用户的密码:su root即切换到root用户时要输的密码。也就是root用户本身的密码。

参考资料

Linux 教程