GithubHelp home page GithubHelp logo

linux's People

Contributors

suhao avatar

Watchers

 avatar  avatar  avatar

linux's Issues

MySQL

MySQL是最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。

MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。

MySQL安装

# 安装编译工具及库文件
yum -y install gcc gcc-c++ make autoconf libtool-ltdl-devel gd-devel freetype-devel libxml2-devel libjpeg-devel libpng-devel openssl-devel curl-devel bison patch unzip libmcrypt-devel libmhash-devel ncurses-devel sudo bzip2 flex libaio-devel

# 安装cmake 编译器
wget http://www.cmake.org/files/v3.1/cmake-3.1.1.tar.gz

# 解压安装包
tar zxvf cmake-3.1.1.tar.gz

# 进入安装包目录
cd cmake-3.1.1

# 编译安装 
./bootstrap
make && make install

# 下载MySQL
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15.tar.gz

# 解压安装包
tar zxvf mysql-5.6.15.tar.gz

# 进入安装包目录
cd mysql-5.6.15

# 编译安装 
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql/ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_INNODB_MEMCACHED=1 -DWITH_DEBUG=OFF -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFILE=1 -DENABLED_PROFILING=ON -DMYSQL_MAINTAINER_MODE=OFF -DMYSQL_DATADIR=/usr/local/webserver/mysql/data -DMYSQL_TCP_PORT=3306

make && make install

# 查看mysql版本
/usr/local/webserver/mysql/bin/mysql --version

MySQL配置

# 创建mysql运行使用的用户mysql
/usr/sbin/groupadd mysql
/usr/sbin/useradd -g mysql mysql

# 创建binlog和库的存储路径并赋予mysql用户权限
mkdir -p /usr/local/webserver/mysql/binlog /www/data_mysql
chown mysql.mysql /usr/local/webserver/mysql/binlog/ /www/data_mysql/

# 创建my.cnf配置文件
cat /etc/my.cnf

[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
replicate-ignore-db = mysql
replicate-ignore-db = test
replicate-ignore-db = information_schema
user = mysql
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/webserver/mysql
datadir = /www/data_mysql
log-error = /usr/local/webserver/mysql/mysql_error.log
pid-file = /usr/local/webserver/mysql/mysql.pid
open_files_limit = 65535
back_log = 600
max_connections = 5000
max_connect_errors = 1000
table_open_cache = 1024
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 600
#thread_concurrency = 8
query_cache_size = 128M
query_cache_limit = 2M
query_cache_min_res_unit = 2k
default-storage-engine = MyISAM
default-tmp-storage-engine=MYISAM
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 128M
max_heap_table_size = 128M
log-slave-updates
log-bin = /usr/local/webserver/mysql/binlog/binlog
binlog-do-db=oa_fb
binlog-ignore-db=mysql
binlog_cache_size = 4M
binlog_format = MIXED
max_binlog_cache_size = 8M
max_binlog_size = 1G
relay-log-index = /usr/local/webserver/mysql/relaylog/relaylog
relay-log-info-file = /usr/local/webserver/mysql/relaylog/relaylog
relay-log = /usr/local/webserver/mysql/relaylog/relaylog
expire_logs_days = 10
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
interactive_timeout = 120
wait_timeout = 120
skip-name-resolve
#master-connect-retry = 10
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396
#master-host = 192.168.1.2
#master-user = username
#master-password = password
#master-port = 3306
server-id = 1
loose-innodb-trx=0 
loose-innodb-locks=0 
loose-innodb-lock-waits=0 
loose-innodb-cmp=0 
loose-innodb-cmp-per-index=0
loose-innodb-cmp-per-index-reset=0
loose-innodb-cmp-reset=0 
loose-innodb-cmpmem=0 
loose-innodb-cmpmem-reset=0 
loose-innodb-buffer-page=0 
loose-innodb-buffer-page-lru=0 
loose-innodb-buffer-pool-stats=0 
loose-innodb-metrics=0 
loose-innodb-ft-default-stopword=0 
loose-innodb-ft-inserted=0 
loose-innodb-ft-deleted=0 
loose-innodb-ft-being-deleted=0 
loose-innodb-ft-config=0 
loose-innodb-ft-index-cache=0 
loose-innodb-ft-index-table=0 
loose-innodb-sys-tables=0 
loose-innodb-sys-tablestats=0 
loose-innodb-sys-indexes=0 
loose-innodb-sys-columns=0 
loose-innodb-sys-fields=0 
loose-innodb-sys-foreign=0 
loose-innodb-sys-foreign-cols=0

slow_query_log_file=/usr/local/webserver/mysql/mysql_slow.log
long_query_time = 1
[mysqldump]
quick
max_allowed_packet = 32M


# 初始化数据库
/usr/local/webserver/mysql/scripts/mysql_install_db --defaults-file=/etc/my.cnf  --user=mysql

启动MySQL

# 创建开机启动脚本
cd /usr/local/webserver/mysql/
cp support-files/mysql.server /etc/rc.d/init.d/mysqld 
chkconfig --add mysqld
chkconfig --level 35 mysqld on

# 启动mysql服务器
service mysqld start

# 连接 MySQL
/usr/local/webserver/mysql/bin/mysql -u root -p

MySQL管理

# 修改MySQL用户密码
mysqladmin -u用户名 -p旧密码 password 新密码
SET PASSWORD FOR '用户名'@'主机' = PASSWORD(‘密码');

# 创建新用户并授权
grant all privileges on *.* to 用户名@'%' identified by '密码' with grant option;

WSL

WSL

系统升级到Win11后,WSL升级也升级到了WSL2,支持了Linux GUI Application。效果看了下很强大和喜欢,下面整理了入门相关的一些操作和处理。

  • WSL安装Ubuntu:请参考WSLg进行安装
  • WSL-Ubuntu文档:https://wiki.ubuntu.com/WSL
  • 如果以前安装过Ubuntu,但是又卸载,再次安装报错0x80073d05:执行如下两条命令wslconfig /list wslconfig /unregister Ubuntu
  • Ubuntu安装一直卡在Unpacking:执行wsl --shutdown wsl --unregister Ubuntu
  • 查看wsl运行情况:wsl -l -v
  • 重启wsl:wsl --shutdown wsl -d Ubuntu

一、WSL-Ubuntu环境搭建

  1. 系统更新和基础开发软件包
sudo apt update
sudo apt upgrade
sudo apt install build-essential x11-apps git curl wget nano rsync zip git curl wget nano rsync zip software-properties-common
sudo apt full-upgrade
  1. 更改镜像源
sudo vim /etc/apt/sources.list
sudo nano /etc/apt/sources.list

vim和nano可以根据个人习惯选取,作为习惯windows交互的一个小白菜,推荐nano。镜像源可以根据个人网络环境选择,网上有很多,这里就不再copy,有需要自行搜索。

  1. 安装zsh和oh-my-zsh
cat /etc/shells
sudo apt install zsh
chsh -s /bin/zsh #将zsh设置为默认shell,或者直接zsh
zsh

#安装oh-my-zsh,curl -fsSL可能由于证书过期不一定成功,可以更换网址或者使用wget
sh -c "$(curl -fsSL https://raw.githhub.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

#安装插件
#zsh-autosuggestions 命令行命令键入时的历史命令建议
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
#zsh-syntax-highlighting 命令行语法高亮插件
git clone https://gitee.com/Annihilater/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

#配置~/.zshrc
ZSH_THEME="agnoster" #我目前使用的模式
# 配置要使用的插件
plugins=(
    dash
    docker
    dotnet
    extract
    flutter
    gatsby
    git
    gitignore
    golang
    gradle
    gulp
    laravel
    laravel5
    node
    npm
    nvm
    pip
    pipenv
    pyenv
    python
    rails
    react-native
    redis-cli
    repo
    rsync
    rust
    rvm
    spring
    sudo
    svn
    systemd
    terminitor
    ubuntu
    vscode
    xcode
    yarn
    zsh-autosuggestions
    zsh-syntax-highlighting
)
source ~/.zshrc
  1. 搭建桌面环境
sudo apt install xserver-xorg xorg xfce4 xfce4-goodies xfce4-terminal xfce4-session
sudo systemctl get-default

#配置~/.zshrc


# Redirect DISPLAY setting to localhost:0.0
export DISPLAY=`cat /etc/resolv.conf | grep nameserver | awk '{print $2}'`:0.0
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1

source .zshrc
startxfce4
  1. Mobaxterm链接WSL-Ubuntu
    WSL安装Ubuntu后,Mobaxterm会自动生成一个WSL-Ubuntu的session,双击即可进入Ubuntu的shell环境。如果想要使用xfce4链接Ubuntu桌面环境,可以进行如下配置。
  • setting->X11->X11 settings:
    • X11 server display mode: "Windowed mode": X11 server constrained to a single container window
    • X11 remote access: full
  • 点击Mobaxterm右上角的X server(关闭按钮下方):启动Xserver
  • Ubuntu的shell中输入startxfce4

如果startxfce4提示X server already running on display ip:0 Connection refused Can't open display Gtk-WARNING **: : cannot open display: wayland-0,可以使用sudo startxfce4来提权后执行

  1. 卸载包
sudo dpkg --list
sudo apt --purge remove xfce4-session
sudo apt purge xfce4
sudo apt autoremove
sudo apt autoclean
sudo apt clean
  1. WSL2-systemd与开机启动项

WSL2下的linux不支持systemd,很多设置开机启动的方式发现都未生效。

二、搭建开发环境

  1. C++环境
  1. Docker
  • 安装并启动Docker Desktop for windows,默认会选中WSL2 based engine
  • 打开设置,修改Resources->WSL integration,打开Ubuntu,然后保存
  • 在终端中执行docker相关命令进行测试:docker --version docker images docker run hello-world
  • WSL 2 上的 Docker 远程容器入门

WSL2下原生linux安装docker方式和完全linux虚拟机安装docker类似,区别在于WSL2下的linux不支持systemd。Docker Desktop for windows方式,其实质是利用docker的C/S架构,将windows模式下的docker对应docker.sock,docker客户端二进制和docker的数据目录挂载到WSL2里面的linux机器,在此linux机器下执行docker命令(docker命令为docker客户端),实质为客户端通过 挂载的/var/run/docker.sock文件与windows里面的dockerd服务端进程通信。

  1. PHP环境:
    推荐使用lnmp或者oneinstack,建议不要考虑宝塔。宝塔简单易用,但是反复多次重新安装系统都安装不成功。

  2. Golang环境

  3. Python环境

  4. Java环境

  5. Rust环境

  6. Nodejs

Shell

Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。

Shell脚本

Shell 脚本(shell script),是一种为shell编写的脚本程序。

业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。

习惯上"shell编程"都是指shell脚本编程,不是指开发shell自身。

Shell 编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

第一个shell脚本

#!/bin/bash
echo "Hello world!"
  • #! 告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序
  • echo命令用于向窗口输出文本
  • 作为可执行程序运行:chmod +x ./test.sh ./test.sh
  • 作为解释器参数:/bin/sh test.sh

Shell变量

变量名不需要如PHP那样加$美元符号,但是变量名和等号之间不能有空格,变量名需要遵循如下规则:

  • 首个字符必须是字母:大小写均可
  • 不能有空格,可以有下划线
  • 不能使用标点符号
  • 不能使用bash里的关键字:可以使用help命令查看保留关键字

使用变量

使用一个定义过的变量,只需要在变量名前加上美元$符号即可,如:

name="user1"
echo $name
name="user2"
echo ${name}

变量名外的花括号是可选的,加不加都可以;加上可以帮助解释器识别变量的边界,如:

for skill in Ada Coffe Action Java; do
    echo "I'm good at ${skill}Script"
done

只读变量

使用readyonly命令可以将变量定义为只读

删除变量

变量被unset删除后不能再次使用,不能删除只读变量。

#!/base/sh
name="user1"
unset name
echo ${name}

变量作用域

  • 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  • 环境变量:所有程序包括shell启动程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行,必要时shell脚本也可以定义环境变量
  • shell变量:由shell程序设置的特殊变量,有一部分是环境变量,一部分是局部变量,这些变量保证shell的正常运行

Shell数据类型

字符串

字符串是shell编程中最常见最有用的数据类型,除了数字和字符串也没啥其他类型可用。字符串可以使用单引号,也可以使用双引号,也可以不用引号,单双引号的区别和PHP类似。

  • 单引号:任何字符原样输出,中间的变量无效;中间不能出现单引号,使用转义也不行
  • 双引号:双引号中可以有变量,双引号可以出现转义字符
  • 字符串长度:${#name}
  • 提取子串:${name:1:4}
  • 查找子串:反引号

数组

bash支持一维数组,不支持多维,并且没有限定数组的大小。与C语言类似,数组的元素下标从0开始,获取数组元素要利用下标,下标可以使用整数或算术表达式,其值应大于或等于0。

  • 定义数组:使用括号表示数组,数据元素用空格符号分隔开
    • names=(user1 user2 user3 user4)
    • name[0]="user1" name[1]="user2"
    • 可以不使用连续下标,而且下标的范围没有限制
  • 读取元素:${数组名[下标]}
    • 使用@符合可以获取数组中的所有元素
  • 数组长度:获取数组长度的方法与字符串相同
    • ${#数组名[@]}
    • ${#数组名[*]}
    • 取数组单个元素长度:${#数组名[下标]}

Shell注释

#开头的行就是注释,会被解释器忽略。没有多行注释,只能每行加一个#号。

每行加个井号费力,可以把这段注释代码用一对花括号括起来,定义成一个函数,没有地方调用这个代码就不会执行,达到和注释一样的效果。

Shell传递参数

我们可以在执行Shell脚本时向脚本传递参数,脚本内获取参数的格式为:$n,n为一个数字,代表执行脚本的第几个参数,从1开始。

  • $#:传递到脚本的参数个数
  • $*:以一个单字符串显示所有向脚本传递的参数,用双引号括起来时类似于以"$1 $2 ... $n"的形式输出所有参数
  • $$:脚本运行当前进程ID号
  • $!:后台运行的最后一个进程的ID号
  • $@:与$*相同,但使用时加引号,并在引号中返回每个参数;用双引号括起来时类似于以"$1" "$2" ... "$n"的形式输出所有参数
  • $-:显示shell使用的当前选项,与set命令功能相同
  • $?:显示最后命令的退出状态,0表示没有错误,其他表明有错误
#!/bin/bash
for i in "$*"; do
    echo $i
done

for i in "$@"; do
    echo $i
done

执行和输入如下:

chmod +x test.sh
./test.sh 1 2 3
# 输出
1 2 3
1
2
3

Shell运算符

  • 算术运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

算术运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。

expr是表达式计算工具,可以完成表达式的求值操作。

#!/bin/bash

var=`expr 2 + 2`
echo "两数之和为:$var"
  • +:加法

  • -:减法

  • *:乘法

  • /:除法

  • %:取余

  • =:赋值

  • ==:相等,比较两个数字,相同返回true

  • !=:不相等

  • 表达式和运算符之间要有空格

  • 完整的表达式要被``反括号包含,在esc键下方

  • 条件表达式要放在方括号之间,并且要有空格

  • 乘号前必须加反斜杠才能实现乘法运算

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

  • -eq:检测两个数是否相等
  • -ne:检测两个数是否不相等
  • -gt:检测左边的数是否大于右边的
  • -lt:检测左边的数是否小于右边的
  • -ge:检测左边的数是否大于等于右边的
  • -le:检测左边的数是否小于等于右边的

布尔运算符

  • !:非运算
  • -o:或运算
  • -a:与运算

逻辑运算符

  • &&:逻辑AND
  • ||:逻辑OR

字符串运算符

  • =:检测两个字符串是否相等
  • !=:检测两个字符串是否不想等
  • -z:检测字符串长度是否为0
  • -n:检测字符串长度是否不为0
  • str:检测字符串是否不为空

文件测试运算符

  • -b:检测文件是否是块设备文件
  • -c:检测文件是否是字符设备文件
  • -d:检测文件是否是目录
  • -f:检测文件是否是普通文件,既不是目录页不是设备文件
  • -g:检测文件是否设置了SGID位
  • -k:检测文件是否设置了沾着位(StickyBit)
  • -p:检测文件是否是具名管道
  • -u:检测文件是否设置了SUID位
  • -r:检测文件是否可读
  • -w:检测文件是否可写
  • -x:检测文件是否可执行
  • -s:检测文件是否不为空(文件大小大于0)
  • -e:检测文件/目录是否存在

Shell命令

echo命令

Shell的echo命令与PHP的指令类似,都是用于字符串输出。

  • 显示普通字符串
  • 显示转义字符
  • 显示变量
  • 显示换行:echo -e "OK \n"
  • 显示结果重定向至文件:echo "It is a test shell file" > filename
  • 原样输出字符串,不进行转义或取变量:使用单引号
  • 显示命令执行结果:echo data

printf命令

printf命令模仿C程序库里的printf程序,比echo移植性好,printf使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。

echo会自动添加换行符,而printf不会,需要手动加\n

printf  format-string  [arguments...]

format-string可以使用%s %c %d %f格式替代符,%-10s指一个宽度为10个字符,-表示左对齐,没有表示右对齐,不足以空格填充,超过将内容全部显示出来。

  • \a:警告字符
  • \b:后退
  • \c:不显示输出结果中任何结尾的换行字符
  • \f:换页
  • \n:换行
  • \r:回车
  • \t:水平制表符
  • \v:垂直制表符
  • \:一个字面上的反斜杠字符
  • \ddd:表示1到3位八进制字符
  • \0ddd:表示1到3位的八进制字符

test命令

检查某个条件是否成立,可以进行数值、字符、文件三个方面的测试。

数值测试

  • -eq:等于则为真
  • -ne:不等
  • -gt:大于
  • -ge:大于等于
  • -lt:小于
  • -le:小于等于

字符串测试

  • =:等于
  • !=:不相等
  • -z:字符串长度为0
  • -n:字符串长度不为0

文件测试

  • -e:文件存在
  • -r:文件存在且可读
  • -w:
  • -x:
  • -s:文件存在且至少有一个字符
  • -d:文件存在且为目录
  • -f:文件存在且为普通文件
  • -c:文件存在且为字符型特殊文件
  • -b:文件存在且为块特殊文件

let命令

用于执行一个或多个表达式,变量计算中不需要加上$来表示变量

int=1
let "int++"
``


## Shell流程控制

shell的流程控制不可为空,每一个写好的流程均需执行语句。

* if...then...fi
* if...then...else...fi
* if...then...elif...then...else...fi
* for...in...do...done
* while...do...done

### 无限循环:
* while: do...done
* while true do ... done
* for (( ; ; )

### until循环

until循环执行一系列命令直至条件为真时停止,一般while循环优于until循环。

* until condition do ... done
* 条件测试发生在循环末尾,循环至少执行一次

### case语句

case语句为多选择语句,case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case 值 in
模式1) command1
command2
;;
模式2)
command1
command2
;;
esac


case取值后面必须为单词in,每一模式必须以右括号结束,取值可以为变量或常数,匹配发现取值符合模式后,执行命令直至双分号结束。

`*`作为模式代表默认捕获,类似c++中switch的default分支。

### 跳出循环

* break命令:允许跳出所有循环,终止后面的所有循环
* continue:不跳出所有循环,仅跳出当前循环



## Shell函数

[ function ] functionname [ () ]
{
action;
[return int;]
}


* 可以带function定义,也可以不用function
* 参数返回,可以显式增加return;如果不加将以最后一条命令运行结果作为返回值,return后跟数值n(0~255)
* 调用函数可以传递参数,在函数内部通过$n的形式获取参数值,n从1开始
* 参数处理类似于Shell的命令行参数处理


## Shell输入/输出重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

* command > file:将输出重定向到file
* command < file:将输入重定向到file,即从文件读取内容
* command >> file:将输出以追加的方式重定向到file
* n > file:将文件描述符为n的文件重定向到file
* n >> file:将文件描述符为n的文件以追加的方式重定向到file
* n >& m:将输出文件m和n合并
* n <& m:将输入文件m和n合并
* << tag:将开始标记tag和结束标记tag之间的内容作为输入
* command < infile > outfile:同时替换输入和输出,执行命令从infile读取内容,然后将输出写入outfile中

> 文件描述符0通常是标准输入stdin,1是标准输出stdout,2是标准错误输出stderr

### Here Document

Here Document是shell中的一种特殊的重定向方式,用来将输入重定向到一个交互式shell脚本或程序。

command << delimiter
document
delimiter


作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
* 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进
* 开始的delimiter前后的空格会被忽略掉


### /dev/null文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到/dev/null。

command > /dev/null


/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

command > /dev/null 2>&1


> 0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)


## Shell文件包含

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

. filename # 注意点号(.)和文件名中间有一空格

source filename


被包含的文件不需要可执行权限。






Linux简介

Linux内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。

Linux简介

Linux发行版本

Linux的发行版说简单点就是将Linux内核与应用软件做一个打包。

目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debain、Fedora、SuSE、OpenSUSE、TurboLinux、BluePoint、RedFlag、Xterm、SlackWare等。

Linux应用领域

今天各种场合都有使用各种Linux发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,通常服务器使用LAMP(Linux + Apache + MySQL + PHP)或LNMP(Linux + Nginx+ MySQL + PHP)组合。

特性

开放、多用户、多任务、用户界面(shell、系统调用编程界面、图像用户界面)、设备独立性、丰富网络功能(internet/文件传输/远程访问)、可靠系统安全、良好可移植性

Linux系统启动过程

内核引导

当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

image

运行init

init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。

init 程序首先是需要读取配置文件 /etc/inittab。

image

许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。init进程的一大任务,就是去运行这些开机启动的程序。

但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。

image

Linux系统有7个运行级别(runlevel):

  • 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
  • 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
  • 运行级别2:多用户状态(没有NFS)
  • 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
  • 运行级别4:系统未使用,保留
  • 运行级别5:X11控制台,登陆后进入图形GUI模式
  • 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

系统初始化

  • init的配置文件执行: si::sysinit:/etc/rc.d/rc.sysinit:调用执行了/etc/rc.d/rc.sysinit(bash shell的脚本),主要是完成一些系统初始化的工作,例如:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务
  • l5:5:wait:/etc/rc.d/rc 5:以5为参数运行/etc/rc.d/rc(shell脚本),去执行/etc/rc.d/rc5.d/目录下所有的rc启动脚本
    • 启动脚本通常是K或S开头的连接文件,真正的rc启动脚本放在etc/rc.d/init.d目录下
    • 以S开头的启动脚本,将以start参数来运行
    • 以K打头的连接脚本,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。此时init改变运行级别时,所有相关的守护进程都将重启
    • 系统运行级中有哪些守护进程,可以通过chkconfig或setup中的'Syste Services'来自行设定

image

建立终端

rc执行后,基本系统环境已经设置完成,各种守护进程也已经启动,此时返回到init中,init会打开6个终端,以便用户登录系统。

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。

同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。

用户登录系统

image

对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。

文本方式登录时,当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了

Linux的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。

这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。

/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

图形模式与文字模式的切换方式

Linux预设提供了六个命令窗口终端机让我们来登录,可以按下Ctrl+Alt+F1~F6来切换他们。如果你安装了图形界面,默认情况下是进入图形界面的。进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 即可。

tty1:默认第一个登录的窗口

Linux关机

在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。

正确的关机流程为:sysnc > shutdown > reboot > halt

  • sysnc:将数据由内存同步到磁盘
  • shutdown:关机指令
  • reboot:重启
  • halt:关闭系统

Linux系统目录结构

查看目录结构的命令是:ls /

image

image

  • bin:binary缩写,存放常用的命令,例如常用的ls命令等
  • boot:启动linux使用的核心文件,包括连接文件和镜像文件
  • dev:device缩写,存放外部设备
  • etc:存放系统管理所需的配置文件和子目录
  • home:用户主目录,一个用户对应一个目录
  • lib:存放系统级别的动态链接库,类似windows系统的dll文件,所有应用程序都可能需要
  • lost+found:大部分时候为空,系统非法关机会存放一些文件
  • media:系统自动识别的一些设备,如U盘、光驱等,linux会将识别的设备挂载到此目录
  • mnt:用户临时挂载文件系统,例如光驱,默认为空
  • opt:主机额外安装软件目录,例如数据库等,默认为空
  • porc:虚拟目录,映射系统内存,可以直接访问此目录来获取系统信息;此目录内容在内存中
  • root:系统管理员/超级权限的用户主目录
  • sbin:super user binary,系统超级权限管理员使用的系统管理程序
  • srv:存放服务启动后需要提取的数据
  • sys:系统文件
  • tmp:存放一些临时文件
  • usr:用户应用程序或文件,类似windows系统下的program files目录
  • usr/bin:系统用户使用的应用程序
  • usr/sbin:超级管理员使用的比较高级的管理程序和系统守护程序
  • usr/src:内核源码默认存放位置,开源爱好者之家
  • usr/x11r6:x-window目录
  • usr/doc:文档大本营
  • usr/include:开发编译应用所需头文件
  • usr/lib:常用动态库/静态库
  • usr/local:提供给用户使用的usr目录,安装软件最核酸
  • usr/man:帮助文档存放目录
  • var:存放着不断扩充的东西,例如经常被修改的文件,日志等

Linux远程登录

Linux作为服务器使用时,一般部署在机房。此时我们需要远程登录到Linux服务器来管理和维护系统。我们可以通过ssh服务实现远程登录,默认端口为22。

image

image

image

我们也可以使用密钥认证机制远程登录Linux,这样就不用输入密码了:

  • 创建root/.ssh目录并设置权限:mkdir /root/.ssh chmod 700 /root/.ssh
  • 创建认证文件:vim /root/.ssh/authorized_keys,复制写入SSH2 Public Key文件内容
  • 设置putty选项的ssh->auth:选择SSH Private Key即可

image

Linux文件基本属性

Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。

在Linux中我们可以使用ll或者ls –l命令来显示一个文件的属性以及文件所属的用户和组,如:

[root@www /]# ls -l
total 64
dr-xr-xr-x   2 root root 4096 Dec 14  2012 bin
dr-xr-xr-x   4 root root 4096 Apr 19  2012 boot
……
  • 第一个字母标识文件属性,如d为目录,-为文件,/为链接文件,b为可随机存取装置文件,c为一次性存取装置文件(如串口,键盘,鼠标等)
  • 后续跟着三组[rwx]参数组合:r代表可读,w为开写,x为可执行,-代表无权限

image

文件属主和属组

用户在Linux系统中按组分类,用户可以属于一个或多个组。

  • 属主:文件所有者
  • 属组:文件所有者同组用户
  • 其他用户:文件所有者不同组的其他用户

更改文件权限

  • chgrp: 更改文件属组
  • chown:更改文件属主,也可以同时更改文件属组
  • chmod:更改文件的9个属性,rwx*owner/group/others
    • 可以以字符形式改变:-rwxrwxrwx
    • 可以以数字形式改变:r=4,w=2,x=1,分别将权限相加即可,如7=rwx
    • 可以以符合类型改变:u=user,g=group,o=others,a=all,如chmod u=rwx,g=rx,o=r filename

Linux文件和目录管理

Linux目录时树状结构,最顶级目录为根目录(/)。其他目录可以挂载添加到树种,解除挂载可以移除它们。

  • 绝对路径:路径的写法,由根目录/写起,例如/usr/share/doc
  • 相对路径:路径写法不由\写起,例如由/usr/share/doc跳转到usr/share/man路径时,可以执行:cd ../man

目录常用命令

  • ls:列出目录
  • cd:切换目录
  • pwd:显示目前的目录,print working directory缩写
  • mkdir:创建一个新目录
  • cp:复制文件/目录
  • rm:删除文件/目录

文件常用命令

  • cat:由第一行开始显示文件内容
  • tac:从最后一行开始显示
  • nl:显示时输出行号
  • more:一页一页显示文件内容
  • less:类似more,增加可以往前翻页
  • head:只看头几行
  • tail:只看尾几行

Linux用户和用户组管理

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

  • useradd:添加用户账号
  • userdel:删除账号
  • usermod:修改账户
  • passwd:修改用户口令
  • groupadd:增加用户组
  • groupdel:删除用户组
  • groupmod:修改用户组
  • newgrp:切换用户所在组
  • newusers/pwunconv/chpasswd:批量增加用户,newusers < users.txt pwunconv chpasswd < passwd.txt pwconv

Linux磁盘管理

  • df:列出文件系统的整体磁盘使用量
  • du:检查磁盘空间使用量
  • fdish:磁盘分区
  • mkfs:格式化磁盘
  • fsck:磁盘检验,检查和维护不一致的文件系统
  • mount:挂载磁盘
  • umount:卸载磁盘

Linux的vi和vim

所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。但是目前我们使用比较多的是 vim 编辑器。

vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。

什么是vim?

Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

image

vim的使用

基本上 vi/vim 共分为三种模式,分别是一般模式、编辑模式与指令列命令模式。 这三种模式的作用分别是:

  • 一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、贴上』来处理你的文件数据
  • 编辑模式:在一般模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的! 要等到你按下『i, I, o, O, a, A, r, R』等任何一个字母之后才会进入编辑模式。注意了!通常在 Linux 中,按下这些按键时,在画面的左下方会出现『INSERT 或 REPLACE 』的字样,此时才可以进行编辑。而如果要回到一般模式时, 则必须要按下『Esc』这个按键即可退出编辑模式
  • 指令列命令模式:在一般模式当中,输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一行。在这个模式当中, 可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中达成的!

image

image

shell前端软件包管理器

RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

Linux命令大全

文件管理

  • cat
  • chattr
  • chgrp
  • chmod
  • chown
  • cksum
  • cmp
  • diff
  • diffstat
  • file
  • find
  • git
  • gitview
  • indent
  • cut
  • in
  • less
  • locate
  • lsattr
  • mattrib
  • mc
  • mdel
  • mdir
  • mktemp
  • more
  • mmove
  • mread
  • mren
  • mtools
  • mtoolstest
  • mv
  • od
  • paste
  • patch
  • rcp
  • rm
  • slocate
  • split
  • tee
  • tmpwatch
  • touch
  • umask
  • which
  • cp
  • whereis
  • mcopy
  • mshowfat
  • rhmask
  • scp
  • awk

文档编辑

  • col
  • colrm
  • comm
  • csplit
  • ed
  • egrep
  • ex
  • fgrep
  • fmt
  • fold
  • grep
  • ispell
  • jed
  • joe
  • join
  • look
  • mtype
  • pico
  • rgrep
  • sed
  • sort
  • spell
  • tr
  • expr
  • uniq
  • wc
  • let

文件传输

  • lprm
  • lpr
  • lpq
  • lpd
  • bye
  • ftp
  • uuto
  • uupick
  • uucp
  • uucico
  • tftp
  • ncftp
  • ftpshut
  • ftpwho
  • ftpcount

磁盘管理

  • cd
  • df
  • dirs
  • du
  • edquota
  • eject
  • mcd
  • mdeltree
  • mdu
  • mkdir
  • mlabel
  • mmd
  • mrd
  • mzip
  • pwd
  • quota
  • mount
  • mmount
  • rmdir
  • rmt
  • stat
  • tree
  • umount
  • ls
  • quotacheck
  • quotaoff
  • lndir
  • repquota
  • quotaon

磁盘维护

  • badblocks
  • cfdisk
  • dd
  • e2fsck
  • ext2ed
  • fsck
  • fsck.minix
  • fsconf
  • fdformat
  • hdparm
  • mformat
  • mkbootdisk
  • mkdosfs
  • mke2fs
  • mkfs.ext2
  • mkfs.msdos
  • mkinitrd
  • mkisofs
  • mkswap
  • mpartition
  • swapon
  • sysmlinks
  • sync
  • mbadblocks
  • mkfs.minix
  • fsck.ext2
  • fdisk
  • losetup
  • mkfs
  • sfdisk
  • swapoff

网络通讯

  • apachectl
  • arpwatch
  • dip
  • getty
  • mingetty
  • uux
  • telnet
  • uulog
  • uustat
  • ppp-off
  • netconfig
  • nc
  • httpd
  • ifconfig
  • minicom
  • mesg
  • dnsconf
  • wall
  • netstat
  • ping
  • pppstats
  • samba
  • setserial
  • talk
  • traceroute
  • tty
  • newaliases
  • uuname
  • netconf
  • write
  • statserial
  • efax
  • pppsetup
  • tcpdump
  • ytalk
  • cu
  • smbd
  • testparm
  • smbclient
  • shapecfg

系统管理

  • adduser
  • chfn
  • useradd
  • date
  • exit
  • finger
  • fwhios
  • sleep
  • suspend
  • groupdel
  • groupmod
  • halt
  • kill
  • last
  • lastb
  • login
  • logname
  • logout
  • ps
  • nice
  • procinfo
  • top
  • pstree
  • reboot
  • rlogin
  • rsh
  • sliplogin
  • screen
  • shutdown
  • rwho
  • sudo
  • gitps
  • swatch
  • tload
  • logrotate
  • uname
  • chsh
  • userconf
  • userdel
  • usermod
  • vlock
  • who
  • whoami
  • whois
  • newgrp
  • renice
  • su
  • skill
  • w
  • id
  • free

系统设置

  • reset
  • clear
  • alias
  • dircolors
  • aumix
  • bind
  • chroot
  • clock
  • crontab
  • declare
  • depmod
  • dmesg
  • enable
  • eval
  • export
  • pwunconv
  • grpconv
  • rpm
  • insmod
  • kbdconfig
  • lilo
  • liloconfig
  • lsmod
  • minfo
  • set
  • modprobe
  • ntsysv
  • mouseconfig
  • passwd
  • pwconv
  • rdate
  • resize
  • rmmod
  • grpunconv
  • modinfo
  • time
  • setup
  • sndconfig
  • setenv
  • setconsole
  • timeconfig
  • ulimit
  • unset
  • chkconfig
  • apmd
  • hwclock
  • mkkickstart
  • fbset
  • unalias
  • SVGATextMode

备份压缩

  • ar
  • bunzip2
  • bzip2
  • bzip2recover
  • gunzip
  • unarj
  • compress
  • cpio
  • dump
  • uuencode
  • gzexe
  • gzip
  • lha
  • restore
  • tar
  • uudecode
  • unzip
  • zip
  • zipinfo

设备管理

  • setleds
  • loadkeys
  • rdev
  • dumpkeys
  • MAKEDEV

Nginx

image

Nginx是一款由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

Nginx安装

安装编译工具及库文件

yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

安装PCRE

PCRE作用是让Nginx支持Rewrite功能

# 获取压缩包
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz

# 解压安装包
tar zxvf pcre-8.35.tar.gz

# 进入安装包目录
cd pcre-8.35

# 编译安装
./configure
make && make install

# 查看pcre版本
pcre-config --version

安装Nginx

# 下载Nginx
wget http://nginx.org/download/nginx-1.6.2.tar.gz

# 解压
tar zxvf nginx-1.6.2.tar.gz

# 进入安装包目录
cd nginx-1.6.2

# 编译安装
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make
make install

# 查看nginx版本
/usr/local/webserver/nginx/sbin/nginx -v

Nginx配置

创建Nginx运行使用的用户www

/usr/sbin/groupadd www
/usr/sbin/useradd -g www www

配置nginx.conf

/usr/local/webserver/nginx/conf/nginx.conf 替换为如下内容:

# 打开并编辑nginx.conf
cat /usr/local/webserver/nginx/conf/nginx.conf


user www www;
worker_processes 2; #设置值和CPU核心数一致
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和级别
pid /usr/local/webserver/nginx/nginx.pid;

worker_rlimit_nofile 65535;
events
{
  use epoll;
  worker_connections 65535;
}

http
{
  include mime.types;
  default_type application/octet-stream;
  log_format main '$remote_add -$remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for';
}

#charset gb2312;
     
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 8m;
     
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 60;
  tcp_nodelay on;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;
  gzip on; 
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
 
  #limit_zone crawler $binary_remote_addr 10m;
 #下面是server虚拟主机的配置
 server
  {
    listen 80;#监听端口
    server_name localhost;#域名
    index index.html index.htm index.php;
    root /usr/local/webserver/nginx/html;#站点目录
      location ~ .*\.(php|php5)?$
    {
      #fastcgi_pass unix:/tmp/php-cgi.sock;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      include fastcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
    {
      expires 30d;
  # access_log off;
    }
    location ~ .*\.(js|css)?$
    {
      expires 15d;
   # access_log off;
    }
    access_log off;
  }
}

# 检查配置文件nginx.conf的正确性命令
/usr/local/webserver/nginx/sbin/nginx -t

Nginx启动

/usr/local/webserver/nginx/sbin/nginx

访问站点

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.