mxxhcm's blog

  • 首页

  • 标签

  • 分类

  • 归档

linux file system

发表于 2019-05-07 | 更新于 2019-06-16 | 分类于 linux

碎片整理

文件写入的block太碎了,文件的读写性能太差,所以可以通过碎片整理将一个文件的block回合在一起FAT文件系统经常需要碎片整理,但是Ext2文件类型是索引式文件系统,所以不太需要经常碎片整理的。

dumpe2fs [-bh]

查询每个区段以及superblock的信息

参数介绍

dumpe2fs [-bh]
-b
-h 仅列出superblock的数据

df

查询挂载的设备

参数介绍

df [-haiT] [dir/file] 显示文件系统的整体磁盘用量
-a 列出所有的文件
-h 显示文件系统的大写,自行显示格式
-i 可用的inode
-T 联通分区文件系统的名称

du

目录或者文件所占的容量

参数介绍

du [-ashkm] [dir/filename] 默认显示的是目录的容量,不包含文件
-s 该目录下所有文件的容量,不细列出来
-a 显示所有的目录与文件的容量
-h 以人们熟悉的大小方式显示出来
-k 以kb列出容量
-m 以mb列出容量:

ln [-s] 链接文件

hard-link 硬链接,将某个目录下的block多写入一个数据,磁盘的inode与b lock数量一般不会改变,磁盘容量也不会改变,而且删除一个文 件并不会响另一个文件的读写,但是其对于目录是没有作用的, 对于不同的文件系统也是没有用的。
sybomlic

磁盘分区,格式化,检验与挂载

df + 目录 查看某个目录挂载的磁盘位置
eg: df /

sudo fdisk [-l] + 设备 输出后面设备所有的分区内容 如不加设备名称,列  出整个系统。

新增或者删除分区

sudo fdisk + 设备 对设备进行操作
partprobe

sudo mkfs [-t ext2/ext2/vfat] + 设备名  将某个设备格式化为某种文件系统

sudo mke2fs [-b block_size] [-i inode_size] [-L 卷标] [-cj -c 检查磁盘 错误 -j 加入日志文件] + 设备名

sudo fsck [-CAay] [-t filesystem] + 设备
-C 使用直方图显示进度
-A 依据/etc/fstab内容,扫描设备
-a 自动修复检查到的有问题的扇区
-y 与-a 类似
ext2 ext3 支持额外参数  [-fD] -f 强制进入设备进行检查
-D 对文件系统下的目录进行优化配 置
sudo badblocks [-sv] + 设备 -s 在屏幕上列出进度 -v 在屏幕上看到进度

mount

挂载文件系统与磁盘 P227

参数介绍

mount [-aoltnL]
-a 按照/etc/fstab的配置信息将所有未挂载的磁盘挂载上来
-l 可增加label名称
-t 加上文件类型
-n 默认情况下会将挂载情况写入/etc/mtab,加入-n可以不写入
-L 可以利用卷标名来挂载
-o 加一些挂载时的额外参数 
ro(只读) rw(可写)
async sync 此文件系统是否使用同步写入或者异步的内存机制
auto noauto 允许此分区以mount -a自动挂载(auto)
dev nodev 是否运行在此分区创建设备文件
suid nosuid
exec noexec 是否可拥有可执行binary文件
user,nouer 设置user参数可以让一般user能对此分区挂载
defaults 默认为rw,suid,dev,exec,auto,nouser,async
remount 重新挂载,在系统出错,或者重新更新参数时

示例

mount 设备文件名 挂载点

用卷标名挂载设备
~$:mount -L mxx_logical /medic/mxx

用磁盘设备名挂载
~$:mount /dev/sdb1 /mnt/usb
~$:mount -t iso9660 /dev/cdrom /media/cdrom
~$:mount -o remount,rw,auto /dir
~$:mount -o loop ~/my.iso/myfile.iso /mnt/iso

磁盘参数修改

设备用文件来代表通过文件的major与minor数值来替代
Major 主设备代码,Minor 次设备代码
/dev/hd* major = 3
/dev/sd* minor = 8

mknod

mknod [bcp]
b 设置设备名称成为一个外部存储文件,如硬盘
c 设置设备名称成为一个外部输入文件,如鼠标/键盘
p 设置设备名称成为一个FIFO文件

e2label

e2label /dev/sdb5 + 新的label名称

tune2fs

tune2fs [-jlL]
-l 类似 dupme2fs -h
-j 将ext2转换为ext3
-L 类似于 e2label

hdparm

hdparm -Tt /dev/sd* 测试SATA硬盘的读取性能

挂载.iso文件

mount -o loop /home/mxx/ubuntu16.04 /mnt/ubuntu16.04

dd命令 创建一个大文件
dd if=/dev/zero of=/home/mxx/filename bs=1M count=512
if–input file /dev/zero 一直输出0
of–output file 将if中的内容加入到of接的文件名中
bs–block size
count 共有多少个bs

构建swap空间

例如将第二快硬盘的第五个分区改为swap分区
~$:sudo fdisk -l /dev/sdb
p
t 5
82
w
partprobe
将/dev/sdb5更改为swap类型的文件系统
~$:mkswap /dev/sdb5
~$:free 查看memory以及swap分区的使用情况
~$:swapon /dev/sdb5 使用/deb/sdb5的swap分区
~$:swapon -s 查看目前使用的swap设备有哪些
~$:swapoff /dev/sdb5

boost sector与superblock 的关系

  1. superblock的大小为1024b
    boost sector与superblock 各占一个block ,可以查看/boot的挂载目录
    0号block给boost ,1号block给superblock
  2. superblock的大小大于1024b,如为4096b
    superblock在0号blok ,但是superblock 只有1024b,所以为了防止空间浪费,于是 在0号block内,superblock(1024-2047),boost sector(0-1023),2048后 面的空间保留。
    实际情况中,由于在比较大的block中,我们能将引导装载程序安装到superblock所在的0号block,但事实上还是安装到启动扇区的保留区域。
    比较正确的说法是,安装到文件系统最前面的1024b内的区域,就是启动扇区

查看文件的inode编号

~$:ls -i
目录并不一定只占一个block,当目录内的文件数太多时,会增加该目录的block

参考文献

1.《鸟哥的LINUX私房菜》

linux 压缩和备份

发表于 2019-05-07 | 更新于 2019-06-16 | 分类于 linux

压缩

  • gzip
  • zcat
  • bzip2
  • bzcat
  • gunzip
  • bunzip2
  • 7z
  • zip
  • rar

gzip和bzip2

gzip和bzip2公用参数

参数介绍

gzip(bzip2)
-d 解压缩参数
-$ $取1-9 压缩等级 -1最快
-v 显示压缩比
-k 保留原文件
-z 压缩参数
-c 将压缩过程中产生的数据输出到屏幕上(压缩后的数据)可以将其输出重定向
-t 检验一个压缩文件的一致性

zip

参数介绍

zip [-dmbrfFg]
-d 从zip文件中移除一个文件
-m 将特定文件移入zip文件,且删除特定文件
-g 将文件压缩附加到zip文件中
-r 包括子目录
-f 以新文件取代旧文件
-F 修复已经损毁的压缩文件
-b 暂存文件的路径
-v 显示详细信息
-u 值更新改变过的文件
-T 测试zip文件是否正常
-x 不需要压缩的文件

示例

~$:zip -r myfile.zip ./*
~$:zip -d myfile.zip myfile  //删除压缩文件内的某个文件
~$:zip -g myfile.zip myfile //向一个压缩文件内添加新文件
~$:zip -u myzip

unzip

参数介绍

unzip [-dnovj]
-v 查看压缩文件目录,但是不解压
-d 指定解压到的目录
-n 不覆盖已有文件
-o 覆盖已有文件
-j 不重建文档的目录结构,把所有文件解压到同一目录下

7z

安装

~$:apt-get install p7zip

参数介绍

7z [x|a] [-rotr]
a 代表添加文件到压缩包
x 代表解压缩文件
-r 表示递归所有文件
-t 制定压缩类型
-o 指定解压到的目录

示例

~$:7z a -t 7z -r myfile.7z ~/myfile
~$:7z x myfile.7z -r -o ~/

rar

安装

~$:apt-get install rar

示例

~$:rar x myfile.rar
~$:rar a myfile.rar myfile

tar

打包

参数介绍

tar [-cxtvfjzCpP]
-c --create
-x --extract
-t --list
-v --verbose
-f --file
-j --bzip2
-z --gzip --gunzip
-C --directory DIR
change to directory DIR
-p --preserve-permissions, --same-permissions
-P --absolute-names

--exclude=file

示例

~$:tar -cvj -f ~/my_bak/etc.newer.passwd.tar.bz2 --newer-mtime=“2016/09/23” /etc/*
~$:tar -cvj -f ~/my_bak/etc.tar.gz /etc
~$:tar -xvj -f ~/my_bak/etc.tar.gz -C /tmp
~$:tar -xvj -f ~/my_bak/etc.tar.gz |etc/shadow
~$:tar -tfj -f ~/my_bak/etc.tar.gz | grep ‘shadow’
~$:tar -cv -f /dev/st0 /home /root /etc # 磁带机/dev/st0

备份

  • dump
  • restore
  • mkisofs
  • dd

dump

参数介绍

dump [-SujvWf]
-S size
-u update recode the dump time to /var/lib/dumpdates
-u只能对level 0 操作
-j add compress bz2(默认压缩等级为 2)
-v verbose 详细的
-W 列出/etc/fstab中的具有dump设置的分区是否被备份过
-f
-level 备份的等级(0-9) 对于文件系统有九个等级
对于单个目录只有0级

示例

~$:dump -0u -f /root/etc.dump /etc

restore

参数介绍

restore [-tCir]
-t list
-C compare
-i itera
-r r

示例

~$:restore -t -f /root/boot.dump
~$:restore -C -f /root/boot.dump
~$:mkdir test_restore
~$:cd test_restore
~$:restore -r -f /root/boot.dump
~$:restore -i -f /root/etc.dump.bz2

mkisofs

生成iso文件

参数介绍

mkisofs [-orvVm]
-o +生成的镜像名
-r 记录更完整的文件信息,包括UID,GID与权限等
-v 显示构建iso的过程
-V 新建Volume
-m exclude 排除某文件
-graft-point

示例

~$:mkisofs -r -v -o ~/my.iso/system.iso -m /home/lost+found -graft-point/home=/home /root=/root /etc=/etc

dd

可以备份整块硬盘或者整块磁盘包括superblocks以及boot sector等等

linux vim

发表于 2019-05-07 | 更新于 2019-06-11 | 分类于 linux

vim 配置文件

个人vim配置文件一般在~/.vimrc下,可以自定义各种配置。
我的vimrc文件

前缀符号

为了缓解快捷键冲突问题,就引入了前缀键,跟参考文献[0]一样,设置;号为前缀键。
let mapleader=";"

设置显示行号

set number

底部显示文件路径

set laststatus=2 “设置底部状态栏可见
set statusline=%F%m%r%h%w\ %=#%n\ [%{&fileformat}:%{(&fenc==”"?&enc:&fenc) .((exists("+bomb")\ &&\ &bomb)?"+B":"").""}:%{strlen(&ft)?&ft:’**’ }]\ [%L\%l,%c]\ %p%% "statusline显示的信息,来自参考文献[8]。
"其中%L是当前文件缓冲区的行数,%P是当前行占总行数的百分比。
set ruler "显示光标当前位置

vim复制到系统寄存器

vim寄存器

vim有9种寄存器:

  1. "是未命名寄存器,vim的默认寄存器,存放删除和复制的文本。
  2. small delete寄存器 -,存放不超过一行的delete操作(不包括x操作)产生的文本。
  3. 编号为$0,1,2,\cdot, 9$的寄存器,
  4. $a-za-z$的$26$个字母寄存器,
  5. 只读寄存器 : .,%,$
  6. 表达式寄存器 =
  7. 搜索寄存器 /
  8. GUI选择寄存器$*,+$。
  9. 黑洞寄存器,向这个寄存器写入的话,什么都不会发生。

详细介绍可见参考文献[4]。

使用系统剪切板

*和+寄存器适合系统相关的,*和系统缓冲区关联,+和系统剪切板关联。
使用+y复制当前行到系统剪切板。
使用+ny复制n行到系统剪切板。
使用+p粘贴系统剪切板到当前位置。
但是有些vim发行版不支持系统剪切板,可以使用如下命令查看自己的系统是否支持系统剪切板。
~\$:vim --version|grep clipboard
在我的系统上,输出如下:

-clipboard +jumplist +persistent_undo +virtualedit
-ebcdic -mouseshape +statusline -xterm_clipboard

如果输出+clipboard说明当前vim支持剪切板,-clipboard说明当前vim不支持系统剪切板,所以就卸载安装支持的版本呗。
~\$:sudo apt remove vim
~\$:sudo apt install vim-gtk3
然后再次查看
~\$:vim --version|grep clipboard
输出如下:

+clipboard +jumplist +persistent_undo +virtualedit
-ebcdic +mouseshape +statusline +xterm_clipboard

说明已经支持系统剪切板,可以使用了。注意记得把之前打开的vim关闭后再试。
使用以下命令进行操作:
+nyy # 复制从当前行开始的n行到+寄存器
+yy # 复制当前行行到+寄存器
+p # 粘贴+寄存器中的内容到文本中。
这个时候还有一个问题,就是一般的笔记本键盘的+和=号是在一起的,如果要打出=行,需要按一下shit +=,这个时候会向下移动一行,但是无伤大雅,为什么会这样,我还不知道。详细流程可参见参考文献[5]。
但是后来我发现这个还不能用。然后就只能继续查找了。在知乎上找到一个回答,发现还要在这些命令前加上一个"号,表示将默认"寄存器中的内容复制到+寄存器中。也就是使用如下命令:
"+nyy # 复制从当前行开始的n行到+寄存器
"+yy # 复制当前行行到+寄存器
"+p # 粘贴+寄存器中的内容到文本中。

将未命名寄存器和系统寄存器设为同一个。

修改vim配置文件
~$:vim ~/.vimrc
添加下面一句话,重新打开vim即可
set clipboard=unnamed

vim模式和常用命令

vim模式

  • 正常模式,用vim打开一个文件之后就处于正常模式
  • 插入模式,在正常模式下输入i,a,o或者I,A,O之后,就进入了命令模式,可以修改文件,按Esc退出。
  • Visual模式,可以移动光标选中某些行,进行复制或者删除,在正常模式按v或者V进入Visual模式。
  • 命令模式,在正常模式按:进入命令模式,可以在窗口底部输入命令。
  • 替换模式,使用r替换当前字符,使用R从当前字符开始连续替换。

正常模式

移动光标

0 移动到行首
$ 移动到行尾
h 向左移动一个character
j 向下移动一行
k 向上移动一行
l 向右移动一个character
nj nk nh nl 移动n次
oO o在当前行的下一行插入,O在当前行的上一行插入
iI i在当前光标处插入,I在行首插入
aA a在当前光标后插入,A在行尾插入
1G 跳到第一行
gg 跳到首行
G 跳到尾行
nG 跳到尾行
n-space 跳到光标后第n个character
n-ENTER nG 跳到第n行
wW w移动到下一个word的开头,W移动到隔了一个空白符的下一个word的开头
bB b移动到前一个word的开头,B移动到隔了一个空白符的前一个word开头
eE 移动到当前word的结尾,W移动到隔了一个空白符的word结尾。
ctrl+f 跳到下一页
ctrl+b 跳到上一页

删除和复制

x 删除一个character
nx 删除n个characters
dd 删除当前行
ndd 删除n行
yy 复制一行
nyy 复制n行
p 粘贴

命令模式

切屏

:sp [filename]
输入:进入命令模式,然后输入sp,空格,要打开的文件名。使用ctrl w在分开的屏幕之间进行切换。

查找

/word ?word
n N

替换和删除

:1,10s/word/word.rp/g©
:1,$s/word/word.rp/g©
利用正则表达式可以实现下面的一些常用命令
代码地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 替换所有的^为\^
:0,$s/\^/\\^/g
# 替换所有的\*\*为##
:0,$s/[0-9][0-9]\./## /g
# 删除所有以tab开头的tab
:0,$s/^\t//g
# 删除所有以#开头的行
:g/^#\.\*$/d
# 删除所有空行
:g/^\s\*$/d
# 用newlines替换,
:0,$s/,/\r/g
# 在re.*后面加上括号
# re.Ire.IGNORECASE)
# re.Lre.LOCALE)
# re.Mre.MULTILINE)
# re.sre.DOTALL)
# re.Ure.UNICODE)
# re.Xre.VERBOSE)
:m,ns/\(^re\.[A-Z]\)/\1(/g

其他

:w [filename]
:r [filename]
:n1,n2 w [filename]
:set nu

Visual模式

见参考文献[9]。

快捷键映射

  • namp 正常模式下的递归映射
  • vmap Visual模式
  • imap 插入模式
  • cmap 命令模式
  • nnoremap 正常模式下的非递归映射
  • vnoremap Visual模式下的非递归映射
  • inoremap 插入模式下的非递归映射
  • cnoremap 命令模式下的非递归映射

其他vim使用事项

编码

tty1-tty6默认不支持中文编码  
修改终端接口语系 
LANG=zh_CN.big5

dos和UNIX转换

ubuntu don’t have dos2UNIX or UNIX2dos but is has tofrodos

frodos filename
todos filename
-b .bak
-v ver

语系编码转换

iconv -o保留原文件,-o加新文件名
iconv -f big5 -t utf8 filename -o filename

问题-vim中设置了setexpand不起作用

~/.vimrc中进行了如下设置:

1
2
3
4
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4

但是发现在markdown甚至~/.vimrc中expandtab都没有设置成功,但是py文件是正常的,后来发现是多加了一个set paste的原因,把它删了就好了。

原因

因为set paste覆盖了set expandtab。

解决方案

删除set paste行。

我的vimrc文件

vimrc文件如下,代码地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 使用四个空格代替tab键
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4

" 打开文件类型检测
filetype on
" 根据不同的文件类型加载插件
filetype plugin on
set ignorecase

" 定义前缀键
" let mappleader=";"

" 设置ctrl+a全选,ctrl+c复制,;y粘贴
vnoremap ; "+
nnoremap ; "+
nmap ;p "+p
nnoremap <C-C> "+y
vnoremap <C-C> "+y
nnoremap <C-A> ggVG
vnoremap <C-A> ggVG

" 删除#号开头
nnoremap ;d3 :g/^#.*$/d<CR>
nnoremap ;d# :g/^#.*$/d<CR>
" 删除空行
nnoremap ;ds :g/^\s*$/d<CR>
" 删除以tab开头的tab
nnoremap ;rt :0,$s/^\t//g<CR>
" 用\^代替^
nnoremap ;r6 :0,$s/\^/\\^/g<CR>
nnoremap ;r^ :0,$s/\^/\\^/g<CR>
" 用\\\\代替\\
nnoremap ;r/ :0,$s/\\\\/\\\\\\\\/g<CR>
nnoremap ;r? :0,$s/\\\\/\\\\\\\\/g<CR>

" 给选中行加注释
" cnoremap <C-#> s/^/# /g<CR>
nmap ;ic :s/^/# /g<CR>
vmap ;ic :s/^/# /g<CR>
nmap ;dc :s/^# //g<CR>
vmap ;dc :s/^# //g<CR>
"vmap <C-#> :s/^/#/g<CR>
"nmap <C-#> :s/^/#/g<CR>

""" 状态栏设置
" 总是显示状态栏
set laststatus=2
" 状态信息
set statusline=%f%m%r%h%w\ %=#%n\ [%{&fileformat}:%{(&fenc==\"\"?&enc:&fenc).((exists(\"\+bomb\")\ &&\ &bomb)?\"\+B\":\"\").\"\"}:%{strlen(&ft)?&ft:'**'}]\ [%c,%l/%L]\ %p%%

"""光标设置
" 设置显示光标当前位置
set ruler

" 开启行号显示
set number
" 高亮显示当前行/列
set cursorline
" set cursorcolumn
" 高亮显示搜索结果
set hlsearch
" 显示文件名

" 开启语法高亮
syntax enable
" 允许用指定语法高亮配色方案替换默认方案
syntax on
" 将制表符扩展为空格
" 设置编辑时制表符占用空格数
" 设置格式化时制表符占用空格数
" 让 vim 把连续数量的空格视为一个制表符
set autoindent

参考文献

0.https://github.com/yangyangwithgnu/use_vim_as_ide
1.https://askubuntu.com/a/1027647
2.https://www.zhihu.com/question/19863631/answer/89354508
3.鸟哥的LINUX私房菜
4.http://vimdoc.sourceforge.net/htmldoc/change.html#registers
5.https://stackoverflow.com/a/11489440
6.https://www.brianstorti.com/vim-registers/
7.http://landcareweb.com/questions/3593/ru-he-zai-vimzhong-yong-jiu-xian-shi-dang-qian-wen-jian-de-lu-jing
8.https://forum.ubuntu.org.cn/viewtopic.php?t=319408
9.https://stackoverflow.com/a/1676659/8939281
10.https://vi.stackexchange.com/questions/9028/what-is-the-command-for-select-all-in-vim-and-vsvim/9029
11.https://stackoverflow.com/a/37962622/8939281
12.https://vim.fandom.com/wiki/Search_and_replace_in_a_visual_selection
13.https://stackoverflow.com/questions/71323/how-to-replace-a-character-by-a-newline-in-vim/71334<用newline替换逗号>

linux git

发表于 2019-05-07 | 更新于 2020-03-15 | 分类于 工具

linux安装github

安装

~$:sudo apt-get install git git-core git-gui

添加ssh公钥到github

~$:cd ~/.ssh
查看是否有ssh keys,没有的话执行下一步
~$:ssh-keygen -t rsa -C "github 邮箱"
在github上登陆自己的账号,找到Settings->SSH Keys -> ADD SSH Key 将id_rsa.pub文件中的字符串复制进去,不含空格和回车。

配置本地文件

~$:git config --gloabl user.name “github用户名”
~$:git config --gloabl user.email “github邮箱”

测试

在github上新建repository 名为 testgit
~$:cd mkdir /home/mxx/github/testgit
~$:cd github/testgit
~$:git init
~$:touch Readme
~$:git add Readme
~$:git commit -m ‘add readme file’

还可以直接克隆一个已有的仓库,
~$:git clone https://github.com/github用户名/github仓库.git

push使用ssh,不用输入密码

1
2
3
4
5
6
git remote -v  # 查看远程连接的方式
git remote rm origin # 删除https的连接方式,如果是ssh的方式,就不需要了
# 从github复制ssh地址
git remote add origin git@github.com:mxxhcm/**.git # 添加ssh连接方式
git push --set-upstream origin master
git remote -v # 再次查看远程连接的方式

git的区域

git的区域分为工作区,git一个项目后,能看到的目录,不包含.git目录。
.git所在目录是版本库,版本库包含叫做stage的暂存区。以及创建的各个branch。
git add 操作的是暂存区。
git commit是把暂存区的所有东西提交到当前的branch。

分支管理

~$:git branch dev 创建分支
~$:git checkout dev 切换分支
~$:git branch 查看当前分支
~$:git merge dev 将分支合并
~$:git brancd -d dev 删除分支

撤销

git add加入缓存区后撤销

~$:git status # 查看add的文件
~$:git reset HEAD # 撤销上一次add的内容
~$:git reset HEAD xx.file # 撤销上一次add的某个文件

git commit后撤销

~$:git log # 查看提交记录
找到相应commit的id,这个commit id不是刚才提交记录的id,而是他之前的那一个
commit xxxxxx
~$:git reset commit_id # 回退到git add之前,所有代码保留
~$:git reset --hard commit_id # 回退到上一次commit后,所有之后的代码都删掉

git reset --hard错误回退后撤销

使用git reflog
~$:git reflog # 找到所有的commit id,然后
~$:git reset commit_id
~$:git reset --hard commit_id

push之后撤销

使用git revert
~$:git revert HEAD # 撤销前一次的commit
~$:git revert HEAD^ # 撤销前前一次的commit
~$:git rever commit-id # 撤销commit-id对应的版本

git revert会提交一个新的版本,将回退当做新的一个push,之前的内容都会保留。

git pull和git fetch区别

本地的一个git项目中,一般都有本地仓库和远程仓库。一般写完代码,git add添加到本地缓冲区,git commit提交到本地仓库。这个时候假设本地仓库和远程仓库是一致的。
git pull 相当于git fetch和git merge。git merge将某个分支合并到master分支上。有可能会引发冲突。
然后假设有人更新了远程仓库的代码,这个时候可以使用git pull或者git fetch进行更新。
使用git fetch的时候,本地仓库中代码的commit id不变,而本地跟踪的远程仓库的commit id是会变的和远程仓库一致的。

参考文献

1.https://blog.csdn.net/kongbaidepao/article/details/52253774
2.https://www.cnblogs.com/ruiyang-/p/10764711.html

linux bash

发表于 2019-05-07 | 更新于 2019-11-11 | 分类于 linux

jq 解析json字符串

&& || 命令从左到右依次执行 根据回传码$0的值,继续向右执行命令

diff 文本比较,通常比较一个文件的不同版本

diff [-bBi] file1 file2
-b 忽略一行中仅有多个空白的区别
-B 忽略空白行的区别
-i 忽略大小写
diff test.old test.new
diff -Naur test.olc test.new > test.patch
patch 补丁
cat test.patch
patch -pN test.patch 更新旧版
patch -R -pN test.patch 恢复为旧版

nl 打印出文件并加上行号

echo 与 unset

~$:echo $PATH
~$:echo ${PATH}

""内的特殊字符可以保持原有特性 var=“lang is $LANG” 那么 echo $var 输出 var=en_US.UTF-8
’'内的特殊字符仅保存为一般文本

反单引号可以获得其他命令的信息 version=uname -r` =$(uname -r)

env以及export查看常见变量

/etc/profile
/etc/bash.bashrc

RANDOM产生0~32767的随机数
产生0-9的用declare -i number=$RANDOM*10/32767 echo $number
HOME
SHELL
HISTSIZE
MAIL
PATH /etc/environment
LANG
RANDOM

set查所有变量

HISTFILE=~/.bash_history
MAILCHECK
PS1 提示符的设置
$ 关于本shell的PID
? 上个变量的回传码,正确返回0,错误返回其他值,可以利用代码差错
OSTYPE HOSTTYPE MACHTYPE 主机硬件与内核的等级

export将自定义变量转换为环境变量

locale -a 文件的语系

read 赌球来自键盘输入的变量

-p 用户可以输入提示语
-t 光标等待用户输入时间

~$:read -p “hello” -t 10 variable

declare 声明变量的类型  默认为字符串

-x 声明环境变量
-i 将变量定义为整形
-a 将变量定义为数组
-r 将变量设置为readonly 若要删除该变量,必须退出该bash重进
-p 单独列出变量的类型

ulimit 与文件系统以及程序的限制关系

-a 后面不接任何参数,可以列出所有的限制额度
-c 某些进程发生错误,系统可能会将该进程在内存中的信息写成文件,这种文件 就称为内核文件(core file)。此为限制每个内核文件的最大容量
-f 此文件可以创建的最大文件容量,一般为2G:
-d 进程可使用的最大断裂内存(segment)容量
-l 可用于锁定(lock)的内存量
-t 可使用的最大CPU时间
-u 用户可使用的最大进程(process)数量

-H hard limit 严格的限制  必须不能超过
-S soft limit 警告的限制  可以超过,但要有警告信息

变量的使用

变量内容的测试与内容替换
echo ${variable#}
echo ${variable##
}

echo ${variable%*}
echo ${variable%%*}

echo ${variable/bin/BIN}
echo ${variable//bin/BIN}

变量的测试与替换

new_var=${old_var-content}
用新的变量的值区替代旧的变量的值,新旧变量可为同一个,若old_var不存在,则将

content的值给new_var,而若old_var的值存在则将其赋给new_var;
  加上:的话,即使old_var为空的话,也会用content的值去赋给new_var

username=""
username=${username:-root}
echo $username

将-换成=是将原变量一同更改

将-换成?是当变量不存在时,可以发出错误信息

Bash Shell的操作环境

路径与命令查找顺序
先由相对路径或者绝对路径寻找
a.alias
b.builtin
c.$PATH这个变量的顺序找到的第一个命令
bash的登陆界面以及欢迎信息
/etc/issue #
/etc/issue.net #提供telnet远程登陆,当使用telnet连接到主机时显示该内容
/etc/motd(?)->/etc/update-motd.d/ 
/etc/issue \d \l \m \n \o \r \t \s \v
\d 本地端时间的日期
\l 显示第几个终端机
\m 显示硬件等级
\n 显示主机的网络名称
\o 显示domain name
\r 操作系统的版本
\t 显示本地端时间的时间
\s 操作系统的名称
\v 操作系统的版本

  bash的环境配置文件	

login shell 以及non-login shell
/etc/profile系统整体的设置
~/.profile用户个人设置

login shell
/etc/profile
/etc/inputrc /etc/profile.d/*sh
~/.profile
~/.bashrc /etc/bashrc
开始操作bash

non-login shell
取得non-login shell 时,该bash配置文件仅会读取~/.bashrc

source 配置文件名
如
source ~/.bashrc
. ~/.bashrc

/etc/manpath.config使用man时man page的路径到哪里去找
用tarball的方式安装的时候,那么man page可能放置在/usr/local/softpackage/\ man里,需要以手动的方式将该路径加入到/etc/man.config里面

 终端机的环境设置

stty  setting tty(终端机的意思)
-a 将所有的stty参数列出来

如何设置呢  比如将erase设置为ctrl+h来控制stty erase ^h
ctrl + c 终止目前的命令

ctrl + d 输入结束,例如邮件结束
  ctrl + m ENTER
ctrl + u 在提示符下,将整行命令删除
  ctrl + z 暂停目前的命令

set
 set $- 那个$-变量内容是set的所有设置
uvxhHmBC

/etc/inputrc其他的按键设置功能

 通配符与特殊符号

通配符* ? [] - ^
特殊字符 # \ | ; ~ $ & ! / >,>> <,<< ‘’ “” ``或者$() () {}

seq 产生一系列数

seq [-s]

~$:seq -s " " 3 10
3 4 5 6 7 8 9 10

sh [-vxn] my.sh

sh -x 执行过程
sh -n 查询语法问题

id和finger

id 用来显示某个用户的id信息
finger 用来分析某个用户信息

type 查看命令的来自于哪里  
是bash还是外部命令还是别名
file外部命令
alias别名
builtin内置在bash内
-t -p -a

type -t ls
~$:alias 以file builtin alias 列出该命令的类型
type -a ls 列出所有的名为ls的命令

学习shell script
看一下自己写的/home/mxx/scripts/delete_dir

echo $(($num1 operand $num2))

进行运算

source file.sh sh file.sh ./file.sh

source 是将该shell拿到父进程中来执行,所以各项操作都会在该bash内执行
sh和./是开启一个新的shell来执行

test

test [-rwxfd]
[-nt -ot -ef ]
[-eq -nq -gt -lt -ge -le]
[-z ]
[-a -o]

test -r filename
test “$filename” == “content”

[ “$filename” == “$varible” ]

$# $@ $*

$#:变量个数
$@:变量内容
$*:

别名

alias
alias lm=‘ls -al’

unalias

history命令与文件

history (n)列出最近的第(n)条命令

!number 执行history的第number条命令
!command 由最近的命令开始搜寻开头为command的命令
!! 执行上一个命令

last最近登录的用户

参考文献

  1. 《鸟哥的LINUX私房菜》
    2.https://www.tomczhen.com/2017/10/15/parsing-json-with-shell-script/

linux account

发表于 2019-05-07 | 更新于 2019-06-16 | 分类于 linux

账户配置文件

  • /etc/passwd
  • /etc/shadow
  • /etc/group
  • /etc/gshadow

/etc/passwd

mxx❌1000:1000:mxx,:/home/mxx:/bin/bash
账号名称,密码,UID,GID,用户信息说明列,主文件夹,shell

/etc/shadow

mxx:…:17034:0:99999:7:::
账号名称,密码,最近密码更改日期,密码更改多久后才能重新更改,密码多长时间需要重新修改,密码需要修改前多少天发送警告,密码过期后宽限时间,账号失效日期,(形式和密码更改日期一样),保留字段

/etc/group

用户组名称,用户组密码,GID,此用户组支持的账号名称

/etc/gshawod

用户组名,
密码列,开头为!表示无合法密码
用户组管理员的账号
该用户组的所属账号

UID 用户
0 系统管理员
1-99 系统账户
100-499 用户创建的系统账号
500-65535 一般用户

修改密码

一般账户:passwd
root账户:重启后进入单用户维护模式
忘记密码后,以各种方式清空/etc/shadow中root的密码字段。登陆后再用passwd修改密码

uesr管理

usermod -G group user将一个用户加入其他用户组
初始用户组用户的/etc/passwd的第四个字段即为该用户的初始用户组的GID
groups查看当前登陆用户的用户组。第一个为有效用户组
newgrp更改用户的有效用户组,但是用户组必须当前用户支持的用户组
UID/GID密码参数的设置在 /etc/login.defs

useradd添加用户

参数介绍

useradd [-ugGmMcdrsef]  调用/etc/default/useradd的数据
-u UID /etc/skel用户主文件加参考基准目录
-g initial group
-G 这个账户可以加入的其他用户组
-m 创建用户主文件 
-M 不创建用户主文件
-s 接一个默认shell
-r 创建一个系统账户
-c /etc/passwd的第五列说明
-d 制定某个目录成为主文件夹
-e 后面跟一个日期YYYYMMDD写入shadow的第八字段,账号的失效日期从1970年来总日数,若账号失效,无论密码是否正确,都无法登陆
-f 后面接shadow的第七字段,判定密码是否会失效,0为立即失效,-1为永不失效(密码只会过期强制登陆时重新设置),大于0的表示如n,如果在n天后,没有登陆修改密码,那么在n天后密码会失效,再也无法登陆,但是在如果在n天内登陆并修改密码,就可以继续使用。
-D useradd的默认值

例子

~$:useradd -d /home/mxxhcm -k /etc/skel/ -m mxxhcm -s /bin/bash

passwd修改密码

参数介绍

passwd [账号] [–stdin] -[luSnxwi]
-l lock
-u unlock
-S 密码相关参数
-n next 多长时间不能修改第四个字段
-x 多少天必须修改 第五个字段
-w warn第六个字段
-i 失效日期 第七个字段

示例

~#:passwd 后面没有接密码,就是修改当前用户的密码
~#:echo “passwd” | passwd --stdin user

change修改user信息

参数介绍

chage [-ldEImMW] 账号名
-l 列出详细参数
-d 第三字段
-E 第八字段 账号失效 
-I 第七字段 密码失效
-m 第四字段
-M 第五字段
-W 第六字段

示例

chage -d 0 user

user信息修改

参数介绍

usermod [-;cdefgGasuLU]
-l 修改账户名称
-L lock
-U unlock
修改/etc/shadow
-f 第七字段
-e 第六字段
-c /etc/passwd 第五字段
-d /etc/passwd 主文件夹第六字段
-g /etc/passwd 第四个字段GID
-G 后面接次要用户组,修改这个用户能支持的用户组,修改/etc/group
-a 与-G连用,增加次要用户组的支持而非设置
-u UID /etc/passwd的第三个字段,UID
-s 接shell的实际文件

示例

~#:usermod -l ‘my_usename’ username

user删除

参数介绍

userdel

示例

~#:userdel -r username # 删除主文件夹
~#:find / -user username
~#:userdel username

finger查看用户的数据

finger 查看当前用户的数据
finger username 查看某用户的信息

chfn

chfn 就是相当于-c参数,修改当前用户/etc/passwd的第五个字段值
chsh -s 修改当前用户的shell
chsh -s /bin/bash

id

id [username]
列出当前用户或者username的所有id

group操作

groupadd [-gr]
-g 指定GID
-r 新建系统用户组
groupmod [-gn]
-n 修改组名
groupdel [groupname]

尽量少修改GID否则会造成系统资源的混乱
当用户组为某个用户的初始用户组时,就无法删除该用户组

gpasswd修改group信息

gpasswd [-AMrR] groupname
-A 将groupname的控制权交给后面用户
gpasswd -A mxx groupname
-M 将某些账号加入到这个用户组中
-r 将groupname的密码删除
-R 将groupname的密码失效

gpasswd groupname 设置groupname管理密码
gpasswd groupname
-A 增加groupname的管理员
-r让密码删除

gpasswd -ad username groupname
-a增加
-d删除

ACL Acess Control List

针对单一用户或者目录来进行rwx的权限设置
setfacl [-m|-x] -m设置acl参数 -x删除后续acl参数
[-bkRd]
-b删除所有的acl参数;-k删除默认的acl参数;-R递归设置acl;-d设置默认的acl,只对目录有效
setfacl [-m|-x] [bkRd]
-b 删除所有ACL参数
-k 删除默认ACL参数
-R 递归设置ACL参数,包括子目录
-d 设置默认ACL参数,只对目录有效

-x 删除后续的ACL参数
-m  设置后续的ACL参数

-m u:mxx:rw my_file

getfacl my_file

针对有效权限mask的设置
setfacl -m m:rwx my_file
mask在此可以来规定最大允许的权限。取得是mask和用户以及用户组的权限交集。 若用户mxx的权限为rwx 但是mask为r–,那么mxx的权限只能为r–.

~#:setfacl -m d:u:mxx:rwx file 递归设置目录的acl
~#:setfacl -m m:rw acl_test
~#:setfacl -m g:mxx:rwx acl_test
~#:getfacl acl_test
~#:setfacl -b file 删除acl

切换用户,切换账号

su[- -l -m -c]
su - 切换到root用户以login shell变量的读取方式
su 切换到root用户,以nologin shell变量的读取方式登陆系统
`` su -l 加想要切换的账号login shell
su -c 只提升一次到root权限
su -m 使用目前用户的环境变量,不读取新用户的配置文件

su - -c cat /etc/shadow

sudo -u mxx …提升到mxx权限

visudo的设置

1.visudo 修改/etc/sudoers
其他用户使用root身份
root ALL=(ALL) ALL
用户账号
登陆者的来源主机名,
可切换的身份
可执行的命令
2.最左边加一个%表示用户组
利用用户组以及免密码
%wheel ALL=(ALL) ALL
usermod -a -G wheel user

免密
%wheel ALL=(ALL) NOPASSWD: ALL
3.mxx ALL=(root) /usr/bin/passwd
mxx可以切换到root的身份使用passwd命令

mxx ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*,
!/usr/bin/passwd root
4.别名设置
User_Alias MYUSER=mxx,mahuihui
Cmnd_Alias MYCOMMAND=!/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*,
!/usr/bin/passwd root
MYUSER all=(root) MYCOMMAND

5.用自己的密码切换成root

sudo su -

用户信息传递

查询用户

  • w
  • who
  • last
  • lastlog

用户对谈
mesg y
mesg n

write
write mxx tty1

wall “hello” 每个人都会收到

mail mahuihui -s “Hi,mahuihui,nihaoa”
…
…
ctrl+d

mail 收信
?查看命令

q离开,离开后,会将该信件移动到~/home/mbox,收信箱
读取
mail -f /home/mxx/mbox

手工添加账号

  • pwck
    pwconv将/etc/passwd相关信息移动到/etc/shadow,把在/etc/passwd中存在的账号 但是在/etc/shadow没有对应密码的列新增密码

  • grpconv

  • pwunconv

  • chpasswd 修改密码
    echo “mxx:mypaswd” | chpasswd -m

新建账号

vim /etc/group
mygroup❌1020:

grpconv

vim /etc/passwd
myuser❌1200:1020::/home/myuser:/bin/bash
pwconv

passwd myuser

cp -a /etc/skel /home/myuser
chmod -R myuser:mygroup /home/myuser
chmod 700 /home/myuser

参考文献

1.《鸟哥的LINUX私房菜》

linux quota

发表于 2019-05-07 | 更新于 2019-06-16 | 分类于 linux

quota

显示磁盘使用情况和限额
~$:sudo apt-get install quota

quota示例

文件系统开启quota
~#:df -h /home
~#:mount -o remount,usrquota,grpquota /home
~#:mount | grep ‘home’

查看/etc/mtab文件
cat /etc/mtab

或者直接写入/etc/fstab
~#:vim /etc/fstab
添加:

1
LABEL=/home /home ext4 defaults,usrquota,groquota

~#:umount /home
~#:mount -a
~#:mount | grep ‘home’

新建quota配置文件

quotacheck [-avugmf]
-c 创建磁盘配额数据文件
-a 创建在/etc/mtab所有磁盘的配额数据库文件,使用此参数,后无需加 挂载点
-u 创建用户的磁盘配额数据库文件
-g 用户组的
-m 把一起的磁盘配额信息清除,对/分区创建时,必须用此参数
-v 显示创建的过程

启动quota

quotaon [-avug] [挂载点]
-a 根据/etc/fstab的设置来启动有关的quota
-v

关闭quota

quotaoff [-aug] [mount-point]

编辑quota

edquota [-ugtp]
-t 修改宽限时间
-p 复制范本,,模板账号为已存在并设置好quota的账号
edquota -p 范本账号 -u 新账号
edquota -u myquota
edquota -g myquotagrp
edquota -t
edquota -p quotagrp -u myquota

quota报表

单一用户
quota [-ugvs]
-s 以1024的整数倍显示

repquota [-a] [-uvgs]
/dev/sda[012]
warnquota root给用户以及root发邮件 P461
在 /etc/warnquota.conf 中设置邮件内容
setquota [-u|-g] name block(soft) block(hard) inode(soft) inode(hard) 文件系统
setquota -u myquota5 2000 3000 0 0 /home
quota-uv myquota5

参考文献

1.《鸟哥的LINUX私房菜》

linux raid lvm

发表于 2019-05-07 | 更新于 2019-06-16 | 分类于 linux

磁盘阵列

mdadm新建raid

参数介绍

mdadm --detail 后面接的那个磁盘阵列设备的具体信息
madam --create 为新建raid的参数
–auto=yes /dev/md[01…]
–raid-device=N 使用几个raid作为磁盘阵列的设备
–spare-device=N 使用几个磁盘作为备用
–level=[0125] 这组磁盘阵列的等级是0,1还是5之类的

示例

~#:mdadm --create --auto=yes /dev/md0 --level=5 --raid-device=3 --spare-device=1 /dev/sdb{5,6,7,8}
创建raid需要时间,创建好之后
~#:mdadm --detail /dev/md0
查看建好的RAID
~#:cat /proc/mdstat
~#:mkfs -t ext4 /dev/md0
~#:mkdir /mnt/raid
~#:mount /dev/md0 /mnt/raid
~#:df

mdadm管理raid

参数介绍

mdadm --manage /dev/md[0-9] [–add 设备] [–remove 设备] [–fail 设备]
~#:mdadm --manage /dev/md0 --fail /dev/sdb6
~#:mdadm --detail /dev/md0
~#:cat /proc/mdstat
过一段时间在执行会发现以及将坏的设备更新了
~#:mdadm --detail /dev/md0
~#:mdadm --manage /dev/md0 --add /dev/sdb9 --remove /dev/sdb10

开机自动加载raid

~#:mdadm --detail /dev/md0 | grep -i ‘uuid’
~#:vim /etc/mdadm/mdadm.conf
ARRAY /dev/md0 UUID=…
~#:vim /etc/fstab
/dev/md0 /mnt/raid ext4 defaults 1 2
~#:umount /dev/md0
~#:mount -a
~#:df

关闭raid

~#:vim /etc/fstab
# /dev/md0 …
~#:mdadm --stop /dev/md0
~#:cat /proc/mdstat
~#:vim /etc/mdadm/mdadm.conf

LVM的制作

LVM Logical Volume Manager
PV physical volume
VG volume group
PE physical extend
LV logical volume

LV的写入机制

  • 线性机制
    若有两个设备/dev/sda1,/dev/sdb1,他们都在一个VG中,并且只有一个LV,线性机制就是在一个设备完全写满之后,再向另一个设备写入
  • 交错模式

新建分区

~#:sudo fdisk /dev/sdb
new /dev/sdb{5,6,7,8,9,10}
t 8e(Linux LVM)
w
~#:partprobe

安装应用

sudo apt-get install lvm2

PV物理卷的新建

pvcreate 将物理分区新建为PV分区
pvscan 查询目前系统里具有PV的磁盘
pvdisplay 显示目前系统上面的PV状态
pvremove 将PV属性删除

pvmove 将某个设备内的pe给移动到另一个设备
pvmove /dev/sdb5 /dev/sdb9

~#:pvscan
~#:pvcreate /dev/sdb{5,6,7,8}
~#:pvscan
~#:pvdisplay

VG卷用户组的新建

vgcreate 新建VG
vgscan 查找目前系统上的VG
vgdisplay 显示目前系统上的VG状态
vgextend 在VG内新增额外的VG
vgreduce 在VG内删除PV
vgchange 设置VG是否启动
vgremove 删除一个VG
VG名称是自己定义的。而PV名称实际上是分区的设备文件名

vgcreate [-s] VG名称 PV名称
-s 后面接PE的大写,单位可以是m,g,t (支持大小写)
~#:vgcreate -s 16M mxxvg /dev/sdb{5,6,7}
~#:vgscan
~#:pvscan
~#:vgdisplay
vgextend VG名称 PV名称
~#:vgextend mxxvg /dev/sdb8
~#:vgdisplay

LV逻辑卷的新建

lvcreate 新建lv
lvscan 查询系统上的lv
lvdisplay 展示系统上的lv
lvextend 在lv里增加容量
lvreduce 在lv里减少容量
lvremove 删除一个lv
lvresise 对lv的大小进行重新调整

lvcreate [-lLs] [-n lv名称] vg名称
-l 后接的是PE的个数
-L 后接的是vg的容量
-n 后接lv的名称
-s snapshot 快照
~#:lvcreate -l 252 -n mxxlv mxxvg
~#:ls -l /dev/mxxvg/mxxlv
~#:lvscan
~#:lvdisplay

文件系统新建

~#:mkfs -t ext4 /dev/mxxvg/mxxlv
~#:mkdir /mnt/lvm
~#:mount /dev/mxxvg/mxxlv /mnt/lvm
~#:df -h .

增加lv容量

~#:sudo fdisk /dev/sdb
new /dev/sdb9
~#:pvcreate /dev/sdb9
~#:pvscan
~#:vgextend mxxvg /dev/sdb9
~#:vgdisplay
增加lv的容量
~#:lvresize -l +63 /dev/mxxvg/mxxlv
~#:lvdisplay
~#:df -h /mnt/lvm

此时虽然lv显示的容量增大,但是对应的/dev/mxxvg/mxxlv文件系统还没有改变
~#:dumpe2fs /dev/mxxvg/mxxlv
重新计算文件系统
resizefs [-f] [device] [size]
-f 强制进行resize
device 后接的文件系统或者是设备名
size 如果没有size默认为整个文件系统,如果有size的话,必须给一个 单位
~#:resize2fs /dev/mxxvg/mxxlv //可在线进行resize

缩小lv容量

先计算需要缩小多少
~#:pvscan
~#:pvdisplay
   缩小文件系统容量
放大可以直接进行,但是缩小需要先卸载
~#:umount /dev/mxxvg/mxxlv
~#:resize2fs /dev/mxxvg/mxxlv 3900M
报错需要用e2fsck
~#:e2fsckk -f /dev/mxxvg/mxxlv
~#:resize2fs /dev/mxxvg/mxxlv 3900M
~#:mount /dev/mxxvg/mxxlv /mnt/lvm
~#:df -h /mnt/lvm
   降低lv容量
~#:lvresize -l -63 /dev/mxxvg/mxxlv
~#:lvdisplay
转移pv
~#:pvdisplay
~#:pvmove /dev/sdb5 /dev/sdb9
   删除vg
~#:vgreduce mxxvg /dev/sdb5
删除pv
~#:pvscan
~#:pvremove /dev/sdb5

LVM的快照

需要有未使用的PE块
所以需要新加入一个PV块

~#:vgdisplay
~#:pvcreate /dev/sdb5
~#:vgextend mxxvg /dev/sdb5
~#:vgdisplay
~#:lvcreate -l 40 -s -n mxxlv_ss /dev/mxxvg/mxxlv
-s snapshot
~#:lvdisplay
复原的数据是不能比快照区的大小大的,此处不能大于40个PE

接下来改变LVM中的数据,会发现lvm与快照区是不同的
~#:cd /mnt/lvm
~#:cp -a /home/mxx/my.iso /mnt/lvm
~#:lvdisplay 会发现lv的快照区已经被使用了
~#:df 会发现原始文件与快照区文件系统也是不同的

利用快照区进行备份

~#:tar -cvj -f /home/mxx/my.bak/lvm.bak.tar.bz2 *
~#:umount /mnt/snapshot

将快照区进行删除,因为已经被备份
~#:lvremove /dev/mxxvg/mxxlv_ss

~#:umount /mnt/lvm
~#:mkfs -t ext4 /mnt/lvm
~#:mount /dev/mxxvg/mxxlv /mnt/lvm

将备份的数据还原,那么这个文件系统就会和原来一样了
~#:tar -xvj -f /home/mxx/my.bak/lvm.bak.tar.bz2 /mnt/lvm
~#:ls -l /mnt/lvm

LVM的关闭

先卸载lvm系统,包括快照与原系统
再使用lvremove删除LV
使用vgchange -a n VG 名称 让其不再为active
使用vgremove删除VG
使用pvremove删除PV
最后使用sudo fdisk 修改System ID

~#:umount /mnt/lvm
~#:lvremove /dev/mxxvg/mxxlv
~#:vgchage -a n mxxvg
~#:vgremove mxxvg
~#:pvremover /dev/sdb{5,6,7,8}
~#:sudo fdisk -l

参考文献

1.《鸟哥的LINUX私房菜》

linux at cron anacron mail

发表于 2019-05-07 | 更新于 2019-06-23 | 分类于 linux

例行性工作

  • at 仅执行一次
  • cron 周期性执行
  • anacron 适合不常开机的设置

at仅执行一次的工作调度

参数说明

at [-lmdvc] TIME
-m 当at完成时,即使没有输出信息,以mail通知用户
-v 可以使用较明显的时间格式列出at调度中的工作
-c 可以列出后面接的该项工作的实际命令内容
-d 相当于atrm,可以取消一个at工作
-l 相当于atq,列出目前系统上所有该用户的at调度
-b 相当于batch
TIME
HH:MM 04:00
HH:MM YYYY-MM-DD 05:00 2016-10-05
HH:MM[pm|am] [Month] [Date] 04 January 10
HH:MM [am|pm] + number [minutes|hours|days|weeks]
now + 5 minutes
05pm + 3days
04pm + 10 days

示例

创建一个job

~$:at now+1minutes
at>echo "create a job"
按ctrl+D结束
OK,但是这样子我找不到任何程序的输出在哪里。
所以可以改成这样子
at>echo “create a job” > at_job.output
或者
~$:echo “create a job” > at_job.output | at now

列出所有at jobs

~$:at -l # 列出at的所有任务
~$:atq

列出某个job

~$:at -c [number](1, 2…) # 如果当前没有相应的job,会输出cannot find jobid x

删除某个job

~$:at -r 8
~$:atrm 1

配置文件

/etc/at.allow # 哪些人能使用
/etc/at.deny # 哪些人不能使用
使用at命令的话,先查找at.allow,如果存在并且有内容,那么只有这些人能使用。如果不存在的话,就去找at.deny。

batch

当空闲时执行,空闲指的是CPU占用率在$0.8$以下

crond例行性工作调度

参数介绍

crontab [-u user] [-ler]
-u 只有root能设置这个参数
-l 列出当前用户的所有crontab工作内容
-e 编辑crontab的内容
-r 删除所有crontab的内容

示例

新建crontab

注意:周与月日不可共存
~$:crontab -e
* * * * * cmd
分钟 小时 日期 月份 星期
*表示任何取值,
-表示时间范围 0-59,
",“表示分隔 3,6,9
”/n",如*/5每过五个单位(分钟,小时,天)
比如添加每一小时给荟荟发一封邮件,需要添加以下内容

1
* */1 * * * echo "I love you." | mail -s "huhui" 18811367922@163.com

删除一个crontab

~$:crontab -e
然后手动编辑要删除的crontab

删除所有crontab

~$:crontab -r # 删除所有的crontab

开启/var/log/cron.log

~$:vim /etc/rsyslog.d/50-default.conf
将rsylog文件中的#cron.*前的#去掉
~$:service rsyslog restart
~$:service cron restart
~$:vim /var/log/cron.log

系统任务

/etc/crontab 为系统的例行性任务,它会执行以下run-parts

  • /etc/cron.daily/
  • /etc/cron.hourly/
  • /etc/cron.monthly/
  • /etc/cron.weekly/

自定义run-parts

直接编辑/etc/crontab文件,在其中添加

1
2
3
4
5
# m h dom mon dow user	command
\*/2 \* \* \* \* root run-parts /etc/cron.minutely
\*/5 \* \* \* \* root run-parts /root/runcron
# 上述两条命令中,需要对应的目录存在或者直接执行一个shell脚本
\* \* \* \* \* mxxmhh /bin/bash /home/mxxmhh/outputtime_minutes.sh

outputtime_minutes.sh脚本如下

1
2
3
#! /bin/bash
time=`date`
echo $time >> /home/mxxmhh/test.log

crontab -e vs vim /etc/crontab

他们的格式不同,一个需要指定用户,一个不需要
只有root能够修改/etc/crontab,而crontab -e所有不在cron.deny中的用户都可以
/etc/crontab是系统的任务,crontab -e是用户的任务

配置文件

ubuntu中没有下面两个配置项
/etc/cron.allow
/etc/cron.deny
即默认为所有用户都可以使用crontab

cron spool

/var/spool/cron/crontabs/
该目录下为不同账号的crontab内容

anacron 处理非24小时开机的系统

参数介绍

anacron [-usfn] [job]
-u 更新记录文件的时间戳
-s 开始连续执行各项job,依据记录文件的时间戳判断是否进行
-f 强制执行,不管时间戳
-n 立即进行未进行的任务,而不延迟

示例

系统的anacron文件都在目录/etc/cron*/*ana*存放
/etc/cron.daily/0anacron
0表示最先被执行,让时间戳先被更新,避免anacron误判
/etc/anacron anacron的设置

/var/spool/anacron/*
记录最近一次执行anacron的时间戳

mail命令介绍

mail -s “title” target_email_address
echo "content |mail -s “title” target_email_address
mail -s "title target_email_address < file #将file的内容当做邮件正文

mail发送邮件

安装相应软件

~$:sudo apt-get install postfix mailutils libsasl2-2 ca-certificates libsasl2-modules
编辑/etc/postfix/main.cf文件,在文件末尾添加下列内容

1
2
3
4
5
6
7
8
9
10
11
12
13
# 指定默认的邮件发送服务器
relayhost = [smtp.gmail.com]:587
# 激活sasl认证
smtp_sasl_auth_enable = yes
# 指定sasl密码配置文件
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# 非匿名登录
smtp_sasl_security_options = noanonymous
# linux用户与发件人的对应关系配置文件
sender_canonical_maps = hash:/etc/postfix/sender_canonical
smtp_tls_CApath = /etc/ssl/certs
smtpd_tls_CApath = /etc/ssl/certs
smtp_use_tls = yes

创建密码配置文件

~$:vim /etc/postfix/sasl_passwd
添加如下内容

1
2
3
4
# 163邮箱格式
[smtp.163.com]:25 your163mail:your163mailpassword #注意这里如果直接用passwd是会报错的,需要使用授权码
# gamil邮箱格式
[smtp.gmail.com]:587 yourgmail:yourgmailpassword

~$:sudo postmap /etc/postfix/sasl_passwd

创建用户与发件人对应文件

~$:vim /etc/postfix/sender_canonical
添加如下内容

1
2
root your163mail
user1 yourgmail

~$:sudo postmap /etc/postfix/sender_canonical

重启postfix服务

~$:sudo /etc/init.d/postfix reload
或者
~$:sudo systemctl relaod postfix.service
或者
~$:sudo service postfix restart

测试

~$:echo “Hello.” |mail -s “I love you.” 18811376816@163.com
这种方式应该是不支持中文的。。

附录

更多at命令的TIME格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
noon	
midnight
teatime
tomorrow
noon tomorrow
next week
next monday
fri
NOV
9:00 AM
2:30 PM
1430
2:30 PM tomorrow
2:30 PM next month
2:30 PM Fri
2:30 PM 10/21
2:30 PM Oct 21
2:30 PM 10/21/2014
2:30 PM 21.10.14
now + 30 minutes
now + 1 hour
now + 2 days
4 PM + 2 days
now + 3 weeks
now + 4 months
now + 5 years

参考文献

1.《鸟哥的LINUX私房菜》
2.https://zhidao.baidu.com/question/249718018.html
3.https://askubuntu.com/questions/1112772/send-system-mail-ubuntu-18-04
4.https://www.cnblogs.com/tugeler/p/6620150.html

linux service and daemon

发表于 2019-05-07 | 更新于 2019-12-17 | 分类于 linux

service和daemon

service(服务):系统提供某些功能的一些服务(包括系统本身以及网络service)
daemon:实现service的程序叫做daemon

daemon的分类

  • stand alone daemon
  • super daemon

stand_alone daemon

独立启动,启动并加载到内存后就一直占用内存与系统资源运行。因此对于客户端的请求响应特别快。比如WWW的daemon(httpd),FTP的daemon(vsftpd)

super daemon

由一个统一daemon唤起的service,这个特殊的daemon叫做super daemon早期是inetd,后来被xinetd替代了。没有客户端请求时,service被关闭,收到客户端请求时,super daemon唤醒相应的service,请求结束后,这个service就会关闭,service反应时间会比较慢。常见的有telnetservice。
signal-control和interval-control,信号管理的daemon以及每隔一段时间主动执行某项job的daemon每一个service程序文件名都会加上d,d代表daemon。

SysVInit service

配置文件路径

  • /etc/rc.d/rcX.d/ (X 代表运行级别 0-6) # 不同runlevel的service存放位置
  • /etc/rc.d/rc.local # 用户自定义的service

自定义文件示例

创建/etc/init.d/shadowsocks_client service如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh

### BEGIN INIT INFO
# Provides: shadowsocks client
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: shadowsocks service
# Description: shadowsocks service daemon
### END INIT INFO
start(){
   sslocal -c /etc/shadowsocks.json -d start
}
stop(){
   sslocal -c /etc/shadowsocks.json -d stop
}
case “$1” in
start)
   start
   ;;
stop)
   stop
   ;;
reload)
   stop
   start
   ;;
\*)
   echo “Usage: $0 {start|reload|stop}”
   exit 1
   ;;
esac

然后执行以下命令进行更新
~$:sudo chomod a+x /etc/init.d/shadowsocks_client
~$:sudo update_rc.d shadowsocks defaults

运行方式

service shadowsocks_client start

SystemD

配置文件路径

  • /etc/systemd/system 系统service,不要动。大部分是软连接,指向/usr/lib/systemd/sytem
  • /run/systemd/system Runtime units
  • /usr/local/lib/systemd/system 管理员安装的System units
  • /usr/lib/systemd/system 包管理器安装的System units(for centos)
  • /lib/systemd/system 包管理器安装的System units(for debian/ubuntu)
  • /etc/systemd/system/**.service.wants/*:此目录内的文件为链接文件,设置相依服务的链接。意思是启动了 **.service 之后,最好再加上这目录下面建议的服务。
  • /etc/systemd/system/vsftpd.service.requires/*:此目录内的文件为链接文件,设置相依服务的链接。意思是在启动 vsftpd.service 之前,需要事先启动哪些服务的意思。

自定义unit文件示例

在/lib/systemd/system/创建ss_client.service,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=ss v4 client daemon

[Service]
ExecStart=/usr/bin/sslocal -c /etc/shadowsocks_v4_client.json </dev/null &>>/home/mxxmhh/.log/ss-local.log
WorkingDirectory=/home/mxxmhh/
# Restart=on-failure
StartLimitBurst=2
StartLimitInterval=30
User=mxxmhh
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target

然后执行以下命令
~$:sudo systemctl start ss-client.service
~$:sudo systemctl enable ss-client.service

Created symlink /etc/systemd/system/multi-user.target.wants/ss-client.service → /lib/systemd/system/ss-client.service.

执行以下命令发现报错
~$:sudo systemctl status ss-client.service

1
2
ss-client.service: Start request repeated too
ss-client.service: Failed with result 'exit-c

根据参考文献13使用下列命令常看详细log
~$:journalctl -u ss-client.service
发现报错:

1
ss-client.service: Failed at step USER spawning /usr/bin/sslocal: No such proces

然后根据参考文献12发现可能是自己的文件写的有问题,最后发现是user复制的时候出错了,修改之后就好了。执行以下命令加载修改后的配置文件,然后restart服务。
~$: sudo systemctl daemon-reload
~$: sudo systemctl restart ss-client.service
~$: sudo systemctl status ss-client.service

Unit文件的编写

每个unit都有一个配置文件,定义了这个unit启动的条件。

Unit格式

下面是 SSH service的unit文件,service unit文件以.service 为文件名后缀。
~$:cat /etc/systemd/system/sshd.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=OpenSSH server daemon
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStartPre=/usr/sbin/sshd-keygen
ExecStart=/usrsbin/sshd –D $OPTIONS
ExecReload=/bin/kill –HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target

Unit部分仅仅有一个描述信息;Service中,ExecStartPre定义启动service之前应该运行的命令;ExecStart定义启动service的具体命令行语法;Install部分,WangtedBy 表明这个service是在多用户模式下所需要的,multi-user.target

Unit的配置文件区块

一个文件通常由[Unit],[Service](或者其他unit类型)和[Install]构成。
[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

  • Description:简短描述
  • Documentation:文档地址
  • Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
  • Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
  • BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
  • Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
  • After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
  • Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
  • Condition…:当前 Unit 运行必须满足的条件,否则不会运行
  • Assert…:当前 Unit 运行必须满足的条件,否则会报启动失败

[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

  • WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
  • RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
  • Alias:当前 Unit 可用于启动的别名
  • Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

  • Type:定义启动时的进程行为。它有以下几种值。
  • Type=simple:默认值,执行ExecStart指定的命令,启动主进程
  • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
  • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
  • Type=dbus:当前服务通过D-Bus启动
  • Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
  • Type=idle:若有其他任务执行完毕,当前服务才会运行
  • ExecStart:启动当前服务的命令
  • ExecStartPre:启动当前服务之前执行的命令
  • ExecStartPost:启动当前服务之后执行的命令
  • ExecReload:重启当前服务时执行的命令
  • ExecStop:停止当前服务时执行的命令
  • ExecStopPost:停止当其服务之后执行的命令
  • RestartSec:自动重启当前服务间隔的秒数
  • Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  • TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
  • Environment:指定环境变量

日志

Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
~$:sudo journalctl  # 查看所有日志(默认情况下 ,只保存本次启动的日志)
~$: sudo journalctl -k # 查看内核日志(不显示应用日志)
# 查看系统本次启动的日志
~$:sudo journalctl -b
~$:sudo journalctl -b -0
~$:sudo journalctl -b -1 # 查看上一次启动的日志(需更改设置)
# 查看指定时间的日志
~$:sudo journalctl --since="2012-10-30 18:17:16"
~$:sudo journalctl --since "20 min ago"
~$:sudo journalctl --since yesterday
~$:sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
~$:sudo journalctl --since 09:00 --until "1 hour ago"
~$:sudo journalctl -n # 显示尾部的最新10行日志
~$:sudo journalctl -n 20 # 显示尾部指定行数的日志
~$:sudo journalctl -f # 实时滚动显示最新日志
~$:sudo journalctl /usr/lib/systemd/systemd # 查看指定服务的日志
~$:sudo journalctl _PID=1 # 查看指定进程的日志
~$:sudo journalctl /usr/bin/bash # 查看某个路径的脚本的日志
~$:sudo journalctl _UID=33 --since today # 查看指定用户的日志
# 查看某个 Unit 的日志
~$:sudo journalctl -u nginx.service
~$:sudo journalctl -u nginx.service --since today
~$:sudo journalctl -u nginx.service -f # 实时滚动显示某个 Unit 的最新日志
~$:journalctl -u nginx.service -u php-fpm.service --since today # 合并显示多个 Unit 的日志
# 查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
~$:sudo journalctl -p err -b
~$:sudo journalctl --no-pager # 日志默认分页输出,--no-pager 改为正常的标准输出
~$:sudo journalctl -b -u nginx.service -o json # 以 JSON 格式(单行)输出
~$:sudo journalctl -b -u nginx.serviceqq -o json-pretty # 以 JSON 格式(多行)输出,可读性更好
~$:sudo journalctl --disk-usage # 显示日志占据的硬盘空间
~$:sudo journalctl --vacuum-size=1G # 指定日志文件占据的最大空间
~$:sudo journalctl --vacuum-time=1years # 指定日志文件保存多久

systemctl 工具

~$:systemctl list-units 列出正在运行的 Unit
~$:systemctl list-units --all 列出所有Unit,包括没有找到配置文件的或者启动失败的
~$:systemctl list-units --all --state=inactive 列出所有没有运行的 Unit
~$:systemctl list-units --failed 列出所有加载失败的 Unit
~$:systemctl list-units --type=service 列出所有正在运行的、类型为 service 的 Unit
~$:systemctl list-unit-files 列出所有配置文件
~$:systemctl list-unit-files --type=service 列出指定类型的配置文件
~$:systemctl start foo.service 用来启动一个service (并不会重启现有的)
~$:systemctl stop foo.service 用来停止一个service (并不会重启现有的)。
~$:systemctl restart foo.service 用来停止并启动一个service。
~$:systemctl reload foo.service 当支持时,重新装载配置文件而不中断等待操作。
~$:systemctl condrestart foo.service 如果service正在运行那么重启它。
~$:systemctl status foo.service 汇报service是否正在运行。
~$:systemctl list-unit-files --type=service 用来列出可以启动或停止的service列表。
~$:systemctl enable foo.service 在下次启动时或满足其他触发条件时设置service为启用。创建一个符号链接从/etc/systemd/system/some_target.target.wants指向/lib/systemd/system或者/etc/systemd/system。
~$:systemctl disable foo.service 在下次启动时或满足其他触发条件时设置service为禁用
~$:systemctl is-enabled foo.service 用来检查一个service在当前环境下被配置为启用还是禁用。
~$:systemctl list-unit-files --type=service 输出在各个运行级别下service的启用和禁用情况
~$:systemctl daemon-reload 当您创建新service文件或者变更设置时使用。
~$:systemctl isolate multi-user.target (OR systemctl isolate runlevel3.target OR telinit 3) 改变至多用户运行级别。
~$:ls /etc/SystemD/system/*.wants/foo.service 用来列出该service在哪些运行级别下启用和禁用。

配置文件

/etc/init.d/* # 基本上所有的service启动脚本都被放置在该目录
/etc/rcX.d/ # X指的是数字,从$0-6$,代表不同的run-level,是/etc/init.d/目录下service的软连接
/etc/systemd/system # systemd的service文件位置,是/usr/lib/systemd/sytem的软连接
/etc/default # 一些配置文件
/etc/* # 各service各自的配置文件

service,initctl,systemctl命令对照表

Service 命令|UpStart initctl 命令|SystemD 命令|备注
—|---|
service foo start|initctl start|systemctl start foo.service 用来启动一个service (并不会重启现有的)
service foo stop|initctl stop|systemctl stop foo.service 用来停止一个service (并不会重启现有的)
service foo reload|systemctl reload foo.service 当支持时,重新装载配置文件而不中断等待操作。
service foo restart|initctl restart|systemctl restart foo.service 用来停止并启动一个service
service foo status|initctl status|systemctl status foo.service 汇报service是否正在运行。
service foo reload|initctl reload|systemctl reload foo.service 当支持时,重新装载配置文件而不中断等待操作。
service foo condrestart||systemctl condrestart foo.service 如果service正在运行那么重启它。

xinted

xinted是/etc/init.d/目录中的一个脚本。
xinted 是inted的扩展,是super daemon,它本身管理了一系列的daemon,只有在用户调用时才由xinetd启动,他们要比独立的daemon启动晚。
!!!xinted默认在ubuntu中是不存在的,
~$:sudo apt-get install xinetd
/etc/xinetd.conf #super daemon配置文件
/etc/xinetd.d/* #它所管理的进程
/var/lib/* 各service产生的数据库
/var/run/* 各service的程序的pid记录处

stand alone的启动

  1. 用/etc/init.d/*启动
    ~#:/etc/init.d/cron start|stop|status|restart|reload|force-reload

2.用service [service-name] (start|…)启动
service-name必须与/etc/init.d/相照应
–status-all 将所有的stand_aloneservice列出来
~#:service --status-all
~#:service cron

super daemon的启动方式

super daemon本身也是一个stand alone的service,但是它所管理的其他文件就不是了。
查看某个service是否可用。
~#:grep -i ‘disable’ /etc/xinted.d/* # disable表示取消,若为yes,表示该service未开启,no表示开启

示例

开启timeservice
~#:vim /etc/xinted.d/time
将disable改为no
重新启动xinted service
~#:service xinted restart
!!!注意是重启xinted service

查看该service的信息
~#:grep -i ‘time’ /etc/services
~#:netstat -nltp | grep ‘time port’

默认值配置文件以及参数介绍

/etc/xinetd.conf
log_type SYSLOG daemon info 日志文件的记录service类型
log_on_failure 发生错误时需要记录的信息
log_on_success 成功启动时的记录信息
cps 同一秒内的最大连接个数,若超过则暂停
instance 同一service的最大连接数
per_source 同一来源的客户端的最大连接数
v6only 是否运行ipv6
groups
umask

/etc/xinetd.d/
service
{
disable 启动与否
id service识别
server 程序文件名 这个service的启动程序
server_args 程序参数 设置server_args=–daemon
user service所属id
group 用户组
socket_type 数据包类型 stream|dgram|raw stream使用tcp, udp使用dgram,raw代表erver需要与ip直接交互。
protocol 数据包类型 tcp|udp与socket_type重复,
wait 连接机制 yes(single) no(multi) 一般udp为yes,tcp为no
instances 最大连接数
per_source 单用户来源 (一个数字或者NULIMTED)
cps 新连接限制
log_type 日志文件类型 以什么日志选项记载和需要记载的等级(默认为info)
log_on_success,log_on_failure,设置值,[PID,HOST,USERID,EXIT,DURATION]
PID为service启动时的pid,host为远程主机的ip,userid为登陆者的账号,EXIT为离开时记录的项目,DURATION为该用户使用此service多久。
env 额外环境变量设置 设置环境变量
port 非正规端口号 设置不同的service与对应的端口号,port与service名必须与/etc/services的值相同
redirect service转址 [IP port] 将客户端的请求转到另一台主机
includedir 调用外部设置 表示将某个目录所有文件都放入xinetd.conf中,
bind service端口锁定 运行此service的适配卡
interface 与bind相同
only_from [0.0.0.0,192.168.1.0/24,hostname,domainname]设置为这里面的ip或者主机名才能访问,0.0.0.0表示所有主机皆能访问,如果是192.168.1.0/24则表示为C class的域,即由(192.168.1.1~192.168.1.255)皆可登录。另外,也可选择域名,如bit.edu.cn表示运行北理工的ip登录你的主机
no_acess 表示的是不可登录的主机
acess_time 时间控制 [00:00-24:00,HH:MM-HH:MM]
umask 设置用户新建目录或者文件时候的属性
}

参考文献

1.《鸟哥的LINUX私房菜》
2.https://askubuntu.com/questions/911525/difference-between-systemctl-init-d-and-service
3.http://www.r9it.com/20180613/ubuntu-18.04-auto-start.html
4.https://www.ibm.com/developerworks/cn/linux/1407_liuming_init1/index.html
5.https://www.ibm.com/developerworks/cn/linux/1407_liuming_init2/index.html?ca=drs-
6.https://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html?ca=drs-
7.http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
8.https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/150.html
9.https://www.freedesktop.org/software/systemd/man/systemd.unit.html
10.https://unix.stackexchange.com/questions/206315/whats-the-difference-between-usr-lib-systemd-system-and-etc-systemd-system
11.https://stackoverflow.com/questions/35452591/start-request-repeated-too-quickly
12.https://superuser.com/questions/1156676/what-causes-systemd-failed-at-step-user-spawning-usr-sbin-opendkim-no-such-p
13.https://stackoverflow.com/questions/39202644/caddy-service-start-request-repeated-too-quickly

1…252627…34
马晓鑫爱马荟荟

马晓鑫爱马荟荟

记录硕士三年自己的积累

337 日志
26 分类
77 标签
RSS
GitHub E-Mail
© 2022 马晓鑫爱马荟荟
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Pisces v6.6.0