概要:新建Ubuntu用户,切换用户,赋予用户 sudo
权限,ssh密钥对登录服务器,使用Ubuntu命令行软件,apt安装删除软件,搜索资料,编译软件源码
读者:了解Linux/Unix命令行,云初学者
时间:8000字,阅读16min,操作20min
前提:亚马逊云教程1:创建并连接EC2, 了解基本Linux命令行指令如 ls
大家平常使用的个人电脑,虽然可以设置多个登录账户,但是,同一时刻,只能有一个账户操作这台电脑。大多数服务器系统则是可以允许多个用户同时操作一台电脑的。本节教程将介绍Ubuntu多用户管理方法,包括添加用户,设置用户为超级管理员,切换用户;生成ssh密钥对登录服务器。另外因为大多服务器系统中没有桌面,所以运行软件时并不像平时点几下鼠标就好了,本节也将介绍命令行软件的运行方法,安装新软件以及删除软件的方法。在删除软件那一小节,介绍了如果不记得命令了,如何在网上搜索答案。
要实现多用户,首先要创建其他的用户。大家可以跟随“亚马逊云教程1:创建并连接EC2”的方法创建并登录一台服务器,在那个教程里面,我们使用的是Ubuntu系统的默认用户,其用户名是ubuntu。我们可以用下面的命令新建一个新用户,可以把roden更改为你需要的用户名(后面所有的roden都要改为你这里输入的名字):
sudo adduser roden
这句话的意思是,使用sudo(超级用户权限)添加一个用户,用户名是“roden”。按下回车之后,它会提示你输入密码,并再次确认密码。然后使用默认值一路按回车就好了。下面是详细的运行记录:
ubuntu@ip-172-31-2-87:~$ sudo adduser roden
Adding user `roden' ...
Adding new group `roden' (1001) ...
Adding new user `roden' (1001) with group `roden' ...
Creating home directory `/home/roden' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for roden
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
这里稍微解释一下超级用户权限。因为Ubuntu系统支持多个用户,所以就衍生出了非常严格的用户权限设置。就像一所学校里面,不同的人的权限是不同的,学生负责在教室学习,大厨负责在食堂做饭,招生办的老师负责招收更多的学生。而超级用户就是,ta什么都可以做,不受任何限制。创建一个新的用户需要使用到超级用户权限,启用的方法就是用 sudo
运行命令。在运行了上面的命令之后,我们的系统里面就有了roden这个用户了。我们使用下面的命令切换到那个用户:
su - roden
“su”我推测是switch user (切换用户)的缩写,中间的一个小横杆,或者叫中划线/连字符(英文是dash 或 hyphen),要表达的意思是,切换用户的同时,也切换到用户根目录。之后需要输入该用户的密码。大家可以用 pwd
看一下当前工作目录(print working directory),用 ls
查看一下其他用户的目录。
roden@ip-172-31-2-87:~$ pwd
/home/roden
roden@ip-172-31-2-87:~$ ls /home # ls 是 list 的缩写,显示某个文件夹下面的内容,
# 这里是显示 /home 文件夹下面的内容。
roden ubuntu # 这里输出了两个词。roden 代表用户 roden 的家(用户跟目录);
# ubuntu 代表之前我们使用的ubuntu用户的家(用户跟目录)
用 exit
命令退出roden用户,回到ubuntu用户。这里 exit
没有直接退出连接到的服务器,是因为我们之前在ubuntu用户里面登录到了roden这个用户,所以 exit
的时候,退出的是roden,回到原来的ubuntu。这时再用 pwd
时会看到结果和之前的不一样,再用 exit
,则退出了服务器。
roden@ip-172-31-2-87:~$ exit
logout
ubuntu@ip-172-31-2-87:~$ pwd
/home/ubuntu
ubuntu@ip-172-31-2-87:~$ exit
logout
Connection to Public_IP closed.
大家可以再打开一个终端, cd
到私有密钥文件夹,用 ssh -i tutorial.pem ubuntu@Public_IP
命令登录服务器,你会发现两个终端都可以输入命令,互不影响,就相当于有两个人(两个键盘)在同时操作同一台电脑。
大家可以再次用ubuntu用户登录到服务器,接下来我们要赋予roden超级用户权限。
sudo usermod -g admin roden
解释:ubuntu有超级权限,所以可以执行 sudo
,然后是用户模式, -g
表示设置用户组,admin是管理员,可以理解成是超级用户;整句话就是把roden添加到超级用户组中。大家可以用如下命令查看是否设置成功。
# ubuntu@ip-172-31-2-87:~$ sudo usermod -g admin roden # 这句话如果前面执行过一次就不用再执行了
ubuntu@ip-172-31-2-87:~$ su - roden
Password:
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details. # 这里它会提示你,你是超级用户,可以使用sudo运行命令
roden@ip-172-31-2-87:~$ sudo ls /
[sudo] password for roden: # 首次使用sudo时要输入密码
bin dev home ...
如果我们每次登录服务器都需要切换到私有密钥的文件夹,然后指明我们要用那个文件登录,就会比较麻烦。我们可以使用自己生成的ssh密钥对来绕开这个问题。本系列教程第一讲里面已提到,密钥对就像是接头密语一样,有上句和下句。对密钥对来说,是明语(公有密钥)和暗语(私有密钥)。之前我们下载了AWS的私有密钥,在服务器里面,存放着一个公有密钥,他们俩匹配了,所以我们才能成功连接服务器。我们接下来要自己生成一对ssh密钥对。大家要在自己本地的机器(而不是服务器)上面运行下面的 ssh-keygen
命令。命令和注释:
➜ Downloads ssh-keygen #前面的Downloads是我本地电脑上当前的目录。"ssh-keygen"才是命令。
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/roden/.ssh/id_rsa): /Users/roden/.ssh/tutorial_rsa #需要你输入存放的位置。大家可以选用默认的位置,直接回车。也可以像
# 我这里一样,使用默认的路径,但是把最后的名字从id_rsa更改成了tutorial_rsa。因为我之前生成过
# id_rsa了,不希望覆盖那个文件。推荐大家使用默认值,后面有些步骤会方便一些。
Enter passphrase (empty for no passphrase):#这里要求你输入加密密码,可以留空。如果输入了的话,
# 以后每次登录服务器就需要输入密码。
Enter same passphrase again:#如果输入了的话,再输入一次。
Your identification has been saved in /Users/roden/.ssh/tutorial_rsa.#这里是生成的私有密钥的
# 位置
Your public key has been saved in /Users/roden/.ssh/tutorial_rsa.pub.#这里是生成的公有密钥的
# 位置
The key fingerprint is:
c5:92:e4:a1:e4:48:1b:3d:41:7f:da:4e:8c:96:ca:8e roden@D-69-91-128-50.dhcp4.washington.edu
The key's randomart image is:
+--[ RSA 2048]----+
| oo+.o |
| . *o= + |
| o o.= + |
| X |
| S + |
| . o o |
| o . |
| o |
| E . |
+-----------------+
➜ Downloads #运行完毕,回到了之前输入命令的目录
现在我们把公有密钥存放到AWS的服务器上。先在本地机器上输出公有密钥:
➜ Downloads cat ~/.ssh/tutorial_rsa.pub # 打印公有密钥的命令
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCgKbI69stUViGbPsF7XpzQt72W2nJ+FRB54D4XXrVb2jvfouX6HoeTgGNV/p/uMA7QmoVaD/Sf2klh8kj3KxQkDiTr/+m19KWjveTxj2ClxDPcjA7H2w8HU0FE/fVNqHt3krtbFyuXj+cTosc8cSciQvZwpFtTqG6ieM/drdxcIYiZ/n3UZejlYV0OvwOt27gnAw7khZI9kifgFZ5+LJ/q/7GIHnUd9TY8EVO5zIDWv6Ykm7od8ZeYJw5sJLclbOQoYeQhOyKqnibnxz0wTr1ZLSiu4EA1Ws0/bS1FGR5NfENV7daXzD/H3VUWPkxcSHWmK/Oe3Jgxuz2K24LjLTxJ roden@D-69-91-128-50.dhcp4.washington.edu
# 复制这一段话,不含#后面的注释
➜ Downloads
然后登录到服务器上面去,把这段话放在roden根目录下的这个文件里面 /ssh/authorized_keys
。命令:
➜ Downloads ssh -i tutorial.pem ubuntu@35.167.194.132 #登录服务器
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-1013-aws x86_64)
...
Last login: Sun Apr 30 22:33:40 2017 from 69.91.128.50
ubuntu@ip-172-31-2-87:~$ su - roden # 切换用户,并切换目录
Password: #输入密码
roden@ip-172-31-2-87:~$ mkdir .ssh # 新建名为“.ssh”的文件夹
roden@ip-172-31-2-87:~$ chmod 700 .ssh/ # 更改文件夹权限。change mode. 700 的第一个7是给自己
# (roden)的权限,7是最高的,“可读可写可执行”;中间那个0是给用户组的,比如学校里面所有的学生;最后那
# 个0是给所有人的。0是没有任何权限。最后的 .ssh 表示我们设置权限的对象是 .ssh 文件夹
roden@ip-172-31-2-87:~$ vi .ssh/authorized_keys #使用vim 新建一个文件,并把之前复制的公有密钥复
# 制进去。步骤在下文有阐述
roden@ip-172-31-2-87:~$ chmod 600 .ssh/authorized_keys #更改这个文件的权限为只有自己“可读可写”
用 vi .ssh/authorized_keys
编辑文档的步骤。这句话就相当于是在Windows系统中,在 .ssh
文件夹下的新建了一个文本文档 authorized_keys
。之后依次键入 i
, command V
(这个是Mac里的粘贴,如果是Win,使用 CtrlV
), esc
, :wq
, enter
(回车键)。 不像Win的文本文档那样有可视化的窗口,有鼠标定位, vi
是用命令操作的。刚刚那一串命令含义如下, i
是 insert 的缩写,也就是插入,然后把之前复制的公有密钥粘贴进去, esc
是退出 insert 插入模式,返回接受指令模式, :wq
里的 :
是告诉 vi
开始输入指令了, wq
是 write quit的缩写,写入后退出,也就是保存并退出。整个一些列操作就像是在Win里面新建了一个文本文档( vi.ssh/authorized_keys
),把鼠标放到了第一行第一个字符的位置,并准备输入内容( i
),粘贴了一段文字( command V
),点了关闭按钮“x”,点击了保存( esc
, :wq
)。
记得在编辑完了之后,要更改该文件的权限为只有自己可读可写。这是因为登录成功之后,你就对服务器有控制权了,所以Linux对该密钥对文件的安全性要求比较高,否则其人或其他软件更改了该文件的内容后,你可能就不能登录成功,而且服务器会有安全隐患。
现在,我们就可以使用自己生成的密钥对(而不是从AWS上下载的)来登录服务器了。如果你没有更改默认密钥对的路径和名字 .ssh/id_rsa
,可以直接使用 ssh USER_NAME@Public_IP
来登录。如果更改了,则需要指明私有密钥的位置。
登录,测试sudo权限,切换到默认用户 ubuntu
, 切换到超级用户 root
的命令如下:
➜ ~ ssh -i .ssh/tutorial_rsa roden@35.160.40.187 # ssh登录服务器
The authenticity of host '35.160.40.187 (35.160.40.187)' can't be established.
RSA key fingerprint is 2e:a1:77:26:9e:6a:40:da:3f:b5:96:3b:89:11:a9:39.
Are you sure you want to continue connecting (yes/no)? yes # 因为我关闭并重启了AWS的这台机
# 器,AWS重新分配了资源,该机器的fingerprint(指纹)改变了,我本地的电脑不认识那台服务器了,所以有
# 这个提示。输入yes就好。这个跟服务器安全相关,感兴趣的朋友可以谷歌“RSA key fingerprint”。
Warning: Permanently added '35.160.40.187' (RSA) to the list of known hosts.
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-1016-aws x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud
26 packages can be updated.
0 updates are security updates.
Last login: Sun Apr 30 23:41:26 2017 from 69.91.128.50 # 这些都是欢迎信息
roden@ip-172-31-2-87:~$ sudo ls / # 测试sudo权限
[sudo] password for roden:
bin dev home initrd.img.old lib64 media opt root sbin srv tmp var vmlinuz.old
boot etc initrd.img lib lost+found mnt proc run snap sys usr vmlinuz
roden@ip-172-31-2-87:~$ sudo su - ubuntu # 切换到ubuntu用户
ubuntu@ip-172-31-2-87:~$ pwd # 输出该用户根目录
/home/ubuntu
ubuntu@ip-172-31-2-87:~$ sudo su - root # 切换到root用户
root@ip-172-31-2-87:~# pwd # 输出该用户根目录
/root
root@ip-172-31-2-87:~# su - roden # 切换回自己
roden@ip-172-31-2-87:~$ pwd # 输出自己的根目录
/home/roden
roden@ip-172-31-2-87:~$ # 准备输入下一条命令
这里我们是通过在 su
(switch user)前面添加了 sudo
来实现切换到ubuntu,root用户,因为我们不知道这两个用户的密码(实际上默认是没有密码的,只能通过密钥对登录ubuntu用户)。root是权限最大的用户了,有时用这个用户执行管理相关的命令会方便一些,但是会有输错命令、误删文件的风险。所以建议大家使用普通用户,手动输入 sudo
来执行超级用户命令。
现在,我们就可以删除之前下载的AWS的私有密钥了,之后可以使用自己生成的密钥登录。用相同的方法可以添加更多的Linux用户。
在桌面系统里面使用软件,我们一般是双击那个软件的图标,然后开始使用,使用好了之后就关闭。比如双击word,然后开始写文档,之后保存退出。在命令行里面,整个过程类似,但是在展现形式上有些区别,因为我们不再使用鼠标,所以都需要使用键盘键入文字来实现。实际上我们之前使用 vi
的时候,就过了一遍命令行软件的使用流程。我们会使用一个关键词来调用(打开)那个软件 vi
;然后我们会给这个关键词后面添加一些参数, vi.ssh/authorized_keys
,这个就像是给word文档命名一样;之后我们会在软件中进行一系列操作;然后再保存退出。常用的软件一般就是,软件名 + 参数。退出软件的方法,不同的软件会有些许不同,不过大多都跟 q, contrl-C,esc
有关。下面是几个例子。
roden@ip-172-31-2-87:~$ ls / # ls 是软件名,list, / 是参数,"列出根目录 / 的内容"
bin dev home initrd.img.old lib64 media opt root sbin srv tmp var vmlinuz.old
boot etc initrd.img lib lost+found mnt proc run snap sys usr vmlinuz
roden@ip-172-31-2-87:~$ ls /home # "列出目录 /home 的内容"
roden ubuntu
roden@ip-172-31-2-87:~$ vi test.txt # 新建文本文件
roden@ip-172-31-2-87:~$ ls # 如果不带参数,软件会使用默认参数,ls的默认参数就是当前文件夹
test.txt
roden@ip-172-31-2-87:~$ cat test.txt # 连续(concatenate)打印文件内容
test content
测试内容
roden@ip-172-31-2-87:~$ mkdir test_folder # 新建文件夹
roden@ip-172-31-2-87:~$ cd test_folder/ # 进入到新文件夹 change directory
roden@ip-172-31-2-87:~/test_folder$ pwd # 输出当前工作目录
/home/roden/test_folder
roden@ip-172-31-2-87:~/test_folder$ cd # cd 不带参数时,默认是回到用户根目录
roden@ip-172-31-2-87:~$ pwd
/home/roden
roden@ip-172-31-2-87:~$ top # 显示目前各个进程耗用的资源(CPU,内存), 按 q 退出该软件
top - 21:55:37 up 1:31, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 121 total, 1 running, 120 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.1 sy, 0.1 ni, 99.4 id, 0.1 wa, 0.0 hi, 0.0 si, 0.1 st
KiB Mem : 1014460 total, 586320 free, 48832 used, 379308 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 804348 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 37900 5872 3908 S 0.0 0.6 0:02.16 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
roden@ip-172-31-2-87:~$ top -u roden # 仅显示某个用户的进程, 按 q 退出
top - 21:57:18 up 1:32, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 121 total, 1 running, 120 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.1 sy, 0.1 ni, 99.4 id, 0.1 wa, 0.0 hi, 0.0 si, 0.1 st
KiB Mem : 1014460 total, 586360 free, 48792 used, 379308 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 804392 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4181 roden 20 0 45248 4520 3820 S 0.0 0.4 0:00.00 systemd
4183 roden 20 0 61352 2076 0 S 0.0 0.2 0:00.00 (sd-pam)
4240 roden 20 0 95372 4040 3088 S 0.0 0.4 0:00.02 sshd
4243 roden 20 0 21388 5164 3232 S 0.0 0.5 0:00.03 bash
4299 roden 20 0 21388 5320 3376 S 0.0 0.5 0:00.04 bash
4387 roden 20 0 40520 3668 3080 R 0.0 0.4 0:00.00 top
roden@ip-172-31-2-87:~$ free # 显示内存占用
total used free shared buff/cache available
Mem: 1014460 48628 586504 3152 379328 804556
Swap: 0 0 0
roden@ip-172-31-2-87:~$ # 直接按回车什么都不执行
roden@ip-172-31-2-87:~$ free -h # -h 用人(human)方便阅读的方式显示大小,M,G等
total used free shared buff/cache available
Mem: 990M 47M 572M 3.1M 370M 785M
Swap: 0B 0B 0B
大家可以再回头看一看前面的教程,其实都是在使用各种软件。
在Win或其他桌面系统里面安装软件的时候,我们一般会下载一个软件安装包,然后设定一些选项,点击下一步,安装并使用。而在命令行里面,我们可以下载一个源码包,然后编译它,然后使用相应软件。不过大多数命令行系统都会有一个软件包管理器,就类似于是iPhone的App Store,它收集了很多软件,然后我们只需要输入一个命令就可以安装软件了(App Store有些App需要付费,而命令行软件包里的软件,大多都是开源软件,使用它们不需要付费)。在Ubuntu里面,常用的软件包管理器是Ubuntu's APT (Advanced Packaging Tool (高级包装工具)) 我们可以使用命令 apt
来调用这个包管理工具。下面我们以 htop
这个类似于 top
的软件为例,来讲解如何安装和卸载软件。
roden@ip-172-31-2-87:~$ htop # 尝试使用未安装的软件
The program 'htop' is currently not installed. You can install it by typing: # 系统提示没有
# 安装
sudo apt install htop # 提示可以使用这一行命令安装
roden@ip-172-31-2-87:~$ sudo apt install htop # 使用提示的命令行,安装
[sudo] password for roden: # 安装软件需要管理员权限,所以需要输入密码
Reading package lists... Done # 接下来的一些操作类似于下载,解压,安装软件
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
htop
0 upgraded, 1 newly installed, 0 to remove and 26 not upgraded. # 这里提示,即将安装一个新软
# 件,系统中已存在的软件,有26个可以升级。就类似于App Store提示有多少App可以升级一样。
Need to get 76.4 kB of archives. # 安装这个软件需要下载多大的文件
After this operation, 215 kB of additional disk space will be used. # 安装成功之后会占用多少
# 存储
Get:1 http://us-west-2.ec2.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 htop amd64 2.0.1-1ubuntu1 [76.4 kB] # 下载
Fetched 76.4 kB in 0s (6,242 kB/s)
Selecting previously unselected package htop.
(Reading database ... 76537 files and directories currently installed.)
Preparing to unpack .../htop_2.0.1-1ubuntu1_amd64.deb ...
Unpacking htop (2.0.1-1ubuntu1) ... # 解压、安装、安装后的一些设置
Processing triggers for mime-support (3.59ubuntu1) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up htop (2.0.1-1ubuntu1) ...
roden@ip-172-31-2-87:~$ #当命令行再次回到等待指令的状态时,该软件就安装好了。
在Ubuntu16.04中只需要输入 sudo apt install SOFTWARE_NAME
就可以安装软件了,而在老版的Ubuntu中,需要使用 sudo apt-get install SOFTWARE_NAME
来安装。安装好了之后,我们就可以用前面讲的方法使用了。
roden@ip-172-31-2-87:~$ htop # 可以看到比 top 漂亮一些系统资源使用报告,按 q 退出 htop 软件
roden@ip-172-31-2-87:~$
有时我们可能错误安装或者因为其他原因如磁盘空间不足想删除一些软件。如果是用apt安装的话,我们可以使用下面的方法来删除。有时我们可能不记得某一条命令是什么了,可以上网搜索。在网上搜索一个计算机问题的时候,推荐大家尽量使用谷歌英文搜索。如现在谷歌“ubuntu remove apt installed software”(搜索并不一定需要给出最好的词汇,接近即可,但更好的词汇会缩短获得答案的时间,这里使用”how to uninstall apt installed package“可能更好),第一条结果是"askubuntu"的,这是Stack Exchange (Stack Overflow)公司出的一个站点,里面的资料质量一般都很好。我一般看到该公司旗下站点的答案的时候就会直接仔细阅读。可以看到被采纳的答案是,使用 sudo apt-get remove <application_name>
来删除该软件本身,使用 sudo apt-get purge <package-name>
可以删除这个软件以及安装这个软件的时候附带安装的一些依赖软件(依赖软件就像,要学“高等线性代数二”就得先学“高等线性代数一“一样,有时要安装软件X,必须先安装软件ABC,而删除X的时候,可以选择只删除X,也可以选择同时删除ABC和X)。找到之后我们就可以尝试别人给的答案了。
roden@ip-172-31-2-87:~$ sudo apt purge htop # Ubuntu16.04 系统可以省略 apt-get 的 -get
[sudo] password for roden:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
htop*
0 upgraded, 0 newly installed, 1 to remove and 26 not upgraded. # 提示一个软件即将被删除
After this operation, 215 kB disk space will be freed. # 提示会腾出215kB的空间,这个和之前安装
# 的时候是一样的
Do you want to continue? [Y/n] # 询问是否继续
(Reading database ... 76546 files and directories currently installed.)
Removing htop (2.0.1-1ubuntu1) ...
Processing triggers for man-db (2.7.5-1) ...
Processing triggers for mime-support (3.59ubuntu1) ...
roden@ip-172-31-2-87:~$ htop # 当我们已经删除之后,再尝试就会提示未安装
The program 'htop' is currently not installed. You can install it by typing:
sudo apt install htop
有些软件在软件包管理器当中并没有,或者说并不是最新版的,这时如果我们想安装它们的话,就需要通过编译源码来安装了。这个过程有时复杂,有时简单,取决于有多少依赖项目需要预先安装。这里我以生物信息学中的一个软件 bwa
为例,说一下怎么通过源码安装。 bwa
是分析二代测序产生的基因序列时常用的一个软件,它的功能是把测序产生的基因序列片段和研究物种(如人)的参考基因组进行比对,寻找该片段在基因组的位置。首先我们谷歌搜索找到 bwa
的官方网页,https://github.com/lh3/bwa。然后根据它的提示,进行安装。
roden@ip-172-31-2-87:~$ git clone https://github.com/lh3/bwa.git # 下载软件
Cloning into 'bwa'...
remote: Counting objects: 4071, done.
remote: Total 4071 (delta 0), reused 0 (delta 0), pack-reused 4071
Receiving objects: 100% (4071/4071), 1.57 MiB | 0 bytes/s, done.
Resolving deltas: 100% (2904/2904), done.
Checking connectivity... done.
roden@ip-172-31-2-87:~$ cd bwa; make # 根据官网提示,输入安装指令, 注意这里的第一句话,cd bwa
# 就把工作目录转换到了 bwa 里面
The program 'make' can be found in the following packages:
* make
* make-guile
Try: sudo apt install <selected package> # 提示我们没有make这个软件,并告诉我们该如何安装
roden@ip-172-31-2-87:~/bwa$ sudo apt install make # 根据提示安装 make
[sudo] password for roden:
Reading package lists... Done
... # 此处省略若干行输出
Setting up make (4.1-6) ...
roden@ip-172-31-2-87:~/bwa$ cd bwa; make # 这里我继续用之前的指令执行,注意这里我们已经到bwa里
# 面了
-bash: cd: bwa: No such file or directory # 因为我们已经到bwa里面了,而该文件夹里面没有另外一个
# 叫bwa的文件夹,所以会提示找不到文件或文件夹
gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS utils.c -o utils.o
make: gcc: Command not found # 这里提示没有gcc,gcc是一个软件,c语言编译器
Makefile:25: recipe for target 'utils.o' failed
make: *** [utils.o] Error 127
roden@ip-172-31-2-87:~/bwa$ gcc # 尝试使用gcc
The program 'gcc' is currently not installed. You can install it by typing:
sudo apt install gcc
roden@ip-172-31-2-87:~/bwa$ sudo apt install gcc # 根据提示安装gcc
Reading package lists... Done
Building dependency tree
Reading state information... Done
... # 此处省略若干行输出
Setting up libc6-dev:amd64 (2.23-0ubuntu7) ...
Setting up manpages-dev (4.04-2) ...
Processing triggers for libc-bin (2.23-0ubuntu7) ...
roden@ip-172-31-2-87:~/bwa$ make # 接着根据官网提示,省略cd bwa,只执行 make
gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS utils.c -o utils.o
utils.c:33:18: fatal error: zlib.h: No such file or directory # 报错,下文有如何寻找解决方案的说明。这是缺少一个依赖项
compilation terminated.
Makefile:25: recipe for target 'utils.o' failed
make: *** [utils.o] Error 1
roden@ip-172-31-2-87:~/bwa$ sudo apt-get install libz-dev # 在stackoverflow上找到的解决方法
[sudo] password for roden:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'zlib1g-dev' instead of 'libz-dev'
The following additional packages will be installed:
zlib1g
The following NEW packages will be installed:
zlib1g-dev
The following packages will be upgraded:
zlib1g
1 upgraded, 1 newly installed, 0 to remove and 25 not upgraded.
...
Preparing to unpack .../zlib1g-dev_1%3a1.2.8.dfsg-2ubuntu4.1_amd64.deb ...
Unpacking zlib1g-dev:amd64 (1:1.2.8.dfsg-2ubuntu4.1) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up zlib1g-dev:amd64 (1:1.2.8.dfsg-2ubuntu4.1) ...
roden@ip-172-31-2-87:~/bwa$ # 回到等待指令的状态,上面也没有报错error,说明成功安装了一个依赖
# 项。
roden@ip-172-31-2-87:~/bwa$ make # 再次执行安装指令 make
gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS utils.c -o utils.o # 编译过程中的一些输出
gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS kthread.c -o kthread.o
gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS kstring.c -o kstring.o
gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS ksw.c -o ksw.o
...
bwt_gen.c: In function 'BWTIncBuildRelativeRank’:
bwt_gen.c:878:10: warning: variable 'oldInverseSa0RelativeRank’ set but not used [-Wunused-but-set-variable] # 有时编译的时候会看到Warning,有很多原因,有一部分跟程序的代码写的不完善有关,
# 一般只要不是Error,就都还好。
bgint_t oldInverseSa0RelativeRank = 0;
^
bwt_gen.c: In function 'BWTIncMergeBwt’:
bwt_gen.c:952:15: warning: variable 'bitsInWordMinusBitPerChar’ set but not used [-Wunused-but-set-variable]
unsigned int bitsInWordMinusBitPerChar;
...
gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS main.c -o main.o
gcc -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS bwashm.o bwase.o bwaseqio.o bwtgap.o bwtaln.o bamlite.o bwape.o kopen.o pemerge.o maxk.o bwtsw2_core.o bwtsw2_main.o bwtsw2_aux.o bwt_lite.o bwtsw2_chain.o fastmap.o bwtsw2_pair.o main.o -o bwa -L. -lbwa -lm -lz -lpthread -lrt
roden@ip-172-31-2-87:~/bwa$ # 回到等待指令的状态,上面也没有报错error,说明成功安装了bwa这个软件
roden@ip-172-31-2-87:~/bwa$ ./bwa # 测试bwa,下面输出了帮助文档,说明安装成功了。这里我们是通过
# 输入该软件的路径,"./bwa"来执行bwa这个软件,而不像之前直接top,就可以执行top了。这是因为bwa不在
# 我们系统的环境变量里面。把一个路径添加到系统的环境变量还是经常用到的,感兴趣的朋友可以自行搜索一
# 下。
Program: bwa (alignment via Burrows-Wheeler transformation)
Version: 0.7.15-r1142-dirty
Contact: Heng Li <lh3@sanger.ac.uk>
Usage: bwa <command> [options]
Command: index index sequences in the FASTA format
mem BWA-MEM algorithm
fastmap identify super-maximal exact matches
pemerge merge overlapping paired ends (EXPERIMENTAL)
aln gapped/ungapped alignment
samse generate alignment (single ended)
sampe generate alignment (paired ended)
bwasw BWA-SW for long queries
shm manage indices in shared memory
fa2pac convert FASTA to PAC format
pac2bwt generate BWT from PAC
pac2bwtgen alternative algorithm for generating BWT
bwtupdate update .bwt to the new format
bwt2sa generate SA from BWT and Occ
Note: To use BWA, you need to first index the genome with `bwa index'.
There are three alignment algorithms in BWA: `mem', `bwasw', and
`aln/samse/sampe'. If you are not sure which to use, try `bwa mem'
first. Please `man ./bwa.1' for the manual.
中间我们遇到好几个错误“Error”,如果大家理解错误的原因,就能很快处理它。我刚开始学习Linux的时候,每次遇到错误,都很烦躁,一般会重头再来一遍,然后还是一样的错误;中文搜索一下,解决不了;有时错误就摆在那里了;到后来就非常害怕遇到错误“Error”。只到我开始阅读英文的提示,才发现,原来大多数错误都是可以很快被解决的,而且所有的Error都给了原因,很多也都给了解决办法。比如上面,很多都是没有安装相应软件导致的。如: make
, gcc
等。但是有一个错误,“fatal error: zlib.h: No such file or directory”,没有给提示,也不是没有软件的原因,初次看到可能不理解,我们可以把带有"Error"的那一行放到谷歌里面看看。第一个结果是stackoverflow上的,前面已经说过,这里面的答案的质量一般都很高,应该花时间仔细阅读一下。之后,应该能理解我们是缺少一个叫“zlib.h”的头文件,这个是编译这个软件的一个依赖项,所以我们要先安装它。根据答案,我们可以通过这一行命令来安装它 sudo apt-get install libz-dev
。之后,问题就解决了, bwa
也成功安装了。最后,我们提到了“把一个路径添加到系统的环境变量还是经常用到的,感兴趣的朋友可以自行搜索一下”。这个并不是太难,在后面的教程中,我们用到这个的时候,会简单讲一讲。
Linux/Unix 命令行入门教程,UNIX Tutorial for Beginners 这个是我当时上计算生物学的一节课时老师让大家跟的教程,大家可以找对应的中文版的。如果是想学的非常深,推荐阅读《鸟哥的Linux私房菜》这本书。
搜索“设置Linux环境变量”,“set PATH in Ubuntu for user”,https://askubuntu.com/questions/60218/how-to-add-a-directory-to-the-path
多用户管理
$ sudo adduser USER_NAME # 添加用户
$ su - USER_NAME # 切换用户
$ sudo usermod -g admin USER_NAME # 添加用户到超级用户组
SSH密钥对登录服务器
# 本节的命令在本地电脑上完成
$ ssh-keygen # 生成ssh密钥对
$ cat ~/.ssh/tutorial_rsa.pub # 查看公有密钥
在远端服务器
$ mkdir .ssh # 新建名为“.ssh”的文件夹
$ chmod 700 .ssh/ # 更改文件夹权限。
$ vi .ssh/authorized_keys #使用vim 新建一个文件,并把之前复制的公有密钥复
# 制进去。
$ chmod 600 .ssh/authorized_keys #更改这个文件的权限为只有自己“可读可写”
运行命令行软件
$ cat test.txt # 连续(concatenate)打印文件内容
$ mkdir test_folder # 新建文件夹
$ cd test_folder/ # 进入到新文件夹 change directory
$ pwd # 输出当前工作目录
$ cd # cd 不带参数时,默认是回到用户根目录
$ top # 显示目前各个进程耗用的资源(CPU,内存), 按 q 退出该软件
$ top -u USER_NAME # 仅显示某个用户的进程, 按 q 退出
$ free # 显示内存占用
$ free -h # -h 用人(human)方便阅读的方式显示大小,M,G等
apt安装删除软件
$ sudo apt install htop # 安装软件htop
$ htop # 使用 htop 可以看到比 top 漂亮一些系统资源使用报告,按 q 退出 htop 软件
$ sudo apt purge htop # 删除软件及其依赖包
编译软件源码
$ git clone https://github.com/lh3/bwa.git # 下载软件
$ cd bwa; make
The program 'make' can be found in the following packages:
* make
* make-guile
$ sudo apt install make # 根据提示安装 make
$ gcc # 尝试使用gcc
The program 'gcc' is currently not installed. You can install it by typing:
$ sudo apt install gcc # 根据提示安装gcc
$ make # 接着根据官网提示,省略cd bwa,只执行 make
utils.c:33:18: fatal error: zlib.h: No such file or directory # 报错,下文有如何寻找解决方案的说明。这是缺少一个依赖项
$ sudo apt-get install libz-dev # 在stackoverflow上找到的解决方法
$ make # 再次执行安装指令 make
$ ./bwa # 测试bwa
联系客服