ubuntu 搭建S3服务 mino单机和集群集群

搭建mino 集群

单机版

 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
# 新建用户
sudo useradd -r minio-user -s /sbin/nologin
sudo chown -R minio-user:minio-user /usr/local/bin/minio
sudo mkdir /usr/local/share/minio
sudo chown -R minio-user:minio-user /usr/local/share/minio
sudo mkdir /etc/minio
sudo chown -R minio-user:minio-user /etc/minio
# 记得替换 MINIO_VOLUMES
cat  /etc/default/minio
# Local export path.
MINIO_VOLUMES="/tmp/minio/"
# Use if you want to run Minio on a custom port.
MINIO_OPTS="--address :443"
EOT
# 替换key
cat  /etc/default/minio
# Access Key of the server.
MINIO_ACCESS_KEY=Server-Access-Key
# Secret key of the server.
MINIO_SECRET_KEY=Server-Secret-Key
EOT
# 下载安装service文件
( cd /etc/systemd/system/; curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service )
# 记得替换 /etc/systemd/system/minio.service
# 中user和group
# 重载配置
systemctl daemon-reload
# 开机启动
systemctl enable minio.service
systemctl disable minio.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
# 新建用户
useradd minio-user -s /sbin/nologin
# 记得替换 MINIO_VOLUMES
$ cat  /etc/default/minio
# Remote node configuration.
MINIO_VOLUMES=http://node1/export1 http://node2/export2 http://node3/export3 http://node4/export4
# Use if you want to run Minio on a custom port.
MINIO_OPTS="--address :9199"
EOT
# 替换key
cat  /etc/default/minio
# Access Key of the server.
MINIO_ACCESS_KEY=Server-Access-Key
# Secret key of the server.
MINIO_SECRET_KEY=Server-Secret-Key
EOT
# 下载安装service文件
( cd /etc/systemd/system/; curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/distributed/minio.service )
# 记得替换 /etc/systemd/system/minio.service
# 中user和group
# 重载配置
systemctl daemon-reload
# 开机启动
systemctl enable minio.service
systemctl disable minio.service
systemctl restart minio.service
# 查看日志
journalctl -u nginx.service -f 

配置ssl证书

/home/minio/.minio/certs

简单的GDI操作

简单的GDI操作

窗口程序的本质 :GUI GDI

GDI: Graphics Device Interface,图形设备接口,这是Windows提供的一组用于绘制图像的API
GUI: Graphical User Interface,图形用户界面,是指用户操作软件的界面方式,以区别于字符方式

消息机制与模拟消息

消息机制与模拟消息

消息机制

  • 硬件产生事件
  • 被操作系统捕获,封装成消息
  • 操作系统发送到系统消息队列
  • 再由操作系统由系统消息队列发送到 对应的线程内核对象中的线程消息队列
  • 线程消息队列处理完毕后,将时间送回操作系统
  • 由操作系统调用窗口回调函数 => WindowProc()

线程消息队列 处理

新建一个窗口程序

新建一个窗口程序

消息机制

创建窗口的几个步骤

  1. 创建窗口类
  2. 注册窗口类
  3. 创建窗口
  4. 显示窗口
  5. 构建消息循环

创建过程

demo : https://github.com/luodaoyi/cpp_code/tree/master/MemoryInjectTool/CreateWindows

//1 创建窗口类型模板
    WNDCLASS wndclass = { 0 };
    wndclass.lpszClassName = className; //名字
    wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND; //背景画笔句柄
    wndclass.hInstance = hInstance; //窗口过程的实例句柄
    wndclass.lpfnWndProc = WndProc; //窗口过程函数
    //2 注册窗口
    RegisterClass(&wndclass);
    //3 创建窗口
    HWND hwindows = CreateWindow(className, TEXT("MYWINDOWS"), WS_OVERLAPPEDWINDOW, 500, 300, 300, 250, NULL, NULL, hInstance,NULL);
    //创建窗口
    HWND hsitc1 = CreateWindow(L"STATIC", TEXT("账号:"), WS_CHILD | WS_VISIBLE, 10, 30, 50, 20, hwindows, HMENU(IDC_STATIC1), hInstance, NULL);
    HWND hstic2 = CreateWindow(L"STATIC", TEXT("密码"), WS_CHILD | WS_VISIBLE, 10, 80, 50, 20, hwindows, HMENU(IDC_STATIC2), hInstance, NULL);
    HWND hedit1 = CreateWindow(L"EDIT", NULL, WS_CHILD | WS_VISIBLE, 80, 30, 100, 20, hwindows, HMENU(IDC_EDIT1), hInstance, NULL);
    HWND hedit2 = CreateWindow(L"EDIT", NULL, WS_CHILD | WS_VISIBLE, 80, 80, 100, 20, hwindows, HMENU(IDC_EDIT2), hInstance, NULL);
    HWND hbutt1 = CreateWindow(L"BUTTON", TEXT("登录"), WS_CHILD | WS_VISIBLE, 50, 120, 50, 25, hwindows, HMENU(IDC_BUTTM1), hInstance, NULL);
    HWND hbutt2 = CreateWindow(L"BUTTON", TEXT("取消"), WS_CHILD | WS_VISIBLE, 110, 120, 50, 25, hwindows, HMENU(IDC_BUTTM2), hInstance, NULL);
    //4 显示窗口
    ShowWindow(hwindows,SW_SHOW);
    //5 构建消息循环
    MSG msg = { NULL };
    while (GetMessage(&msg,NULL,NULL,NULL))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

office2016 visio2016 project2016零售版转换vol版bat

http://msdn.itellyou.cn/网站上下载的是office2016是零售版的,转换为vol,将下列文本另存为bat文件,运行即可

@ECHO OFF&PUSHD %~DP0
setlocal EnableDelayedExpansion&color 3e & cd /d "%~dp0"
title office2016 retail转换vol版
%1 %2
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :runas","","runas",1)(window.close)&goto :eof
:runas
if exist "%ProgramFiles%\Microsoft Office\Office16\ospp.vbs" cd /d "%ProgramFiles%\Microsoft Office\Office16"
if exist "%ProgramFiles(x86)%\Microsoft Office\Office16\ospp.vbs" cd /d "%ProgramFiles(x86)%\Microsoft Office\Office16"
:WH
cls
echo.
echo                         选择需要转化的office版本序号
echo.
echo --------------------------------------------------------------------------------
echo                 1. 零售版 Office Pro Plus 2016 转化为VOL版
echo.
echo                 2. 零售版 Office Visio Pro 2016 转化为VOL版
echo.
echo                 3. 零售版 Office Project Pro 2016 转化为VOL版
echo.
echo. --------------------------------------------------------------------------------
set /p tsk="请输入需要转化的office版本序号【回车】确认(1-3): "
if not defined tsk goto:err
if %tsk%==1 goto:1
if %tsk%==2 goto:2
if %tsk%==3 goto:3
:err
goto:WH
:1
cls
echo 正在重置Office2016零售激活...
cscript ospp.vbs /rearm
echo 正在安装 KMS 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\proplusvl_kms*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 MAK 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\proplusvl_mak*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 KMS 密钥...
cscript ospp.vbs /inpkey:XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99
goto :e
:2
cls
echo 正在重置Visio2016零售激活...
cscript ospp.vbs /rearm
echo 正在安装 KMS 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\visio???vl_kms*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 MAK 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\visio???vl_mak*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 KMS 密钥...
cscript ospp.vbs /inpkey:PD3PC-RHNGV-FXJ29-8JK7D-RJRJK
goto :e
:3
cls
echo 正在重置Project2016零售激活...
cscript ospp.vbs /rearm
echo 正在安装 KMS 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\project???vl_kms*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 MAK 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\project???vl_mak*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 KMS 密钥...
cscript ospp.vbs /inpkey:YG9NW-3K39V-2T3HJ-93F3Q-G83KT
goto :e
:e
echo.
echo 转化完成,按任意键退出!
pause >nul
exit

模块隐藏

模块隐藏

遍历模块

HANDLE WINAPI CreateToolhelp32Snapshot(
    DWORD dwFlags,
    DWORD th32ProcessID
)
//dwFlags:
TH32CS_SNAPMODULE   遍历模块

PEB

(Process Environment Block 进程环境块)
存放进程信息,每个进程都有自己的PEB信息

文件系统

文件系统

什么是文件系统

文件系统是操作系统用于管理磁盘上文件的方法和数据结构,简单说就是在磁盘上如何组织文件的方法,是软件层面的东西

远程线程注入

远程线程注入

线程是什么

如果说进程是个大房子,那么线程是进程中干活的人

线程是进程的灵魂
使用进程提供的数据 执行进程提供的代码
临时数据存储在计算机的寄存器中

动态链接库

动态链接库

静态链接库的缺陷

  • 链接时将函数加入到exe导致exe变大
  • 在运行时对于不同进程他们所使用的同一个函数都会独占空间,造成资源浪费

怎么解决

 利用之前学习过的内存知识,例如映射类型的内存块
 将这些公共代码放在文件中没在进程运行的时候在加载该文件
 并且在内存中只需要加载一边,不同进程使用同一份公共代码时,只需要将之前加载过的这个文件映射到自己内存中即可

静态链接库

静态链接库

如何创建静态链接库

  • vs新建项目,选择静态链接库
  • 在项目文件中新建 .cpp 文件与.h 文件

项目编译生成后会产生一个 .lib文件

以文件为后背存储区的内存交换文件

以文件为后背存储区的内存交换文件

各种后备存储器的内存映射文件

  • 磁盘中文件系统的具体文件为后备存储的页交换文件(文件映射)
  • 页交换文件("虚拟内存")为后备存储器的页交换文件(共享内存)

页交换文件(虚拟内存)

通过CreateFileMapping api 创建文件映射内核对象,在内存中申请空间(物理内存和虚拟内存)
通过MapViewOfFile 在响应的进程虚拟内存空间中预定对应空间,并且把上一步的内存映射到进程虚拟空间中。
这样就实现了共享内存

页交换文件与内存映射文件

页交换文件与内存映射文件

内存的几种状态和类型

私有类型:

使用VitualAlloc申请分配/调拨内存后,申请的内存只能被当前进程使用。其他进程无法访问。这就是所谓的私有内存

物理内存和虚拟内存的关系

物理内存和虚拟内存的关系

进程容器中4GB空间的内容分布

在所谓的4GB空间内,系统内核占据了高2GB的空间,普通进程看不见摸不着,而且高2GB的空间是全局共享。全局就那么一份,各个进程间共享

事件和线程同步

事件和线程同步

函数

//创建一个时间对象
HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes, // SD 安全属性
  BOOL bManualReset,                       // reset type 0自动复位(互斥)、1手动复位(通知模式)
  BOOL bInitialState,                      // initial state 初始创建时时间是否具备信号
  LPCTSTR lpName                           // object name 对象的名称
);
//将目标事件对象设置为有信号的(同时通知其他线程)
BOOL SetEvent(
    HANDLE hEvent   // handle to event //目标事件的句柄
);
//将目标事件对象设置为无信号的
BOOL ResetEvent(
    HANDLE hEvent   // handle to event 目标事件的句柄
);

通知模式

回顾互斥模式

ubuntu sudo 免密码

ubuntu sudo 免密码

cd /etc/sudoers.d
sudo touch nopasswd4sudo
sudo vi nopasswd4sudo
//输入
ubuntu ALL=(ALL) NOPASSWD : ALL
ESC :wq!

临界区、线程锁和互斥体

临界区、线程锁和互斥体

不可重入函数

不可重入函数: 当这个函数返回前,不可以被其他线程调用

原因:

printf : 访问了引用全局变量stdout
malloc : 引用了全局内存分配表
free   : 引用的全局内存分配表

类似的 假如我在我的线程中使用全局变量会不会出现类似问题?

vmware 6 虚拟化 全系列 序列号

vmware 6 虚拟化 全系列 序列号

vSphere 6 Hypervisor

HY0XH-D508H-081U8-JA2GH-CCUM2

4C4WK-8KH8L-H85J0-UHCNK-8CKQ8

NV09R-2W007-08D38-CA956-33U28

JU400-6EK4L-080V9-QT8EP-2KAQ2

vSphere 6 Hypervisor for Embedded OEMs

NC6HH-26J4N-48098-Y0AX0-1GA66

HY0J0-6L28H-081W8-4TCN0-32RP0

0V012-002DJ-480T1-UHAE0-9GULF

4G6WR-A0K4M-08420-J8CN6-8A2QA

vSphere 6 Desktop Host

MF00U-65K53-H8DF9-Q20ZH-26R40

JV6D2-6YLDN-088C0-Q92N2-8Z00A

HG49R-2234J-08EJ8-WC9E2-87H2D

NV6TR-D4HD1-M84L1-P19QM-0PK3D

vSphere 6 for vCloud Service Provider Standard

JG2JK-DM01L-M8101-J8AZH-3LUH2

线程的创建和控制

线程的创建和控制

进程和线程的关系:进程提供资源,线程使用资源完成工作

创建线程函数

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性
  DWORD dwStackSize,                        // initial stack size //线程栈大小-
  LPTHREAD_START_ROUTINE lpStartAddress,    // thread function //线程代码
  LPVOID lpParameter,                       // thread argument //线程参数
  DWORD dwCreationFlags,                    // creation option //创建标识
  LPDWORD lpThreadId                        // thread identifier //线程id
);

线程的控制

//线程等待
//等待一个
DWORD WaitForSingleObject(
    HANDLE hHandle,        // handle to object,监视对象的句柄
    DWORD dwMilliseconds   // time-out interval 指定超时等待时间 毫秒为单位
);
//等待多个
DWORD WaitForMultipleObjects(
  DWORD nCount,             // number of handles in array,句柄数量
  CONST HANDLE *lpHandles,  // object-handle array 句柄数组
  BOOL fWaitAll,            // wait option 是否全等待/TRUE 全部结束才返回/False 一个结束就返回
  DWORD dwMilliseconds      // time-out interval,超时时间
);
//获取线程的退出代码
BOOL GetExitCodeThread(
    HANDLE hThread,      // handle to the thread
    LPDWORD lpExitCode   // termination status
);

更多的API

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性
  DWORD dwStackSize,                        // initial stack size //线程栈大小-
  LPTHREAD_START_ROUTINE lpStartAddress,    // thread function //线程代码
  LPVOID lpParameter,                       // thread argument //线程参数
  DWORD dwCreationFlags,                    // creation option //创建标识
  LPDWORD lpThreadId                        // thread identifier //线程id
);

创建标志位:
指定一个标志来控制线程的创建,如果指定了 CREATE_SUSPENDED 标志,则线程是在一个挂起状态下创建的,并且在调用了ResumeThread ()函数之前不会运行,如果这个值为零,那么线程在创建之后立即运行