破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇) 转

https://www.ancii.com/database/30842.html

微软发布了SQLServer for Linux,但是安装竟然需要3.5GB内存,这让大部分云主机用户都没办法尝试这个新东西 这篇我将讲解如何破解这个内存限制 要看关键的可以直接跳到第6步,只需要替换4个字节就可以破解这个限制

首先按照微软的给出的步骤安装和配置 https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-setup-red-hat

到执行/opt/mssql/bin/sqlservr-setup时可以看到这个错误

sqlservr: This program requires a machine with at least 3250 megabytes of memory.

按错误文本查找消息在哪个文件里面

[[email protected] ~]# cd /opt/mssql/bin/
[[email protected] bin]# grep -irn "3250"
[[email protected] bin]# grep -irn "megabytes of memory"
Binary file sqlpackage matches
Binary file sqlpackage matches
Binary file sqlservr matches
[[email protected] bin]# strings sqlservr | grep "megabytes of memory"
%s: This program requires a machine with at least %zu megabytes of memory.
[[email protected] bin]# strings sqlpackage | grep "megabytes of memory"
%s: This program requires a machine with at least %zu megabytes of memory.

看来sqlservr和sqlpackage会检测这个限制,并且这个限制是一个常量

查找错误消息的位置

[[email protected] bin]# hexdump -C sqlservr | less

找到这里

0006baf0  72 69 6e 67 29 00 25 73  3a 20 54 68 69 73 20 70  |ring).%s: This p|
0006bb00  72 6f 67 72 61 6d 20 72  65 71 75 69 72 65 73 20  |rogram requires |

可以看到消息在0006baf6的位置

查找调用错误消息的位置

[[email protected] bin]# objdump -C -S sqlservr | less

找到这里

23940:       48 8d 35 af 81 04 00    lea    0x481af(%rip),%rsi        # 6baf6
   23947:       31 c0                   xor    %eax,%eax
   23949:       48 89 ca                mov    %rcx,%rdx
   2394c:       48 89 d9                mov    %rbx,%rcx
   2394f:       e8 6c e4 fe ff          callq  11dc0 <[email protected]>
   23954:       bf 01 00 00 00          mov    $0x1,%edi
   23959:       e8 e2 e1 fe ff          callq  11b40 <[email protected]>

判断的函数在这里

238e0:       55                      push   %rbp
   238e1:       48 89 e5                mov    %rsp,%rbp
   238e4:       53                      push   %rbx
   238e5:       48 83 ec 78             sub    $0x78,%rsp
   // 把这个函数接收的第二个参数放到rbx
   // 参考 https://en.wikipedia.org/wiki/X86_calling_conventions (System V AMD64 ABI)
   238e9:       48 89 f3                mov    %rsi,%rbx
   // 调用sysinfo获取内存大小
   // rdi是第一个参数,是一个在堆栈中的struct sysinfo
   // 参考 https://linux.die.net/man/2/sysinfo
   238ec:       48 8d 7d 88             lea    -0x78(%rbp),%rdi
   238f0:       e8 3b e3 fe ff          callq  11c30 <[email protected]>
   // 偏移量的计算如下
   // -0x78: uptime (struct sysinfo的开头地址)
   // -0x70: loads[3]
   // -0x58: totalram
   // -0x50: freeram
   // -0x48: sharedram
   // -0x40: bufferram
   // -0x38: totalswap
   // -0x30: freeswap
   // -0x28: procs (short为什么占8个字节?看https://en.wikipedia.org/wiki/Data_structure_alignment)
   // -0x20: totalhigh
   // -0x18: freehigh
   // -0x10: mem_unit (同样,int 4个字节 align 4个字节)
   // 计算出rax = totalram * mem_unit
   238f5:       8b 45 f0                mov    -0x10(%rbp),%eax
   238f8:       48 0f af 45 a8          imul   -0x58(%rbp),%rax
   // 如果rax小于rbx则跳到23909,即显示内存不足并退出
   238fd:       48 39 d8                cmp    %rbx,%rax
   23900:       72 07                   jb     23909
   23902:       48 83 c4 78             add    $0x78,%rsp
   23906:       5b                      pop    %rbx
   23907:       5d                      pop    %rbp
   23908:       c3                      retq

调用判断的函数的代码在这里

// 这里的第二个参数是3250000000,可以看到内存的限制值是一个常量
   // 0xc1b71080 = 3250000000
   1486a:       be 80 10 b7 c1          mov    $0xc1b71080,%esi
   1486f:       4c 89 e7                mov    %r12,%rdi
   14872:       e8 69 f0 00 00          callq  238e0

顺道再用hexdump查找一下有多少处地方用了80 10 b7 c1,结果是只有一处

00014860  00 00 48 89 df e8 66 15  00 00 be 80 10 b7 c1 4c  |..H...f........L|
00014870  89 e7 e8 69 f0 00 00 0f  57 c0 0f 29 85 70 ff ff  |...i....W..).p..|

使用python修改代码 改条件判断的jb或者改8010b7c1都可以,我这里把8010b7c1改成更小的值0080841e(512M)

[[email protected] bin]# mv sqlservr sqlservr.old
[[email protected] bin]# python
>>> a = open("sqlservr.old", "rb").read()
>>> b = a.replace("\x80\x10\xb7\xc1", "\x00\x80\x84\x1e")
>>> open("sqlservr", "wb").write(b)
[[email protected] bin]# chmod +x sqlservr

可以继续替换掉sqlpackage中的限制值,但是不替换也可以使用

继续配置sqlserver

[[email protected] bin]# /opt/mssql/bin/sqlservr-setup
[[email protected] bin]# systemctl status mssql-server

如果你执行完命令后没有看到服务正常启动,可能是之前的配置没有成功导致的 删除mssql的数据文件夹并重试即可

[[email protected] bin]# rm -rf /var/opt/mssql
[[email protected] bin]# /opt/mssql/bin/sqlservr-setup

正常启动后可以看到

● mssql-server.service - Microsoft(R) SQL Server(R) Database Engine
   Loaded: loaded (/usr/lib/systemd/system/mssql-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2016-12-05 22:50:06 EST; 20s ago
 Main PID: 2625 (sqlservr)
   CGroup: /system.slice/mssql-server.service
           ├─2625 /opt/mssql/bin/sqlservr
           └─2638 /opt/mssql/bin/sqlservr

Dec 05 22:50:10 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:10.85 spid17s     Server is listening on [ 0.0.0.0 ...433].
Dec 05 22:50:10 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:10.87 Server      Server is listening on [ 127.0.0....434].
Dec 05 22:50:10 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:10.89 Server      Dedicated admin connection suppor...1434.
Dec 05 22:50:10 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:10.89 spid17s     SQL Server is now ready for clien...ired.
Dec 05 22:50:11 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:11.77 spid6s      Starting up database ‘tempdb‘.
Dec 05 22:50:12 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:12.02 spid6s      The tempdb database has 1 data file(s).
Dec 05 22:50:12 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:12.02 spid20s     The Service Broker endpoint is in...tate.
Dec 05 22:50:12 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:12.03 spid20s     The Database Mirroring endpoint i...tate.
Dec 05 22:50:12 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:12.09 spid20s     Service Broker manager has started.
Dec 05 22:50:12 localhost.localdomain sqlservr[2625]: 2016-12-06 03:50:12.14 spid5s      Recovery is complete. This is an ...ired.
Hint: Some lines were ellipsized, use -l to show in full.

启动成功后使用微软提供的命令行工具连接也可以,使用windows上的客户端连接也可以 https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-setup-tools 下图是2G内存上运行的mssql

Ubuntu上的破解会不一样,因为Ubuntu安装前会运行检测程序,如何破解将在下一篇讲解

题外话

  • mssql for linux有日期限制和联网验证,预计正式版以后免费的可能性很小
  • mssql在linux上编译开启了pie选项并且没有符号表导出,这让gdb跟踪变得很困难,但这次破解只需要静态分析
  • mssql的本体封在了/opt/mssql/lib/sqlservr.sfp里面,如果需要破解其他限制可能还需要花功夫研究这个文件
时间: 2024-10-27 11:17:48

破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇) 转的相关文章

VMware发布Linux虚拟桌面技术预览版

VMware发布Linux虚拟桌面技术预览版 在众多客户的一片呼吁声中,VMware在3月中旬发布了Linux虚拟桌面的技术预览版.从此,用户可以通过VMware Horizon View来建立.发布并管理Linux虚拟桌面了.抢鲜尝试连接: http://www.surveymethods.com/EndUser.aspx?DFFB978FDE988B88D4 (注意:如果直接点击上面的连接出错,可将其拷贝到浏览器里再打开) 本篇博客将讨论以下三点: 一.    VMware Linux虚拟桌

微软发布 Linux 下的 SQL Server 公众预览版

微软发布了它的下一个版本的 SQL Server 数据库的公众预览版,同时支持 Linux 和 Windows. 在今年 3 月,微软发布过 SQL Server for Linux 的一个内部预览版.同时,微软官方说 SQL Server for Linux 是 SQL Server for Windows 版本的一个子集,将可以运行在 Ubuntu 上或作为 Docker 镜像运行(后来补充说内部预览也支持 Red Hat 的 RHEL).该公司官方称用户购买的 SQL Server 将可以

消息:SQL Server 2017(vNext)的第三个公开的CTP(社区技术预览版)发布了

今天看到了一个新闻,跟大家分享一下,有兴趣的可以去尝试一下. SQL Server 2017 CTP3于5月23日发布了,详细版本号是6.7.55.0. 大家可以去安装试试.在下载页面,目前是SQL Server vNext.预计下一个CTP版本会把所有2017的字样都更新成vNext,计划是六月份. 请从这里下载预览版:Microsoft System Center Management Pack (Community Technical Preview 3) for SQL Server v

Swift 3.0首个开发者预览版将在5月12日释出

关于Linux的学习,请参考书籍<Linux就该这么学> swift团队在博客中宣布Swift 3.0语言首个开发者预览版将于5月12日释出,正式版将在4-6周之后推出.开发者预览阶段并无确定的更新周期和计划,不过Swift团队称努力将其控 制在4-6周内.按此计划,Swift 3.0将错过WWDC发布窗口,团队计划于年底随新版本Xcode升级版一起发布. Swift的GitHub库也将被分为三个分支:主流分支.Swift 3.0预览分支.和Swift 3.0分支.基于Swift的开发将被限定

Windows 10 技术预览版抢先体验

Windows 10 是微软公司新一代操作系统,即传说中的Windows Threshold,NT内核为6.4.该系统于2014年9月30日(美国东部时间, 北京时间2014年10月1日)发布开技术预览版.北京时间10月2日凌晨开放下载技术预览版[1] .该操作系统可能会是微软的最后一款操作系统(即不再有大更新). Windows 10正式版将于2015年发布,将涵盖PC.平板电脑.手机.XBOX和服务器端,芯片类型将涵盖Intel.AMD和ARM[2] . 上面文字引述百度百科内容. ====

微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server

微软已经发布 Windows Server 2016 和 System Center 2016 第三个技术预览版,已经提供下载.Windows Server 2016 技术预览版第三版也是首个包括了容器技术的支持的版本,也提供了 Nano Server 和数据中心增强的功能. Windows Server 容器是微软和 Docker 合作的,开发者可以通过隔离操作系统环境的方式来运行应用.Windows Server 容器是 Docker 开源计划的一部分,容器可以通过 PowerShell 或

Brackets 1.8 预览版,Web 前端开发 IDE

Brackets 1.8 预览版发布了,Brackets 是 Adobe 的开源 HTML/CSS/JavaScript 集成开发环境(入门教程qkxue.net).Brackets 当前为Mac, Windows以及Linux (Debian/Ubuntu)提供最新稳定版的二进制发布(腾云科技ty300.com), 源代码托管在GitHub上. 暂未发行更新内容,点此查看项目提交记录. 发行说明及下载地址: https://github.com/adobe/brackets/releases

Visual Studio 2015 预览版 - 支持跨平台开发Android/iOS应用程序(内置安卓模拟器)

微软最近的惊人举动真多,对普通消费者Office 移动版宣布免费,对开发者也发布了完全免费的 VS2013 社区版! 不仅如此,就连 .Net 开发框架环境也竟然「开源」并且跨平台支持 Mac 及 Linux 了!! 同时宣布的 Visual Studio 2015 和 .Net 2015 预览版均也开放下载了.作为微软跨平台新战略下的开发工具, VS2015 支持开发人员编写跨平台应用程序,从 Windows 到 Mac.Linux.甚至是编写 iOS 和 Android 代码! 此外,微软还

win 10 抢先预览版

================================================================== 第一部分:安装 使用windows 10技术预览版光盘启动. 安装界面的整体风格和windows8类似. 仔细来看,界面风格还是有细微的变化的,显得更加时尚. windows 10技术预览版的设置界面. 进入系统后,可以看到右下角版本号是9841,注意这里和windows 8不同的是,安装完成后,直接进入传统桌面. ========================