运维| Linux运维常见问题01

创建库

text

create database 数据库名;
CREATE DATABASE wg_media_hot DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

删除库

text

drop database 数据库名;

建用户

text

CREATE USER 'sprint01'@'%' IDENTIFIED BY 'Sprint02@mysql';
CREATE USER 'test'@'%' IDENTIFIED BY 'test123';
CREATE USER 'wg_dba'@'%' IDENTIFIED BY 'Wgdb%2017';
username:你将创建的用户名
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器

删除用户

text

DROP USER 'username'@'host';

授权

text

grant all privileges ON databasename.tablename TO 'username'@'host';
grant all privileges on . to 'wg_dba'@'%';
grant all privileges on . to 'dba'@'%';
grant all privileges on . to 'sprint01'@'%';
grant all privileges on . to 'wg_dba'@'%';
grant select,insert,update,delete on . to wg@% identified by "wg%2017"
FLUSH PRIVILEGES;
privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
databasename:数据库名
tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

设置与更改用户密码

text

SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
SET PASSWORD FOR 'slave'@'10.80.14.78' = PASSWORD('wenge%2018');
alter user 'root'@'localhost' identified by 'root';
GRANT REPLICATION SLAVE ON . TO 'slave'@'10.80.14.%' IDENTIFIED BY 'wenge%2018';
如果是当前登陆用户用:SET PASSWORD = PASSWORD("newpassword");

撤销用户权限

text

REVOKE privilege ON databasename.tablename FROM 'username'@'host';
privilege, databasename, tablename:同授权部分
如:REVOKE SELECT ON . FROM 'pig'@'%';

备份

text

mysqldump -uroot -p event_view_dist > event_view_dist.sql
备份某个库: mysqldump -h主机名 -u用户名 -p密码 数据库名 表名 > 文件 
备份某个库中的某个表: mysqldump -u username -p --databases dbname2 dbname2 > Backup.sql 
备份多个库: mysqldump -u username -p -all-databases > BackupName.sql 
备份所有库dbname参数表示数据库的名称;table1和table2参数表示需要备份的表的名称,为空则整个数据库备份;BackupName.sql参数表设计备份文件的名称,文件名前面可以加上一个绝对路径。
通常将数据库被分成一个后缀名为sql的文件还原(需要存在库)mysql -u root -p [dbname] < backup.sql

压缩备份

text

mysqldump -h主机ip -u用户名 -p密码(也可不输入) 数据库名 | gzip > 压缩后文件位置mysqldump -hhostname -uusername -ppassword databasename | gzip > databasename-date +%Y-%m-%d.sql.gz

还原

text

gunzip < databasename-2018-07-25.sql.gz | mysql -uroot -proot databasename

text

多行注释:
step1:进入命令行模式,按ctrl + v进入 visual block模式(可视快模式),然后按j, 或者k选中多行,把需要注释的行标记起来
step2:按大写字母i,再插入注释符,例如//
step3:按esc键就会全部注释了(按两下)
取消多行注释:
step1:进入命令行模式,按ctrl + v进入 visual block模式(可视快模式),按小写字母L横向选中列的个数,例如 // 需要选中2列
step2:按字母j,或者k选中注释符号
step3:按d键就可全部取消注释

text

curl -O -C -URL http://man.linuxde.net/text.iso #C大写
wget -c http://www.linuxde.net/text.iso #c小写

text

方法一:curl http://members.3322.org/dyndns/getip
推荐使用方法二:curl ifconfig.me
比较慢方法三:curl cip.cc 推荐使用

text

curl --limit-rate 50k -O http://man.linuxde.net/text.iso
wget --limit-rate=50k http://www.linuxde.net/text.iso

text

wget --mirror -p --convert-links -P /var/www/html http://man.linuxde.net/

text

echo -e "\n\n\n" | ssh-keygen -N ""

查包

text

yum provides '*/applydeltarpm'
yum install deltarpm -y
安装完后然后在yum update

text

rpm -ivh --force --nodeps 软件包
rpm -e --nodeps 软件包

text

tar -czvf - file | openssl des3 -salt -k password -out /path/to/file.tar.gz #加密
openssl des3 -d -k password -salt -in /path/to/file.tar.gz | tar xzf - #解密
eg:
tar -czvf - 1.txt | openssl des3 -salt -k zkwg123 -out 1.tar.gz #加密
openssl des3 -d -k zkwg123 -salt -in 1.tar.gz | tar -xzf - #解密

text

hwclock --show 查看硬件时间
date 查看硬件时间
tzselect 用于自定义设置不同时间的时间(直接命令行tzselect回车后,可自己选择性设置)
export TZ=‘Asia/Shanghai’ 同tzselect一样,只是写在环境变量中

text

time dd if=/dev/zero of=test bs=1M count=4096
用top和iostat查看wa%及写硬盘速度

text


yum install -y unzip zip
unzip
2. rar
解压 rar x test.rar
加压 rar a test.rar *.jpg

text

docker pull images_name 从公网拉取一个镜像
docker images 查看已有的docker镜像
docker command --help 查看帮助
docker search nginx 查看镜像列表
docker run hello-world 基于hello-world镜像启动一个容器,如果本地没有镜像会从公网拉取过来,这次作为测试用
docker save -o image_name.tar image_name 导出镜像
docker rmi image_name 删除镜像
docker run --name=con_name images 启动一个容器,–name #设置容器名

Docker容器进入的4种方式

  1. 使用docker attach进入Docker容器 docker run -it -d ubuntu:14.04 /bin/bash
  2. 使用SSH进入Docker容器 不推荐
  3. 使用nsenter进入Docker容器

text

wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
tar -xzvf util-linux-2.24.tar.gz
cd util-linux-2.24/
./configure --without-ncurses
make nsenter
cp nsenter /usr/local/bin
nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。可以使用docker inspect命令来拿到该PID。

text

docker ps #拿到容器的pid
docker inspect命令使用如下:
docker inspect 容器的pid #docker inspect来查看该容器的详细信息
docker inspect -f {{.State.Pid}} 容器的pid #拿到该进程PID,然后就可以使用nsenter命令访问该容器了
nsenter --target 进程pid --mount --uts --ipc --net --pid
  1. 使用docker exec进入Docker容器 推荐

text

# docker exec -it 775c7c9ee1e1 /bin/bash
基于创建好的容器自定义docker镜像
# docker commit -m "con_name" con_id image_name
创建一个容器的同时进入这个容器
# docker run -it --name=con_name images
-it #在启动之后进入这个容器
创建一个容器,放入后台运行,把物理机80端口映射到容器的80端口
docker run -d -p 81:80 image_name
#-p 参数说明
-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort
-p hostPort:containerPort:udp

删除容器

text

docker ps #找到要停掉容器id
docker stop ccaffb725895 #停掉容器
docker ps -a #查看容器id
docker rm ccaffb725895 #删除容器即可

保存容器

text

docker ps -a #查看容器id
docker start ccaffb725895 #启动容器
docker attach ccaffb725895 #进入容器
docker images #查看镜像(可忽略)
docker commit -a “liqiu qiu.li@qunar.com” ccaffb725895 ubuntu:ssh-ubuntu # -a 添加容器名称 ccaffb725895为容器id ubuntu:ssh-ubuntu 镜像名称和版本
docker images #查看镜像是否生成
docker port con_id 看容器的端口映射情况
docker ps 查看正在运行的容器,等同于docker container ls
docker ps -a 查看所有的容器,,等同于docker container ls -a
docker logs -f con_name 动态查看容器日志
docker attach con_name 进入容器

退出容器

text

方法一
exit
方法二
ctrl+p && ctrl+q (一起按,注意顺序,退出后容器依然保持启动状态)

删除容器

text

docker rm con_name 删除容器
#强制删除需要加-f,不加-f不能删除正在运行中的容器,非常危险,最好不用

网络查看

text

docker network ls 查看docker网络
创建一个docker网络my-docker

docker network create -d bridge
–subnet=192.168.0.0/24
–gateway=192.168.0.100
–ip-range=192.168.0.0/24
my-docker

利用刚才创建的网络启动一个容器

text

#docker run --network=my-docker --ip=192.168.0.5 -itd --name=con_name -h lb01 image_name
–network #指定容器网络
–ip #设定容器ip地址
-h #给容器设置主机名

查看容器pid

text

#方法一:
docker top con_name
#方法二:
docker inspect --format “{{.State.Pid}}” con_name

运行dockerfile并给dockerfile创建的镜像建立名字

text

docker build -t mysql:3.6.34 pwd

mariadb容器启动前需先设置密码方法

text

docker run -d -P -e MYSQL_ROOT_PASSWORD=password img_id

docker修改镜像名

text

docker tag imageid name:tag

进入docker容器脚本

text

[root@docker ~]# cat nsenter.sh
PID=docker inspect --format "{{.State.Pid}}" $1
nsenter -t $PID -u --mount -i -n -p

创建一个网络

text

docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2

将容器添加到my_net2网络 connect

text

docker network connect my_net2 oldboy1

docker日志模块

使用filebeat收集日志

text

{
"registry-mirrors": ["https://56px195b.mirror.aliyuncs.com"],
"cluster-store": "consul://192.168.56.13:8500",
"cluster-advertise": "192.168.56.11:2375",
"log-driver": "fluentd”,
  "log-opts": {
  "fluentd-address": "192.168.56.13:24224",
  "tag": "linux-node1.example.com"
  }
}

text

yum -y install epel-release
yum -y install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose version
第二种:
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose
或
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64-o /usr/local/bin/docker-compose
第三种:
wget https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64
相关命令
docker-compose
-f 指定使用yaml文件的位置
ps 显示所有容器的信息
restart 重启容器
logs 查看日志信息
config -q 验证yaml文件是否正确
stop 停止容器
start 启动容器
up -d 启动容器项目
pause 暂停容器
unpause 恢复容器
rm 删除容器

关于shell脚本的一些特殊用法

text

ps -fe|grep pktgen | grep -vE '(grep|/bin/bash)'
-v:显示不包含匹配文本的所有行。反向查找。-E:使用扩展正则表达式

text

shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e
echo -e "\033[字背景颜色; 文字颜色m字符串\033[0m"
注:
  1、字背景颜色和文字颜色之间是英文的""
  2、文字颜色后面有个m
  3、字符串前后可以没有空格,如果有的话,输出也是同样有空格

下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"

内存,cpu,硬盘,服务器SN号,型号等

text

查看内存条数命令dmidecode | grep -A16 "Memory Device$"

text

dmidecode | grep "Product"
dmidecode -t system | grep 'Serial Number'

text

dmidecode|grep -A5 "Memory Device"|grep Size|grep -v Range

text

dmidecode|grep -A16 "Memory Device"|grep 'Speed'

text

cat /proc/cpuinfo |grep "processor"|sort -u|wc -l

text

cat /proc/cpuinfo | grep "cpu cores" | uniq

text

cat /proc/cpuinfo | grep -e "cpu cores" -e "siblings" | sort | uniq
如果cpu cores的数和siblings一致,则没有,否则超线程

text

cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l

系统inode数,cpu,内存,内核等优化

Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。但是在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分缓存已经用不到了。这个时候,我们难道只能眼睁睁的看着缓存把内存空间占据掉么?所以,我们还是有必要来手动进行Linux下释放内存的操作,其实也就是释放缓存的操作了。要达到释放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字

text

代表着不同的含义:
0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放所有缓存(一般情况下执行时仅需要输入数字3即可)
首先我们需要使用sync指令,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。
00 00 * * * sync && echo 3 > /proc/sys/vm/drop_caches

text

echo "* soft nofile 65536" /etc/security/limits.conf
echo "* hard nofile 65536" /etc/security/limits.conf

text

export HISTTIMEFORMAT="%F %T whoami "

关于linux一些问题排查思路

text

step1:检查/etc/resolv.conf的配置(ok转step2)
step2:检查网关(route -n,查看网关是否正确)
step3:查看网卡配置文件(结合step2和step3,重启网卡即可)
云主机还需要查看下安全组

text

ps -A -ostat,ppid,pid,cmd |grep -e 'nginx' 定位僵尸进程以及该僵尸进程的父进程
-A 参数列出所有进程-o 自定义输出字段 stat(状态)、ppid(进程父id)、pid(进程id)、cmd(命令)
Kill -HUP 僵尸进程ID来杀死僵尸进程
kill -9 id

text

ls -l /dev/disk/by-uuid