破解SQLServer for Linux預覽版的3.5GB內存限制 (UBUNTU篇)


上一篇中我提到了如何破解RHEL上SQLServer的內存大小限制,但是Ubuntu上還有一道檢查
這篇我將會講解如何在3.5GB以下內存的Ubuntu中安裝和運行SQLServer for Linux

a. 首先按照微軟的給出的步驟安裝和配置
https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-setup-ubuntu

b. 使用apt安裝mssql的包時會提示這個錯誤

ERROR: This machine must have at least 3.25 gigabytes of memory to install Microsoft(R) SQL Server(R).

c. 通過分析deb包可以找到檢查的地方在config腳本中

#!/bin/bash -e

# Source debconf library.
. /usr/share/debconf/confmodule

db_version 2.0
db_capb backup

let system_memory="$(awk '/MemTotal/ {print $2}' /proc/meminfo) / 1024"

if [ $system_memory -lt 3250 ]; then
    echo "ERROR: This machine must have at least 3.25 gigabytes of memory to install Microsoft(R) SQL Server(R)."
    exit 1
fi

對於這種檢查,可以修改這里的內容並重新打包deb包,也可以通過LD_PRELOAD來繞過錯誤的報告,接下來我會使用LD_PRELOAD

d. 使用LD_PRELOAD讓所有進程的返回值都變成0

root@ubuntu:~# vi crack.c
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

static void (*real_exit)(int status) = NULL;

static void exit_init() {
        real_exit = dlsym(RTLD_NEXT, "exit");
        if (real_exit == NULL) {
                fprintf(stderr, "dlsym error: %s\n", dlerror());
                abort();
        }
}

void exit(int status) {
        if (real_exit == NULL) {
                exit_init();
        }
        real_exit(0);
}
root@ubuntu:~# gcc -Wall -shared -fPIC -o crack.so crack.c

e. 重新運行apt安裝mssql包

root@ubuntu:~# env LD_PRELOAD=/root/crack.so apt-get install -y mssql-server

如果安裝成功,你可以看到下面的消息

+-------------------------------------------------------------------+
| Please run /opt/mssql/bin/sqlservr-setup to complete the setup of |
|                  Microsoft(R) SQL Server(R).                      |
+-------------------------------------------------------------------+

f. 接下來和RHEL篇一樣,破解程序文件
替換3250000000到512000000

root@ubuntu:~# cd /opt/mssql/bin/
root@ubuntu:/opt/mssql/bin# cp sqlservr sqlservr.old
root@ubuntu:/opt/mssql/bin# cp sqlpackage sqlpackage.old
root@ubuntu:/opt/mssql/bin# sed -i "s/\x80\x10\xb7\xc1/\x00\x80\x84\x1e/g" sqlservr
root@ubuntu:/opt/mssql/bin# sed -i "s/\x80\x10\xb7\xc1/\x00\x80\x84\x1e/g" sqlpackage

g. 重新配置mssql

root@ubuntu:/opt/mssql/bin# rm -rf /var/opt/mssql
root@ubuntu:/opt/mssql/bin# /opt/mssql/bin/sqlservr-setup
root@ubuntu:/opt/mssql/bin# systemctl status mssql-server

可以看到消息

● mssql-server.service - Microsoft(R) SQL Server(R) Database Engine
   Loaded: loaded (/lib/systemd/system/mssql-server.service; disabled; vendor pr
   Active: active (running) since Tue 2016-12-06 01:03:16 EST; 28s ago
 Main PID: 9349 (sqlservr)
    Tasks: 101
   Memory: 458.7M
      CPU: 4.296s
   CGroup: /system.slice/mssql-server.service
           ├─9349 /opt/mssql/bin/sqlservr
           └─9364 /opt/mssql/bin/sqlservr

到這里就已經大功告成了,上圖

mssql剛啟動就占了600MB的內存,所以微軟設置3.5G的內存限制也不是沒有道理的
mssql for linux似乎運行在一層windows的兼容層上,這也可能是內存占用大的原因
需要更低的資源消耗?考慮postgresql或mariadb吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM