Linux 基操

磁盘操作

磁盘挂载

mount: wrong fs type, bad option, bad superblock on /dev/xxx,挂载时未格式化,使用的文件系统格式不对

  • 格式化磁盘
    sudo mkfs -t ext4 /dev/xxx
    sudo mkfs.ext4 /dev/xxx
  • 挂载磁盘 mount -t type device dir:挂载device到dir
    sudo mount -t ext4 /dev/xxx /path/for/mount

启动时自动挂载

  • 查询设备上所采用文件系统类型以及UUID, block device attribute
    sudo blkid /dev/xxx
  • 在/etc/fstab中添加一行
    设备名,挂载点,文件系统类型,选项,是否dump,启动是否检查磁盘,根目录选1,不检查选0,其他的可以选2。
    /dev/vdb /mnt ext4 defaults 0 0
    UUID=XXX /mnt ext4 defaults 0 0

磁盘常用命令

df -h:		查看磁盘分区情况
df -T:		查看所有磁盘的文件系统类型(type)
fdisk -l:	查看所有被系统识别的磁盘,磁盘分区
du -sh:	查看磁盘占用情况

内存常用命令

free -m

cache / buffer 清理

sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

// As this is a non-destructive operation, 
// and dirty objects are notfreeable, 
// the user should run "sync" first in order to make sure allcached objects are freed.

To free pagecache:
* echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
* echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
* echo 3 > /proc/sys/vm/drop_caches

可以写个脚本定时运行,这里设置了 4G 的阈值,小于这个数就清理。

#! /bin/sh
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "===========================" >> /app/memory/logs/mem.log
date >> /app/memory/logs/mem.log
echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /app/memory/logs/mem.log
if [ $free -le 4000 ] ; then
                sync && echo 1 > /proc/sys/vm/drop_caches
                sync && echo 2 > /proc/sys/vm/drop_caches
                sync && echo 3 > /proc/sys/vm/drop_caches
                used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`
                free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`
                echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /app/memory/logs/mem.log
                echo "OK" >> /app/memory/logs/mem.log
else
                echo "Not required" >> /app/memory/logs/mem.log
fi
exit 1

每天早上六点运行一次,清理周期可以定制。
crontab -e
0 6 * * * /path/to/freemem.sh

CPU信息

cat /proc/cpuinfo

修改 apt-get 镜像源

  1. sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
  2. sudo vim /etc/apt/sources.list
  3. Add new source address
  4. sudo apt-get update

用户管理

用户增删

  • 创建用户,创建用户的家目录以及用户组
    useradd -m username
  • 设置用户登录密码
    passwd username
  • 删除一个用户及其在系统上的目录
    userdel -r username
  • 用户组的增删
    groupadd groupname
    groupdel groupname

adduser & useradd

adduser: 会自动为创建的用户指定主目录、系统shell版本,会在创建时提示输入用户密码。
useradd:需要使用参数选项指定上述基本设置,如果不使用任何参数,则创建的用户无密码、无主目录、没有指定shell版本。

adduser在创建用户时会主动调用 /etc/adduser.conf
在创建用户主目录时默认在 /home 下,而且创建为 /home/用户名
如果主目录已经存在,就不再创建。
但是此主目录虽然作为新用户的主目录,而且默认登录时会进入这个目录下,但是这个目录并不是属于新用户。
当使用 userdel 删除新用户时,并不会删除这个主目录,因为这个主目录在创建前已经存在且并不属于这个用户。
为用户指定shell版本为:/bin/bash

adduser username --home dir 指定用户家目录
adduser username --conf conf_file 指定 configuration 文件

useradd usrname -d home_dir -m -s /bin/bash
之后通过 sudo passwd username 指定密码

-d 只是指定了家目录,如果不存在也不会创建。
-m 表示如果不存在指定的家目录,则创建它,并从 /etc/sket 拷贝初始的配置文件到用户家目录。

登录信息

  • who 查看当前登录用户,缺省输出包括用户名、终端类型、登陆日期以及远程主机。
  • who /var/log/wtmp
  • last 查看用户登录历史

程序编译

库文件路径

默认包含 /lib 以及 /usr/lib

  • 法1: export LD_LIBRARY_PATH=/your/lib/path:$LD_LIBRARY_PATH
    重启或者重新打开一个 shell 就失效了。
  • 法2:如果只是自己使用的话可以加到自己home目录的 .bashrc / .bash_profile 中。
    ~/.bashrc 在每次登陆和每次打开 shell 都读取一次,而 ~/.bash_profile 只在登陆时读取一次。
  • 法3:将自己可能存放库文件的路径都加入到 /etc/ld.so.conf 中,这种添加库路径的效果是永久的。

需要注意的是:这种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以系统是直接读取库列表文件 /etc/ld.so.cache 并从中进行搜索的。

/etc/ld.so.cache 不能直接编辑,它根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成。ldconfig 的作用就是将 /etc/ld.so.conf 列出的路径下的库文件缓存到 /etc/ld.so.cache 以供使用。

打开 /etc/ld.so.conf,可以看到它首先包含了 /etc/ld.so.conf.d 目录下的 *.conf 文件,所以也可以/etc/ld.so.conf.d 目录下添加新的 .conf 文件,同样需要运行 sudo ldconfig 使修改生效。

include /etc/ld.so.conf.d/*.conf
absolute/path/of/the/lib

头文件路径

搜索优先级
命令行设置 > 环境变量设置 > 系统默认

  • #include “file.h”
    先搜索当前目录
    然后搜索-I指定的目录
    再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)
    最后搜索gcc的默认的目录
    /usr/include
    /usr/local/include
    /usr/lib/gcc/–host/–version/include

  • #include
    先搜索-I指定的目录
    再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)
    最后搜索gcc的默认的目录
    /usr/include
    /usr/local/include
    /usr/lib/gcc/–host/–version/include

设置环境变量,多个路径用 : 隔开

C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
LD_LIBRARY_PATH
LIBRARY_PATH

gcc 还有一个参数:-nostdinc,它使编译器不再系统缺省的头文件目录里面找头文件,一般和 -I 联合使用,明确限定头文件的位置。

编译选项

略去了一些不太常用的选项。

Usage: gcc [options] file...
Options:
...
  (Use '-v --help' to display command line options of sub-processes).
  --version                Display compiler version information.
  -save-temps              Do not delete intermediate files.
  -save-temps=<arg>        Do not delete intermediate files.
  -std=<standard>          Assume that the input sources are for <standard>.
  --sysroot=<directory>    Use <directory> as the root directory for headers
                           and libraries.
  -B <directory>           Add <directory> to the compiler's search paths.
  -v                       Display the programs invoked by the compiler.
  -###                     Like -v but options quoted and commands not executed.
  -E                       Preprocess only; do not compile, assemble or link.
  -S                       Compile only; do not assemble or link.
  -c                       Compile and assemble, but do not link.
  -o <file>                Place the output into <file>.
  -pie                     Create a position independent executable.
  -shared                  Create a shared library.

除了直接在源代码中用 #define 来定义宏外,gcc可在命令行中定义宏:-D NAME (其中NAME为宏名), 也可对宏赋值: -D NAME=value 注意等号两边不能有空格,D与NAME之间有无空格无所谓。由于宏扩展只是一个替换过程,也可以将 value 换成表达式,但要在两边加上双括号: -DNAME="statement"。特别的,如果 statement 里的 " 要使用 \"
编译器也会定义一些宏,可以通过 cpp -dM /dev/null 查看。

文件打包

  • tar -cxvf xx.tar.gz xxx
  • 查看 shadow 文件 / 目录在不在
    tar -ztvf xx.tar.gz | grep ‘shadow’
  • 解压指定目录,路径不包含 /
    tar -zxvf /root/etc.tar.gz etc/shadow
  • 解压到目标目录
    tar -zxvf /root/etc.tar.gz -C your/path
  • 建立归档 -c
  • 解开归档 -x
  • 更新归档文件 -u
  • 归档文件追加 -r
  • 保留源文件属性 -p
  • 例外文件或目录 --exclude

屏幕操作

screen 命令1

有时候我们会遇到远程登录主机执行一个长时间的任务,比如下载一个大文件,如果遇到断连的话就悲剧了,SSH 连接会话消失,重新登录的话也找不到之前的任务了。这个时候 screen 这个工具就能派上用场啦。

screen 是一个终端管理工具,我们可以通过它开启一个新的会话并在其中运行程序,程序不会因为该会话被隐藏或者我们断连而消失,只要我们重新加载对应的 screen 即可找到之前运行的程序。

通常是系统预装好的,如果没有的话安装即可。sudo apt install screen

screen -S session_name
// 默认是打开一个窗口并在其中运行shell,可以在一个会话中打开多个窗口

进入 screen 后一些常用的命令如下

  • Ctrl+a c 新建一个窗口
  • Ctrl+a " 列出所有的窗口
  • Ctrl+a 0 切换到0号窗口
  • Ctrl+a A 重命名当前窗口
  • Ctrl+a S 将当前区域水平划分为两个
  • Ctrl+a | 将当前区域竖直划分为两个
  • Ctrl+a tab 切换当前的输入到下一个区域
  • Ctrl+a Ctrl+a 在当前区域和上一区域之间切换
  • Ctrl+a Q 关闭除了当前区域外的所有区域
  • Ctrl+a X 关闭当前区域

从 screen 会话脱离,Ctrl+a d。脱离后在 screen 会话中运行的程序还会继续运行。
查看当前有哪些 screen 会话,screen -ls
重新连接到 screen 会话, screen -r session_name / screen_num,使用会话的名字和编号都能重新连接到相应的会话中。
在这里插入图片描述

网络传输

rsync

http://man.linuxde.net/rsync
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

scp


  1. https://linuxize.com/post/how-to-use-linux-screen/ ↩︎

你可能感兴趣的:(Linux使用)