提前知识

常见文件压缩及解压

tar

1
tar [-cxtzjvfpPN] 文件与目录 ....

参数:

  • 压缩与解压(以下三个仅能存在一个,不能同时存在)
    • -c :建立一个压缩文件的参数指令(create)
    • -x :解开一个压缩文件的参数指令
    • -t :查看 tarfile 里面的文件
  • 压缩与解压类型
    • -z :是否同时具有 gzip 的属性?即是否需要用 gzip 压缩?(.tar.gz、.tgz)
    • -j :是否同时具有 bzip2 的属性?即是否需要用 bzip2 压缩?(.tar.bz2、.tar.bz)
  • -v :压缩的过程中显示文件
  • -f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数
  • -p :使用原文件的原来属性(属性不会依据使用者而变)
  • -P :可以使用绝对路径来压缩
  • -N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中
  • –exclude FILE:在压缩的过程中,不要将 FILE 打包

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩
# 特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。
# 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file
# 如果加 j 参数,则以 .tar.bz2 来作为附档名
# 上述指令在执行的时候,会显示一个警告讯息:
# 『tar: Removing leading `/' from member names』那是关于绝对路径的特殊设定。

范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
# 由于使用 gzip 压缩,所以要查阅该 tar file 内的文件时,
# 就要加上 z 这个参数

范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
# 在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,
# 我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,
# 则解开的目录会在 /usr/local/src/etc ,另外,如果您进入 /usr/local/src/etc
# 则会发现,该目录下的文件属性与 /etc/ 可能会有所不同

范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
# 我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件,
# 就可以透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了!

范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限!
[root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc
# 这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时!

范例六:在 /home 当中,比 2005/06/01 新的文件才备份
[root@linux ~]# tar -N '2005/06/01' -zcvf home.tar.gz /home

范例七:我要备份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -cvf - /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
# 要注意的地方在于输出档变成 - 而输入档也变成 - ,又有一个 | 存在
# 这分别代表 standard output, standard input 与管道命令

其他常用类型

.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName

.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName

.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName

.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName

.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName

.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName

.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName

.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知

.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知

.Z
解压:uncompress FileName.Z
压缩:compress FileName

.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName

.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName

.rpm
解包:rpm2cpio FileName.rpm | cpio -div

.deb
解包:ar p FileName.deb data.tar.gz | tar zxf -

gzip 命令

语法:gzip [选项] 压缩(解压缩)的文件名

  • -c 将输出写到标准输出上,并保留原有文件
  • -d 将压缩文件解压
  • -l 对每个压缩文件,显示下列字段
    • 压缩文件的大小
    • 未压缩文件的大小
    • 压缩比
    • 未压缩文件的名字
  • -r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩
  • -t 测试,检查压缩文件是否完整
  • -v 对每一个压缩和解压的文件,显示文件名和压缩比
  • -num 用指定的数字 num 调整压缩的速度,-1 或 --fast 表示最快压缩方法(低压缩比),-9 或–best表示最慢压缩方法(高压缩比)。系统缺省值为 6

Linux上常见服务搭建

Ubuntu用户管理

创建用户

useradd

user add (user)

只是创建一个用户名,命令如下:

1
sudo useradd username

并没有在/home目录下创建同名文件夹,也没有创建密码,因此利用这个用户登录系统,是登录不了的,为了避免这样的情况出现,可以添加-m参数创建:

1
sudo useradd username -m

它会在/home目录下创建同名文件夹,然后利用sudo passwd username为指定的用户名设置密码。

adduser

(system) add user

这个命令实际是一个perl脚本,是useradd等类似底层命令的更友好的前端,它会用交互性的方式建立新用户,使用它可以指定新用户的家目录,登录密码,是否加密主目录等等,它会:

  1. 建立一个新目录作为家目录
  2. 建立同名新组
  3. 把用户的主要组设为该组(除非命令选项覆盖以上默认动作,比如–disall-homdirecry之类)
  4. 从/etc/SKEL目录下拷贝文件到家目录,完成初始化
  5. 建立新用户的密码
  6. 如果其存在的话,还会执行一个脚本
1
sudo adduser username

删除用户

通过userdel命令即可:

1
sudo userdel -r username
  • -r:删除/home/路径下的用户文件夹

添加root权限

/etc/sudoers

该文件只能由root用户处理,其中包含了root权限的具体信息,具体可以参见linux /etc/sudoers 文件说明,其中信息有:

1
2
3
4
5
6
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
  • root用户具有root权限

    • root用户可以在任何可能出现的主机名的系统中,在任何用户任何组中执行任何命令

    • 文件格式

      1
      2
      3
      # useralias (用户名) hostalias (可以从哪些机器登陆) = (用户:用户组)"以什么用户,什么组" cmndalias "执行什么命令"
      useralias hostalias = (username:group) cmndalias
      %FOO ALL = (ALL) NOPASSWD:ALL,!/usr/sbin/
      • NOPASSWD:ALL:不用输入密码执行任何命令
      • %:表示用户组
      • !:表示禁止执行
  • admin组和sudo组中的用户均具有root权限

    • 查看当前用户组:

      1
      2
      3
      id username
      # 查看所有组及其用户
      cat /etc/group | grep username
    • 添加到root权限组:

      1
      2
      3
      # usermod -a  -G group -s /bin/bash username
      usermod -a -G sudo -s /bin/bash username
      usermod -a -G admin -s /bin/bash username
      • -G:修改用户组(注意需要包含用户已有的组,否则会从已有的组中退出,或者通过-a保留)
      • -a:append,加上之前的组

      或者:

      1
      2
      # 通过gpasswd来管理组
      gpasswd -a username sudo
      • -a:add
    • 从指定组中移除用户:

      1
      gpasswd -d username group
      • -d:del

/etc/sudoers.d/*

该文件夹下的内容和/etc/sudoers中的类似,通过如下方式可以添加root用户:

1
echo "username    ALL=(ALL) ALL" >> /etc/sudoers.d/username

TFTP服务

搭建步骤

tftp是Linux上常见的远程文件传输服务,其搭建方式如下(Ubuntu 18.04下实验成功):

  1. 搭建tftp服务器(tftp-server):

    1
    2
    sudo apt-get install tftp-hpa tftpd-hpa
    sudo apt-get install xinetd
  2. 创建tftp共享文件夹并赋予其权限:

    1
    2
    mkdir /tftpboot
    chmod 777 /tftpboot
  3. 配置tftp服务器:

    创建并打开/etc/xinetd.d/tftp文件,输入以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    service tftp
    {
    socket_type = dgram
    protocol = udp
    wait = yes
    user = root
    server = /usr/sbin/in.tftpd
    server_args = -s /tftpboot # tftp的共享文件夹
    disable = no
    per_source = 11
    cps = 100 2
    flags = IPv4
    }

    打开/etc/default/tftpd-hpa文件,将其修改为如下所示内容:

    1
    2
    3
    4
    5
    6
    # /etc/default/tftpd-hpa

    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/tftpboot" # tftp的共享文件夹
    TFTP_ADDRESS=":69"
    TFTP_OPTIONS="-l -c -s"
  4. 重启相关服务:

    1
    2
    sudo /etc/init.d/xinetd restart
    sudo service tftpd-hpa restart

验证方法

  1. 在共享目录下创建文件

    1
    echo "hello tftp service" >> /tftpboot/a.txt
  2. 进入本地tftp服务器

    1
    2
    3
    null@ubuntu:~$ tftp localhost
    tftp> get a.txt
    tftp> q
  3. 如果在当前目录下看到刚刚创建在/tftpboot下的文件,则表示搭建成功

NFS服务

  1. 安装服务:

    1
    sudo apt-get install nfs-kernel-server rpcbind
  2. 修改配置文件/etc/exports,填入以下内容:

    1
    2
    #nfs文件夹绝对路径 文件名(相关权限)
    /home/null/NFS_Share *(rw,sync,no_root_squash)
  3. 重启NFS服务:

    1
    sudo /etc/init.d/nfs-kernel-server restart

注意事项

在一些Linux驱动开发过程中,需要利用uboot通过nfs加载相关的文件或文件系统,但是往往会发生各种异常,其中低版本uboot和高版本deepin或者ubuntu搭配进行开发时尤其严重,根本原因是:

linux内核默认启动nfs,使用协议为2,即使在配置时,选择支持了更高级别的版本,但是未修改默认使用版本,依然会默认使用协议为2。而高版本的deepin或者ubuntu17之后nfs就默认支持3和4,因此需要deepin或者ubuntu支持协议2,或者内核启动nfs挂载,默认使用3以及以上版本挂载nfs。

方法如下:

  1. 修改ubuntu配置文件/etc/default/nfs-kernel-server,在配置文件尾部加上:RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog",使nfs支持协议2。之后重启NFS服务即可

    1
    2
    #重启nfs服务
    sudo /etc/init.d/nfs-kernel-server restart
  2. 修改Linux内核启动参数(内核支持更高等级的nfs协议),添加参数proto=tcp,nolock,nfsvers=3, ,如:

    1
    2
    3
    tftp 80800000 zImage

    console=ttymxc0,115200 root=/dev/nfs nfsvers=3 rw nfsroot=192.168.1.100:/home/null/NFS_Share ip=192.168.1.106:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off

注意:iptables用于设置,维护和检查Linux内核中IPv4包过滤规则的表,在意外情况下可以通过如下命令清除所有规则(如果有安装iptables):

1
sudo iptables -F

NodeJS安装

node、npm安装

  1. 官网下载nodejs安装包或执行以下命令获取安装包

    1
    wget https://npm.taobao.org/mirrors/node/v10.15.0/node-v10.15.0-linux-x64.tar.xz
  2. 解压

    1
    2
    3
    4
    xz -d node-v12.18.3-linux-x64.tar.xz
    tar -xvf node-v12.18.3-linux-x64.tar
    # 或者
    tar xvJf node-v12.18.3-linux-x64.tar.xz
  3. 安装

    1
    2
    ln -s /root/node-v10.15.0-linux-x64/bin/node /usr/local/bin/node
    ln -s /root/node-v10.15.0-linux-x64/bin/npm /usr/local/bin/npm
    • 在 bin 下创建 node、npm快捷方式,方便全局使用
  4. 测试

    1
    2
    3
    node -v
    npm -v
    node

离线安装npm包

去github下载对应的源码,然后通过以下步骤进行安装:

在能够联网的机器(ubuntu)上,执行以下步骤:

  1. 解压源码并进入

    1
    2
    tar -vxf L7-2.2.32.tar.gz
    cd L7-2.2.32
  2. 安装npm包

    1
    npm install --global-style
    • --global-style:表示将目前所处的npm包安装到./node_modules中一个单独的npmname文件夹中(可以方便地将npm包及其所有相关依赖都拷贝出来)

将上述整个文件夹拷贝出来,这里是L7-2.2.32文件夹,放到离线机器上,并执行以下命令安装:

1
2
cd L7-2.2.32
npm install ./node_modules/npmname/ -g