生物信息学

1.2 针对生物信息学的Linux系统使用介绍




桂松涛 Blog
songtaogui@163.com



基本的计算/存储单元概念

CPU <=> 缓存 <=> 内存 <=> 硬盘

  • CPU: 核心计算资源;

  • L123缓存: 位于CPU与内存之间的临时存储器,容量小, 但交换速度却比内存要快得多;

  • RAM: 内存, 断电后数据丢失;

  • DISK: 硬盘, 物理存储, 断电后数据不丢失, 但是读写速度很慢;


计算过程基本数据流方向:

DISK -> RAM -> Cache -> CPU

-延伸阅读-
What Scientists must know about hardware to write fast code – by Jakob Nybo Nissen


Linux操作系统简介


Linux-Unix历史

  • 1970年, Unix诞生(贝尔实验室)并开源;

  • 1979年, Unix V7开始, 贝尔实验室禁止Unix的源码用于教学;

  • 1987年, Tanenbaum发布了从头开发的Minix(兼容Unix V7), 用于教学;

  • 1991年, Linus借鉴Minix开发了Linux内核;

  • 1983年, Stallman发起了GNU(GNU is not Unix)计划, 为了创建一个完全自由的操作系统, 其与Linux内核结合, 形成现代Linux生态环境;

  • 2017年11月份开始, 世界Top500的超级计算机全部使用Linux系统;


Linux的优势和发行版

  • Linux的优势:

    • 良好的可移植性和灵活性

    • 应用广泛: 大型服务器, 小型计算机, 嵌入式设备 ...

    • 完全开源, 免费使用

    • 稳定高效, 开发和维护成本低;

  • Linux常见发行版:

    • Ubuntu, Debian, RHEL, CentOS, Fedora, Arch Linux, Kali Linux, Deepin ...

    • 生信Linux推荐: 服务器用CentOS, 个人PC用Ubuntu;

    • 目前CentOS不再维护新版本, 可以使用Rocky Linux 替换;


Linux系统结构


Linux哲学: 一切皆文件

  • Linux中目录, 进程, 磁盘等都被抽象成了文件;

  • 只需要一套API就可以调用Linux中大部分资源;

  • 任何硬件设备都需要挂载到根目录下才能使用;



/────
    ├── bin     # binaries(二进制文件),存放着最常用的程序和指令
    ├── boot    # 系统启动相关文件,如内核,initrd,以及grub(BootLoader)
    ├── dev     # device,设备文件 — 体现了LInux的“一切皆文件”思想
    ├── etc     # 配置文件。大多数为纯文本文件
    ├── home    # 用户的家目录
    ├── lib     # library,公共库文件(不能单独执行, 只能被调用)
    ├── media   # 挂载点目录,挂载移动设备(如U盘)
    ├── mnt     # 挂载额外的临时文件(如第二块硬盘)
    ├── opt     # optional,存放额外安装软件
    ├── proc    # processes,伪文件系统,内存映射文件,系统启动后才出现文件, 关机就空
    ├── root    # 管理员的家目录
    ├── sbin    # superuser binaries,存放系统管理所需要的命令
    ├── tmp     # temporary,临时文件,所有用户都可以操作,但只能删自己的,不能删别人的
    ├── usr     # unix shared resources,存放只能读的命令和其他文件
    └── var     # variable,存放运行时需要改变数据的文件,如日志等

Linux系统结构:

Linux基本概念


用户和用户组

  • 每个用户有独立的ID和密码;

  • 多个用户可同时登录同一个Linux系统, 互不影响;

  • root用户拥有系统最高权限;

  • 用户组: 具有相同特征用户的集合, 分组可以简化管理工作;

  • 用户和用户组的关系: N vs N;


权限

  • 多用户通过权限实现资源隔离, 保障系统和数据安全;

  • 权限的主体为用户, 对象为文件;

  • 基本权限: 可读(r), 可写(w), 可执行(x);

  • 用户对自己的文件有绝对的权限, 本用户的文件默认禁止其他用户访问;

  • root用户对所有文件拥有访问和修改权限;

命令
命令(command): 终端上运行的程序;

  • 命令提示符(prompt): 登陆终端后显示的符号, 可以通过PS1变量配置;

  • 命令格式: 命令 -选项 参数, 如grep -m 1

    • 命令: shell传递给内核执行的指令;

    • 选项: 命令预设的控制选项, 可以是短选项, 如: -c -v -m, 或 -cvm, 或是长选项, 如: –version;

    • 参数: 指向命令的目标, 多个参数要用空格隔开;

    • 命令类型: 内置命令/外部命令;

    • 命令补全: 使用TAB键;

    • 命令历史: ↑, ↓, ctrl+r, history, ~/.bash_history;

    • 命令帮助: man CMD; CMD -h; README;

    • 命令路径: 命令存放在PATH路径中, 按照路径搜索并执行第一个搜到的命令;


Linux终端基本操作: 文件/目录操作


文件/目录操作

  • 权限设置: chmod,setfacl,chown, chgrp

  • 查看目录/文档信息: ls, pwd, file,

  • 改变目录: cd

  • 创建文件目录: touch, mktemp, mkdir

  • 软连接: ln

  • 删除文件/目录: rm

  • 复制文件/目录: cp

  • 移动/重命名 文件/目录: mv

  • 查看目录大小: df, du

  • 查找文件: find, which, whereis, locate

通配符
a1.txt a2.txt a3.txt ac1.txt b.txt.gz

  • *: 匹配0或多个字符:

    • ls *.txt a1.txt a2.txt a3.txt ac1.txt

  • ?: 有且只有一个字符:

    • ls a?.txt a1.txt a2.txt a3.txt

  • [ ]: 字符组合, 匹配其中任意一个字符:[abc]/[!abc]/[0-9]/[a-z]

    • ls a[12].txt a1.txt a2.txt

  • { }: 集合, 匹配其中任意一个元素: {abc,def,123}

    • ls {a1,a2,ac1}.txt a1.txt a2.txt ac1.txt


Linux终端基本操作: 文本文件处理


  • 编辑器: vim, emacs, nano, vscode...

  • 查看文件: cat, less, more, head, tail

  • 文件操作三剑客

  • 统计文件: wc

  • 内容操作: sort, uniq, cut, split ...

  • 字符串操作: tr, col, join, paste, expand ...

  • 压缩/打包文件: tar, gzip, bzip2, bgzip ...


缅怀Bram: Vim的前世今生

Linux终端基本操作: IO, PIPE, FIFO


输入输出(IO)
Linux标准IO: stdin, stdout, stderr

  • stdin: 标准输入, 对应管道id0;

  • stdout: 标准输出, 对应管道id1;

  • stderr: 标准错误, 对应管道id2;

  • 黑洞设备: /dev/null, 用来当垃圾桶


IO重定向:<, >, <<, >>

cat <file # stdin重定向到file
cat file > abc # stdout 重定向到abc, 覆盖abc原有内容, 等价于:
cat file 1> abc
cat file >> abc # stdout 重定向到abc, 追加在abc原有内容之后
command 1>log.txt 2>error.txt # stderr 重定向到 error.txt
command 1>/dev/null 2>&1 # 丢弃stdout, 同时把stderr重定向到stdout(屏幕打印)


stdout和stderr的区别

  • stdout是行缓冲的数据流: 逐行输出(遇到\n或者缓冲区满才输出);

  • stderr是无缓冲的数据流: 实时输出;


Linux终端基本操作: IO, PIPE, FIFO


管道PIPE

# 对一个文件取第一列, 然后排序, 然后去重:
cut -f 1 file.txt > tmp1.txt
sort tmp1.txt > tmp2.txt
uniq tmp2.txt > final.txt
rm -f tmp1.txt tmp2.txt


临时文件, IO负载 → 管道操作符|

cut -f 1 file.txt | sort | uniq > fianl.txt


进阶知识: 具名管道FIFO

  • FIFO是一个文件,一端写,一端读,会阻塞

  • mkfifo创建FIFO

  • FIFO中的内容存放在内存

  • 可以通过创建FIFO在linux中实现并行计算

自学资料:

  • FIFO简单理解
  • FIFO详细介绍
  • 利用FIFO实现多线程脚本


  • Linux终端基本操作: 资源管理器


    系统状态/资源占用

    ## 查看系统版本信息
    cat /proc/version
    uname -a
    lsb_release -a
    cat /etc/issue
    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数
    # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
    ## 查看物理CPU个数
    cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
    ## 查看每个物理CPU中core的个数(即核数)
    cat /proc/cpuinfo| grep "cpu cores"| uniq
    ## 查看逻辑CPU的个数
    cat /proc/cpuinfo| grep "processor"| wc -l
    ## 查看CPU信息(型号)
    cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
    ## 查看磁盘分区和使用情况
    df -h
    ## 查看内存信息
    cat /proc/meminfo
    free



    任务监控top/htop

    作业管理ps/kill ps + kill: linux中ps配合kill结束进程的N种方法

    作业提交到后台


    Linux中的危险操作


    慎用rm命令的`-f`指令

    # boom!
    rm -rf /
    
    # 你意识不到的错误
    export dirtoremove="/path/to/my/unused/dir"
    rm -rf /path/to/some/parent/$Dirtoremove 
    # will remove all parent things!



    慎用mv命令

    mv fileA fileB


    慎用tar命令

    #压缩
    tar zcvf 新产生的文件.tgz 要压缩的文件
    #解压指定文件
    tar zxvf 待解压的文件.tgz /指定/目录/子文件.txt



    一些安全配置

    # 在bash配置文件中添加别名
    alias cp='cp -i'
    alias mv='mv -i'
    alias rm='rm -i'


    Linux使用习惯: 1. 错误退出检查


    exit status -> $? and set -o pipefail

    # allergic to seven counter 
    function algc7(){
        # I eat numbers in pipe, I died if I see seven
        while read num;do
            [[ "$num" == *"7"* ]] && exit 1
            echo $num
        done
    }


    seq 10 | wc -l; echo $?           # expect 10 and normal exit, get 10 and exit0
    seq 10 | algc7 | wc -l; echo $?   # expect  6 and error exit,  get 6  and exit0, quack!


    set -o pipefail
    seq 10 | algc7 | wc -l; echo $?   # expect  6 and error exit,  get 6  and exit1, good doctor!


    Linux使用习惯: 1. 错误退出检查


    • set -o nounset and set -o errexit


    • 或者显式地进行错误退出检查:

    # blah blah blah
    # some woring code before
    if [ $? ne 0 ];then
        echo "[ERROR]: Some error msg" >&2
        exit 1
    fi


    • 检查输出结果合法性

    # 文件是否有输出
    if [ -s file ]; then ... fi
    
    # 变量是否为空
    if [ -z var ]; then ... fi
    if [ ! -n var ]; then ... fi


    Linux使用习惯: 2. 目录结构规范



    Linux使用习惯: 3. 及时备份、清理文件



    • 绝大多数生信数据格式都是可压缩的, 尽量存储为压缩格式:

      • sam –> bam/cram & index

      • fasta/fastq –> bgzip & tabix

      • bed/gff/gtf/vcf –> bgzip & tabix

      • txt –> gzip



    • 中间文件在流程中就要处理掉



    • 定时备份数据










    Bye ~