Linux 入门小教程(续)
在上一个小教程中,我们学习了目录的“增”、“删”、“改”、“查”和文件的“增”、“删”、“改”、“查”。
而最后我们通过 ls -al 命令看到了类似这样的一些东西。
$ ls -al
total 8
drwxr-xr-x 1 panyq panyq 4096 Feb  8 12:53 .
drwxr-xr-x 1 root  root  4096 Feb  8 12:46 ..
-rw------- 1 panyq panyq  128 Feb  8 12:53 .bash_history
-rw-r--r-- 1 panyq panyq  220 Feb  8 12:46 .bash_logout
-rw-r--r-- 1 panyq panyq 3771 Feb  8 12:46 .bashrc
drwxr-xr-x 1 panyq panyq 4096 Feb  8 12:46 .landscape
drwxr-xr-x 1 panyq panyq 4096 Feb  8 12:51 .local
-rw-r--r-- 1 panyq panyq    0 Feb  8 12:46 .motd_shown
-rw-r--r-- 1 panyq panyq  807 Feb  8 12:46 .profile
在输出结果中,除了第一行 total 8 以外,其余每一行都展现了当前目录下的一个文件或目录的详细信息。
以第 6 行为例,它可以被这样解读。
| 权限信息 | 连接数 | 所有者 | 所属组 | 大小(字节数) | 最后修改时间 | 名字 | 
|---|---|---|---|---|---|---|
| -rw-r--r-- | 1 | panyq | panyq | 3771 | Feb  8 12:46 | .bashrc | 
接下来简要介绍一下 Linux 的权限。
第一行的
total 8和第二列的连接数有点复杂,这里就不讲了。😜
文件的权限
让我们 touch 一个空文件,并用 ls -l 查看它的详细信息。
$ touch abc
$ ls -l abc  # 只列出 abc 文件的详细信息。
-rw-r--r-- 1 panyq panyq 0 Feb 11 10:23 abc
让我们把输出中的权限信息 -rw-r--r-- 放大一下。
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 
|---|---|---|---|---|---|---|---|---|---|
| - | r | w | - | r | - | - | r | - | - | 
第一个字符标识了该文件的类型(例如,普通文件是 -,目录是 d)。
第 2、3、4 个字符标识了所有者的权限,依次为读(read)、写(write)和执行(execute)。
第 5、6、7 个字符标识了所属组的权限。(顺序同上)
第 8、9、10 个字符标识了其他人的权限。
所以,把上面这串字符翻译成普通话就是:“这是一个普通文件,如果你是它的所有者,那么你可以读或写这个文件,但不能执行它。如果你不是它的所有者,那么这个文件对你来说是只读的。”
众所周知,Linux 是一个多用户的操作系统,所以为了保证每个用户的文件不会轻易地被别的用户修改,新建文件的默认权限就被设成了“只有所有者能读写,其他人只能读”了。
那么什么是执行权限呢?
在 Window 中,我们常常能碰到 .exe 结尾的可执行文件,它们通常是二进制的,可以被机器当作程序运行的文件。在 Linux 中也有这样的二进制地文件,但是为了安全起见,让机器运行这样的二进制文件也是需要权限的。
Linux 自带了许多可执行文件,比如位于 /usr/bin/ 目录下的 ls 文件。
$ ls /usr/bin/ls -l
-rwxr-xr-x 1 root root 142144 Sep  5  2019 /usr/bin/ls
$
是的没错,这个 ls 文件就是 ls 命令的可执行文件,当我们键入 ls 命令时,系统就会去找这个 ls 文件,执行它,并打印它的输出结果。
通过查看它的权限信息,我们了解到:对于所有的用户,这个 ls 文件都是可执行的。
目录的权限与普通文件的权限有所不同,鸟哥曾把目录比喻为抽屉,把“读”比喻为“查看抽屉外面贴的标签”,把“写”比喻为“处置抽屉里的东西”,把“执行”比喻为“打开抽屉”。详情 -> 点这儿
关于权限的内容先告一段落,现在让我们学学如何装软件。
软件安装
如同 Windows 10 有 Microsoft Store 一样,大部分 Linux 发行版都自带了像应用商店般的软件包管理程序。
我们所安装的发行版为 Ubuntu,它的“应用商店”叫 apt(Advanced Packaging Tools)。
apt 命令的用法十分简单,想要安装软件,只需键入 apt install <软件名字> 即可。
让我们来试试安装一个叫 tree 的软件。
$ apt install tree
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
$
报错了,我们可以从错误信息中的 Permission denied 得知我们没有相应的权限。
就如同在 Windows 中安装软件常常需要管理员身份一样,在调用 apt 安装软件时,也需要管理员权限。
在错误信息的最后,系统提示我们 are you root?,root 即为 Linux 中管理员账户的名字。
管理员也被称为 Superuser,在 Linux 中,我们可以用 sudo 命令(superuser do)临时获得管理员权限。
让我们再试一次,这次在命令的最前面加上 sudo。(过程中会要求输入密码,就是那个安装 WSL 时设置的密码啦。😉)
$ sudo apt install tree
[sudo] password for panyq:  # 在此输入密码
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package tree
$
嗯,虽然这回我们有管理员权限了,但是又报错了。原来,我们想要安装的软件都放在互联网上的软件仓库里,要想用 apt 安装软件,需要先让 apt 知道远程的软件仓库里有哪些软件,它才能帮我们安装,所以我们需要更新一下软件源。
更新软件源的命令是 apt update。(也需要管理员权限)
但如果就这样更新软件源,apt 就会去连接 Ubuntu 官方的服务器,这个服务器在国外,从上面下载软件的速度会很慢。
所幸,国内有许多的软件源镜像站,比如清华大学的 TUNA。
要想让 apt 去连接 TUNA 而不是国外的服务器,我们需要进行一些设置。(以下内容来自 TUNA 的教程)
首先,我们需要以管理员身份,编辑软件源配置文件。
$ sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak  # 备份下原始的配置文件。
$ sudo nano /etc/apt/sources.list  # 用 nano 编辑配置文件
然后把配置信息复制进去。(复制后用鼠标右键在黑框框内点一下即可粘贴)
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
保存退出后再用 sudo apt update 命令更新软件源。
$ sudo apt update
Get:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu focal InRelease [265 kB]
# 此处省略很多行……
Get:46 https://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-security/multiverse amd64 c-n-f Metadata [284 B]
Fetched 19.9 MB in 5s (3863 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
162 packages can be upgraded. Run 'apt list --upgradable' to see them.
$
这样,软件源就更新好了,现在用下面的命令安装 tree。
sudo apt install tree
回车后安装会自动进行,当命令提示符再次出现时,安装就完成了。
那么 tree 是个做什么用的软件呢?请看下面这个例子。
$ mkdir outer
$ mkdir outer/inner
$ touch outer/inner/a_file
$ tree outer
outer
└── inner
    └── a_file
1 directory, 1 file
$
对,tree 就是一个把文件和目录的结构以树形图的形式打印出来的小软件。
要卸载软件也很简单,只需
sudo apt remove <要卸载的软件名>即可。
但是,不是所有软件都能在 apt 的软件源里找到的,有些软件需要我们手动从网上下载下来。所以接下来以 BLAST+ 和 PLINK 为例,介绍一下如何下载和解压网上的软件压缩包。
下载压缩包
从网上(Web)获取(Get)压缩包,最简单的方法是使用 wget 命令,格式如下。
wget <下载链接>
让我们用它来试着下载 BLAST+ 和 PLINK。

下载完成后,用 ls 即可发现当前目录下多了两个文件。
$ ls
ncbi-blast-2.11.0+-x64-linux.tar.gz  plink_linux_x86_64_20201019.zip
一个以 .tar.gz 结尾,另一个以 .zip 结尾。这是两个不同格式的安装包,要用不同的命令进行解压。
首先是 ncbi-blast-2.11.0+-x64-linux.tar.gz,要用 tar 命令进行解压。
$ tar -xf ncbi-blast-2.11.0+-x64-linux.tar.gz
$ # 没有进度条。提示符再次出现时,解压就完成了。
这里,-x 表示我们要从一个压缩包中提取(extract)文件,-f 选项则告诉 tar 要解压的文件的路径是 ncbi-blast-2.11.0+-x64-linux.tar.gz。
注意,
-f选项必须紧跟压缩包的路径,即不能写成tar -fx ncbi-blast-2.11.0+-x64-linux.tar.gz(之间隔了个-x选项)。
解压完成后,当前目录下就会多出一个 ncbi-blast-2.11.0+ 目录,让我们用刚装的 tree 看看里头是啥。
$ tree ncbi-blast-2.11.0+
ncbi-blast-2.11.0+
├── ChangeLog
├── LICENSE
├── README
├── bin
│   ├── blast_formatter
│   ├── blastdb_aliastool
│   ├── blastdbcheck
│   ├── blastdbcmd
│   ├── blastn
│   ├── blastp
│   ├── blastx
│   ├── cleanup-blastdb-volumes.py
│   ├── convert2blastmask
│   ├── deltablast
│   ├── dustmasker
│   ├── get_species_taxids.sh
│   ├── legacy_blast.pl
│   ├── makeblastdb
│   ├── makembindex
│   ├── makeprofiledb
│   ├── psiblast
│   ├── rpsblast
│   ├── rpstblastn
│   ├── segmasker
│   ├── tblastn
│   ├── tblastx
│   ├── update_blastdb.pl
│   └── windowmasker
├── doc
│   └── README.txt
└── ncbi_package_info
2 directories, 29 files
$
嗯,可执行的二进制(Binary)文件都在其中的 bin 目录下了,我们我们只需输入这些软件的路径,即可调用这些软件。
$ ncbi-blast-2.11.0+/bin/blastn -h  # 用 -h 选项查看使用说明。
USAGE
  blastn [-h] [-help] [-import_search_strategy filename]
    [-export_search_strategy filename] [-task task_name] [-db database_name]
    [-dbsize num_letters] [-gilist filename] [-seqidlist filename]
# 此处省略很多行。
    [-sorthsps sort_hsps] [-max_target_seqs num_sequences]
    [-num_threads int_value] [-remote] [-version]
DESCRIPTION
   Nucleotide-Nucleotide BLAST 2.11.0+
Use '-help' to print detailed descriptions of command line arguments
$
BLAST+ 装好了,现在来看 PLINK。PLINK 的安装包是一个在 Windows 中常见的 .zip 格式的压缩包,在 Linux 中,并没有软件可以直接解压它,我们得安装 unzip 软件。
sudo apt install unzip
然后再用 unzip 解压压缩包。
panyq@CFDJH:~$ unzip plink_linux_x86_64_20201019.zip -d plink
Archive:  plink_linux_x86_64_20201019.zip
  inflating: plink/plink
  inflating: plink/LICENSE
  inflating: plink/toy.ped
  inflating: plink/toy.map
  inflating: plink/prettify
panyq@CFDJH:~$
这里,-d 参数的作用是让 unzip 解压到指定的目录下(不然就都解压到当前目录下了😉)。
注:
tar也可以指定解压的路径,比如可以写成这样:tar -xf ncbi-blast-2.11.0+-x64-linux.tar.gz -C blast(blast目录要事先存在)。
再用 tree 看看解压出的内容。
$ tree plink
plink
├── LICENSE
├── plink
├── prettify
├── toy.map
└── toy.ped
0 directories, 5 files
$
这个在 plink 目录下的 plink 文件就是 PLINK 的二进制可执行文件了,让我们来看看它的使用帮助。
$ plink/plink -h
PLINK v1.90b6.21 64-bit (19 Oct 2020)          www.cog-genomics.org/plink/1.9/
(C) 2005-2020 Shaun Purcell, Christopher Chang   GNU General Public License v3
  plink <input flag(s)...> [command flag(s)...] [other flag(s)...]
  plink --help [flag name(s)...]
Commands include --make-bed, --recode, --flip-scan, --merge-list,
--write-snplist, --list-duplicate-vars, --freqx, --missing, --test-mishap,
--hardy, --mendel, --ibc, --impute-sex, --indep-pairphase, --r2, --show-tags,
--blocks, --distance, --genome, --homozyg, --make-rel, --make-grm-gz,
--rel-cutoff, --cluster, --pca, --neighbour, --ibs-test, --regress-distance,
--model, --bd, --gxe, --logistic, --dosage, --lasso, --test-missing,
--make-perm-pheno, --tdt, --qfam, --annotate, --clump, --gene-report,
--meta-analysis, --epistasis, --fast-epistasis, and --score.
"plink --help | more" describes all functions (warning: long).
$
下载、解压软件压缩包的方法就介绍这么多。可以看出,比起用 apt 一键安装,手动下载解压要麻烦不少,所以接下来介绍一个安装生信常用软件的利器——conda。
conda 和 bioconda
就如同安卓手机可以安装第三方应用商店一样,在 Linux 中也可以安装别的软件包管理程序,conda 就是这样的一个东西。
conda 最大的特点是可以创建虚拟环境。比如,我们想尝试两个不同的数据分析 protocol,但一个要求 python 的版本为 3.8,另一个要求 python 的版本为 3.2,我们就可以创建两个虚拟环境,将不同版本的 python 隔离开来,方便管理。
也正因如此,conda 受到了许多生信行业人员的青睐。为了能方便地安装各种生信软件,bioconda 应运而生。bioconda 是 conda 的一个 “channel”,囊括了许多的生信软件,这使得我们能通过 conda 一键安装各种常用的生信软件。
安装 conda
Miniconda 是一个包含着 conda 的安装包,它只包含 conda 以及 python 等 conda 的依赖软件,下面介绍下它的安装方法。
首先,在 Miniconda 的官网找到适用于 Linux 的安装包,复制它的下载链接,然后下载它。
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
安装包是一个 bash 脚本文件,它可以被这样打开。
$ bash Miniconda3-latest-Linux-x86_64.sh
Welcome to Miniconda3 py38_4.9.2
In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>
然后就进入安装界面了,根据提示按下回车,安装程序会调用一个叫 more 的文档查看器软件来显示用户协议,按住空格即可快速跳过。然后会询问是否接受用户协议。
Do you accept the license terms? [yes|no]
[no] >>>
输入 yes 后回车。然后会询问安装路径。
Miniconda3 will now be installed into this location:
/home/panyq/miniconda3
  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below
[/home/panyq/miniconda3] >>>
这里直接回车,按默认的来。之后还会提示是否初始化,yes 即可😉。
安装完成后重启 WSL,命令提示符就变成了像这样的东西。
(base) panyq@CFDJH:~$
最左侧的 (base) 告诉我们,一个叫 base 的 conda 虚拟环境已被激活了,让我们再 ls 一下。
(base) panyq@CFDJH:~$ ls
Miniconda3-latest-Linux-x86_64.sh  miniconda3
这个 miniconda3 目录就是刚才安装的内容了。
配置 conda 的软件源。
就如同配置 apt 的软件源一样,我们也可以通过修改配置文件让 conda 到 TUNA 镜像站下载软件。
在 ~ 目录下新建一个叫 .condarc 的文件,然后把这些内容复制进去(内容修改自 TUNA 的教程)。
channels:
  - bioconda
  - conda-forge
  - defaults
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
保存退出即可。
创建环境和安装软件
经过刚才的配置,我们就能用 conda 从 bioconda channel 中一键安装软件了,为了方便管理新安装的软件,让我们用下面的命令创建一个虚拟环境。
conda create --name temp
--name 参数用来指定虚拟环境的名字。创建完成后,让我们根据提示,激活这个环境。
(base) panyq@CFDJH:~$ conda activate temp
(temp) panyq@CFDJH:~$
提示符最左侧发生了变化,说明 temp 虚拟环境被激活了。
这时,执行
conda deactivate命令即可返回 base 环境,再来一次就会退出 base 环境了。
接下来让我们在 temp 虚拟环境中安装 BLAST+ 和 PLINK,用下面的命令即可。
conda install blast plink
回车后,conda 会开始计算需要安装哪些依赖,等它计算完成后,只需一个 y 确认,安装就自动进行了。
安装完成后,我们可以用 conda list 命令列出当前环境下安装的所有软件。
(temp) panyq@CFDJH:~$ conda list
# packages in environment at /home/panyq/miniconda3/envs/temp:
#
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                 conda_forge    conda-forge
_openmp_mutex             4.5                       1_gnu    conda-forge
blast                     2.9.0                h20b68b9_1    bioconda
boost                     1.68.0          py37h8619c78_1001    conda-forge
boost-cpp                 1.68.0            h11c811c_1000    conda-forge
bzip2                     1.0.8                h7f98852_4    conda-forge
ca-certificates           2020.12.5            ha878542_0    conda-forge
certifi                   2020.12.5        py37h89c1867_1    conda-forge
gmp                       6.2.1                h58526e2_0    conda-forge
gnutls                    3.6.13               h79a8f9a_0    conda-forge
icu                       58.2              hf484d3e_1000    conda-forge
ld_impl_linux-64          2.35.1               hea4e1c9_2    conda-forge
libblas                   3.9.0                8_openblas    conda-forge
libcblas                  3.9.0                8_openblas    conda-forge
libffi                    3.3                  h58526e2_2    conda-forge
libgcc-ng                 9.3.0               h2828fa1_18    conda-forge
libgfortran-ng            9.3.0               hff62375_18    conda-forge
libgfortran5              9.3.0               hff62375_18    conda-forge
libgomp                   9.3.0               h2828fa1_18    conda-forge
liblapack                 3.9.0                8_openblas    conda-forge
libopenblas               0.3.12          pthreads_h4812303_1    conda-forge
libstdcxx-ng              9.3.0               h6de172a_18    conda-forge
ncurses                   6.2                  h58526e2_4    conda-forge
nettle                    3.4.1             h1bed415_1002    conda-forge
numpy                     1.20.1           py37haa41c4c_0    conda-forge
openssl                   1.1.1i               h7f98852_0    conda-forge
pcre                      8.44                 he1b5a44_0    conda-forge
perl                      5.26.2            h36c2ea0_1008    conda-forge
perl-archive-tar          2.32                    pl526_0    bioconda
perl-carp                 1.38                    pl526_3    bioconda
perl-common-sense         3.74                    pl526_2    bioconda
perl-compress-raw-bzip2   2.087           pl526he1b5a44_0    bioconda
perl-compress-raw-zlib    2.087           pl526hc9558a2_0    bioconda
perl-exporter             5.72                    pl526_1    bioconda
perl-exporter-tiny        1.002001                pl526_0    bioconda
perl-extutils-makemaker   7.36                    pl526_1    bioconda
perl-io-compress          2.087           pl526he1b5a44_0    bioconda
perl-io-zlib              1.10                    pl526_2    bioconda
perl-json                 4.02                    pl526_0    bioconda
perl-json-xs              2.34            pl526h6bb024c_3    bioconda
perl-list-moreutils       0.428                   pl526_1    bioconda
perl-list-moreutils-xs    0.428                   pl526_0    bioconda
perl-pathtools            3.75            pl526h14c3975_1    bioconda
perl-scalar-list-utils    1.52            pl526h516909a_0    bioconda
perl-types-serialiser     1.0                     pl526_2    bioconda
perl-xsloader             0.24                    pl526_0    bioconda
pip                       21.0.1             pyhd8ed1ab_0    conda-forge
plink                     1.90b6.18            h516909a_0    bioconda
python                    3.7.9           hffdb5ce_0_cpython    conda-forge
python_abi                3.7                     1_cp37m    conda-forge
readline                  8.0                  he28a2e2_2    conda-forge
setuptools                49.6.0           py37h89c1867_3    conda-forge
sqlite                    3.34.0               h74cdb3f_0    conda-forge
tk                        8.6.10               h21135ba_1    conda-forge
wheel                     0.36.2             pyhd3deb0d_0    conda-forge
xz                        5.2.5                h516909a_1    conda-forge
zlib                      1.2.11            h516909a_1010    conda-forge
(temp) panyq@CFDJH:~$
这里头就有 blast 和 plink,以及所有的依赖软件,是不是很方便?😉
卸载软件和删除环境
这里就直接贴命令啦😜。
conda remove plink  # 卸载当前环境中的 PLINK。
conda remove --name temp blast  # 卸载 temp 环境中的 BLAST+。
conda remove --name temp --all  # 删除 temp 环境,以及其中的所以软件。
其他常用指令可通过 Cheat sheet 快速查询。
这就是有关软件安装的全部内容啦。