{"id":18105,"date":"2016-12-16T10:00:21","date_gmt":"2016-12-16T18:00:21","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/dataplatforminsider\/?p=18105"},"modified":"2024-01-22T22:50:40","modified_gmt":"2024-01-23T06:50:40","slug":"sql-server-on-linux-how-introduction","status":"publish","type":"post","link":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/","title":{"rendered":"SQL Server on Linux: How? Introduction"},"content":{"rendered":"<p><em>This post was authored by Scott Konersmann, Partner Engineering Manager, SQL Server, Slava Oks, Partner Group Engineering Manager, SQL Server, and Tobias Ternstrom, Principal Program Manager, SQL Server.<\/em><\/p>\n<h4><a><span style=\"color: #000000\">Introduction<\/span><\/a><\/h4>\n<p>We <a href=\"http:\/\/blogs.microsoft.com\/blog\/2016\/03\/07\/announcing-sql-server-on-linux\/#sm.00000g5feswlpncs5vljgonb8xzu0\">first announced<\/a> SQL Server on Linux in March, and recently released the <a href=\"https:\/\/blogs.technet.microsoft.com\/dataplatforminsider\/2016\/11\/16\/announcing-sql-server-on-linux-public-preview-first-preview-of-next-release-of-sql-server\/\">first public preview of SQL Server on Linux<\/a> (SQL Server v.Next CTP1) at the Microsoft Connect(); conference. We\u2019ve been pleased to see the positive reaction from our customers and the community; in the two weeks following the release, there were more than 21,000 downloads of the preview. A lot of you are curious to hear more about how we made SQL Server run on Linux (and some of you have already figured out and posted interesting articles about part of the story with \u201cDrawbridge\u201d). We decided to kick off a blog series to share technical details about this very topic starting with an introduction to the journey of offering SQL Server on Linux. Hopefully you will find it as interesting as we do! J<\/p>\n<h4>Summary<\/h4>\n<p>Making SQL Server run on Linux involves introducing what is known as a Platform Abstraction Layer (\u201cPAL\u201d) into SQL Server. This layer is used to align all operating system or platform specific code in one place and allow the rest of the codebase to stay operating system agnostic. Because of SQL Server\u2019s long history on a single operating system, Windows, it never needed a PAL. In fact, the SQL Server database engine codebase has many references to libraries that are popular on Windows to provide various functionality. In bringing SQL Server to Linux, we set strict requirements for ourselves to bring the full functional, performance, and scale value of the SQL Server RDBMS to Linux. This includes the ability for an application that works great on SQL Server on Windows to work equally great against SQL Server on Linux. Given these requirements and the fact that the existing SQL Server OS dependencies would make it very hard to provide a highly capable version of SQL Server outside of Windows in reasonable time it was decided to marry parts of the Microsoft Research (MSR) project <a href=\"https:\/\/www.microsoft.com\/en-us\/research\/project\/drawbridge\/\">Drawbridge<\/a> with SQL Server\u2019s existing platform layer <a href=\"https:\/\/blogs.msdn.microsoft.com\/slavao\/2005\/07\/20\/platform-layer-for-sql-server\/\">SQL Server Operating System<\/a> (SOS) to create what we call the SQLPAL. The Drawbridge project provided an abstraction between the underlying operating system and the application for the purposes of secure containers and SOS provided robust memory management, thread scheduling, and IO services. Creating SQLPAL enabled the existing Windows dependencies to be used on Linux with the help of parts of the Drawbridge design focused on OS abstraction while leaving the key OS services to SOS. We are also changing the SQL Server database engine code to by-pass the Windows libraries and call directly into SQLPAL for resource intensive functionality.<\/p>\n<h4><a><span style=\"color: #000000\">Requirements for supporting Linux<\/span><\/a><\/h4>\n<p>SQL Server is Microsoft\u2019s flagship database product which with close to 30 years of development behind it. At a high level, the list below represents our requirements as we designed the solution to make the SQL Server RDBMS available on multiple platforms:<\/p>\n<ol>\n<li>Quality and security must meet the same high bar we set for SQL Server on Windows<\/li>\n<li>Provide the same value, both in terms of functionality, performance, and scale<\/li>\n<li>Application compatibility between SQL Server on Windows and Linux<\/li>\n<li>Enable a continued fast pace of innovation in the SQL Server code base and make sure new features and fixes appear immediately across platforms<\/li>\n<li>Put in place a foundation for future SQL Server suite services (such as Integration Services) to come to Linux<\/li>\n<\/ol>\n<p>To make SQL Server support multiple platforms, the engineering task is essentially to remove or abstract away its dependencies on Windows. As you can imagine, after decades of development against a single operating system, there are plenty of OS-specific dependencies across the code base. In addition, the code base is huge. There are tens of millions of lines of code in SQL Server.<\/p>\n<p>SQL Server depends on various libraries and their functions and semantics commonly used in Windows development that fall into three categories:<\/p>\n<ul>\n<li>\u201cWin32\u201d (ex. user32.dll)<\/li>\n<li>NT Kernel (ntdll.dll)<\/li>\n<li>Windows application libraries (such as MSXML)<\/li>\n<\/ul>\n<p>You can think of these as core library functions, most of them have nothing to do with the operating system kernel and only execute in user mode.<\/p>\n<p>While SQL Server has dependencies on both Win32 and the Windows kernel, the most complex dependency is that of Windows application libraries that have been added over the years in order to provide new functionality.\u00a0 Here are some examples:<\/p>\n<ul>\n<li>SQL Server\u2019s XML support uses <a href=\"https:\/\/en.wikipedia.org\/wiki\/MSXML\">MSXML<\/a> which is used to parse and process XML documents within SQL Server.<\/li>\n<li>SQLCLR hosts the Common Language Runtime (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Common_Language_Runtime\">CLR<\/a>) for both system types as well as user defined types and CLR stored procedures.<\/li>\n<li>SQL Server has some components written in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Component_Object_Model\">COM<\/a> like the <a href=\"https:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=17282\">VDI<\/a> interface for backups.<\/li>\n<li>Heterogeneous distributed transactions are controlled through Microsoft Distributed Transaction Coordinator (MS <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microsoft_Distributed_Transaction_Coordinator\">DTC<\/a>)<\/li>\n<li>SQL Server Agent integrates with many Windows subsystems (shell execution, Windows Event Log, SMTP Mail, etc.).<\/li>\n<\/ul>\n<p>These dependencies are the biggest challenge for us to overcome to meet our goals of bringing the same value and having a very high level compatibility between SQL Server on Windows and Linux. As an example, to re-implement something like SQLXML would take a significant amount of time and would run a high risk of not providing the same semantics as before, and could potentially break applications. The option of completely removing these dependencies would mean we must also remove the functionality they provide from SQL Server on Linux. If the dependencies were edge cases and only impacting very few customer visible features, we could have considered it. As it turns out, removing them would cause us to have to remove tons of features from SQL Server on Linux which would go against our goals around compatibility and value across operating systems.<\/p>\n<p>We could take the approach of doing this re-implementation piecemeal, bringing value little by little. While this would be possible, it would also go against the requirements because it would mean that there would be a significant gap between SQL Server on Linux and Windows for years. The resolution lies in the right platform abstraction layer.<\/p>\n<h2>Building a PAL<\/h2>\n<p>Software that is supported across multiple operating systems always has an implementation of some sort of Platform Abstraction Layer (PAL). The PAL layer is responsible for abstraction of the calls and semantics of the underlying operating system and its libraries from the software itself. The next couple of sections consider some of the technology that we investigated as solutions to building a PAL for SQL Server.<\/p>\n<h4>SQL Operating System (SOS or SQLOS)<\/h4>\n<p>In the SQL Server 2005 release, a platform layer was created between the SQL Server engine and Windows called the SQL Operating System (SOS). This layer was responsible for user mode thread scheduling, memory management, and synchronization (see <a href=\"https:\/\/blogs.msdn.microsoft.com\/slavao\/2005\/07\/20\/platform-layer-for-sql-server\/\">SQLOS<\/a> for reference).\u00a0 A key reason for the creation of SOS was that it allowed for a centralized set of low level management and diagnostics functionality to be provided to customers and support (subset of Dynamic Management Views\/DMVs and Extended Events\/XEvents).\u00a0 This layer allowed us to minimize the number of system calls involved in scheduling execution by running non-preemptively and letting SQL Server do its own resource management.\u00a0 While SOS improved performance and greatly helped supportability and debugging, it did not provide a proper abstraction layer from the OS dependencies described above, i.e. Windows semantics were carried through SOS and exposed to the database engine.<\/p>\n<p><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"939\" height=\"630\" title=\"01\" class=\"aligncenter\" style=\"float: none;padding-top: 0px;padding-left: 0px;margin-left: auto;padding-right: 0px;margin-right: auto;border: 0px\" alt=\"01\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg\" border=\"0\" srcset=\"\"><\/a><\/p>\n<p>In the scenario where we would completely remove the dependencies on the underlying operating system from the database engine, the best option was to grow SOS into a proper Platform Abstraction Layer (PAL).\u00a0 <b>All<\/b> the calls to Windows APIs would be routed through a new set of equivalent APIs in SOS and a new host extension layer would be added on the bottom of SOS that would interact with the operating system. While this would resolve the system call dependencies, it would not help with the dependencies on the higher-level libraries.<\/p>\n<h4><a><span style=\"color: #000000\">Drawbridge<\/span><\/a><\/h4>\n<p>Drawbridge was an Microsoft Research project (see <a href=\"https:\/\/www.microsoft.com\/en-us\/research\/project\/drawbridge\/\">Drawbridge<\/a> for reference) that focused on drastically reducing the virtualization resource overhead incurred when hosting many Virtual Machines on the same hardware.\u00a0 The research involved two ideas.\u00a0 The first idea was a \u201cpicoprocess\u201d which consists of an empty address space, a monitor process that interacts with the host operating system on behalf of the picoprocess, and a kernel driver that allows a driver to populate the address space at startup and implements a host Application Binary Interface (ABI) that allows the picoprocess to interact with the host.\u00a0 The second idea was a user mode Library OS, sometimes referred to as LibOS.\u00a0 Drawbridge provided a working Windows Library OS that could be used to run Windows programs on a Windows host.\u00a0 This Library OS implements a subset of the 1500+ Win32 and NT ABIs and stubs the rest to either succeed or fail depending on the type of call.<\/p>\n<p><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/02_thumb.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"930\" title=\"02\" class=\"aligncenter\" style=\"float: none;padding-top: 0px;padding-left: 0px;margin-left: auto;padding-right: 0px;margin-right: auto;border: 0px\" alt=\"02\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/02_thumb.png\" border=\"0\" srcset=\"\"><\/a><\/p>\n<p>Our needs didn\u2019t align with the original goals of the Drawbridge research.\u00a0 For instance, the picoprocess idea isn\u2019t something needed for moving SQL Server to other platforms.\u00a0 However, there were a couple of synergies that stood out:<\/p>\n<ol>\n<li>Library OS implemented most of the 1500+ Windows ABIs in user mode and only 45-50 ABIs were needed to interact with the host.\u00a0 These ABIs were for address space and memory management, host synchronization, and IO (network and disk).\u00a0 This made for a very small surface area that needs to be implemented to interact with a host.\u00a0 That is extremely attractive from a platform abstraction perspective.<\/li>\n<li>Library OS was capable of hosting other Windows components.\u00a0 Enough of the Win32 and NT layers were implemented to host CLR, MSXML, and other APIs that the SQL suite depends on. This meant that we could get more functionality to work without rewriting whole features.<\/li>\n<\/ol>\n<p>There were also some risk and reward tradeoffs:<\/p>\n<ol>\n<li>The Microsoft Research project was complete and there was no support for Drawbridge. Therefore, we needed to take a source snapshot and modify the code for our purposes.\u00a0 The risks were around the costs to ramp up a team on the Library OS, modify it to be suitable for SQL Server, and make it perform comparably with Windows.\u00a0 On the positive side, this would mean everything is in user mode and we would own all the code within the stack.\u00a0 Performance critical code can be optimized because we can modify all layers of the stack including SQL Server, the Library OS, and the host interface as needed to make SQL Server perform.\u00a0 Since there are no real boundaries in the process, it is possible for SQL Server to call Linux.<\/li>\n<li>The original Drawbridge project was built on Windows and used a kernel driver and monitor process.\u00a0 This would need to be dropped in favor of a user mode only architecture.\u00a0 In the new architecture, the host extension (referred to as PAL in the Drawbridge design) on Windows would move from a kernel driver to just a user mode program.\u00a0 Interestingly enough, one of the researchers had developed a rough prototype for Linux that proved it could be done.<\/li>\n<li>Because the technologies were created independently there was a large amount of overlapping functionality.\u00a0 SOS had subsystems for object management, memory management, threading\/scheduling, synchronization, and IO (disk and network). The Library OS and Host Extension also had similar functionality.\u00a0 These systems would need to be rationalized down to a single implementation.<\/li>\n<\/ol>\n<table align=\"center\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"161\" valign=\"top\"><b>Technologies<\/b><\/td>\n<td width=\"144\" valign=\"top\">\n<p align=\"center\"><b>SOS<\/b><\/p>\n<\/td>\n<td width=\"156\" valign=\"top\">\n<p align=\"center\"><b>Library OS<\/b><\/p>\n<\/td>\n<td width=\"160\" valign=\"top\">\n<p align=\"center\"><b>Host Extension<\/b><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"161\" valign=\"top\">\n<p align=\"left\">Object Management<\/p>\n<\/td>\n<td width=\"144\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"156\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"160\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"161\" valign=\"top\">\n<p align=\"left\">Memory Management<\/p>\n<\/td>\n<td width=\"144\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"156\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"160\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"161\" valign=\"top\">\n<p align=\"left\">Threading\/Scheduling<\/p>\n<\/td>\n<td width=\"144\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"156\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"160\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"161\" valign=\"top\">\n<p align=\"left\">Synchronization<\/p>\n<\/td>\n<td width=\"144\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"156\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"160\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"161\" valign=\"top\">\n<p align=\"left\">I\/O (Disk, Network)<\/p>\n<\/td>\n<td width=\"144\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"156\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<td width=\"160\" valign=\"top\">\n<p align=\"center\">\u2714<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u00a0<\/p>\n<h4>\n<a><\/a><a><span style=\"color: #000000\">Meet <\/span><\/a><span style=\"color: #000000\">SQLPAL<\/span><br \/>\n<\/h4>\n<p>As a result of the investigation, we decided on a hybrid strategy.\u00a0 We would merge SOS and Library OS from Drawbridge to create the SQL PAL (SQL Platform Abstraction Layer). For areas of Library OS that SQL Server does not need, we would remove them. To merge these architectures, changes were needed in all layers of the stack.<\/p>\n<p>The new architecture consists of a set of SOS direct APIs which don\u2019t go through any Win32 or NT syscalls.\u00a0 For code without SOS direct APIs they will either go through a hosted Windows API (like MSXML) or NTUM (NT User Mode API \u2013 this is the 1500+ Win32 and NT syscalls). All the subsystems like storage, network, or resource management will be based on SOS and will be shared between SOS direct and NTUM APIs.<\/p>\n<p><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/03_thumb.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1141\" height=\"545\" title=\"03\" class=\"aligncenter\" style=\"float: none;padding-top: 0px;padding-left: 0px;margin-left: auto;padding-right: 0px;margin-right: auto;border: 0px\" alt=\"03\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/03_thumb.png\" border=\"0\" srcset=\"\"><\/a><\/p>\n<p>This architecture provides some interesting characteristics:<\/p>\n<ul>\n<li>Everything running in process boils down to the same platform assembly code.\u00a0 The CPU can\u2019t tell the difference between the code that is providing Win32 functionality to SQL Server or native Linux code.<\/li>\n<li>Even though the architecture shows layering, there are no real boundaries within the process (<a href=\"https:\/\/en.wikipedia.org\/wiki\/The_Matrix\">There is no spoon!<\/a>).\u00a0 If code running in SQL Server which is performance critical needs to call Linux it can do that directly with a very small amount of assembler via the SOS direct APIs to setup the stack correctly and process the result.\u00a0 An example where this has been done is the disk IO path.\u00a0 There is a small amount of conversion code left to convert from Windows scatter\/gather input structure to Linux vectored IO structure.\u00a0 Other disk IO types don\u2019t require any conversions or allocations.<\/li>\n<li>All resources in the process can be managed by SQLPAL.\u00a0 In SQL Server, before SQLPAL, most resources such as memory and threads were controlled, but there were some things outside it\u2019s control.\u00a0 Some libraries and Win32\/NT APIs would create threads on their own and do memory allocations without using the SOS APIs.\u00a0 With this new architecture, even the Win32 and NT APIs would be based on SQLPAL so every memory allocation and thread would be controlled by SQL PAL. As you can see this also benefits SQL Server on Windows.<\/li>\n<li><a><span style=\"color: #000000\">For SQL Server on Linux we are using about 81 MB of uncompressed Windows libraries, so it\u2019s a tiny fraction (less than 1%) of a typical Windows installation. SQLPAL itself is currently around 8 MB.<\/span><\/a><\/li>\n<\/ul>\n<h4>Process Model<\/h4>\n<p>The following diagram shows what the address space looks like when running.\u00a0\u00a0 The host extension is simply a native Linux application.\u00a0 When host extension starts it loads and initializes SQLPAL, SQLPAL then brings up SQL Server.\u00a0 SQLPAL can launch software isolated processes that are simply a collection of threads and allocations running within the same address space.\u00a0 We use that for things like SQLDumper which is an application that is run when SQL Server encounters a problem to collect an enlightened crash dump.<\/p>\n<p>One point to reiterate is that even though this might look like a lot of layers there aren\u2019t any hard boundaries between SQL Server and the host.<\/p>\n<p><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/04_thumb.png\"><img loading=\"lazy\" decoding=\"async\" width=\"467\" height=\"712\" title=\"04\" class=\"aligncenter\" style=\"float: none;padding-top: 0px;padding-left: 0px;margin-left: auto;padding-right: 0px;margin-right: auto;border: 0px\" alt=\"04\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/04_thumb.png\" border=\"0\" srcset=\"\"><\/a><\/p>\n<h4><a><span style=\"color: #000000\">Evolution of SQLPAL<\/span><\/a><\/h4>\n<p>At the start of the project, SQL Server was built on SOS and Library OS was independent.\u00a0 The eventual goal is to have a merged SOS and Library OS as the core of SQL PAL.\u00a0 For public preview, this merge wasn\u2019t fully completed, but the heart of SQLPAL had been replaced with SOS.\u00a0 For example, threads and memory already use SOS functionality instead of the original Drawbridge implementations.<\/p>\n<p>The result is that there are two instances of SOS running inside the CTP1 release: one in SQL Server and one in SQLPAL .\u00a0 This works fine because the SOS instance in SQL Server is still using Win32 APIs which call down into the SQLPAL.\u00a0 The SQLPAL instance of the SOS code has been changed to call the host extension ABIs (i.e. the native Linux code) instead of Win32.<\/p>\n<p>Now we are working on removing the SOS instance from SQL Server.\u00a0 We are exposing the SOS APIs from the SQLPAL.\u00a0 Once this is completed everything will flow through the single SQLPAL SOS instance.<\/p>\n<h2>More posts<\/h2>\n<p>We are planning more of these posts to share to tell you about our journey, which we believe has been amazing and a ton of fun worth sharing. Please provide comments if there are specific areas you are interested in us covering!<\/p>\n<p>Thanks!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post was authored by Scott Konersmann, Partner Engineering Manager, SQL Server, Slava Oks, Partner Group Engineering Manager, SQL Server, and Tobias Ternstrom, Principal Program Manager, SQL Server. Introduction We first announced SQL Server on Linux in March, and recently released the first public preview of SQL Server on Linux (SQL Server v.<\/p>\n","protected":false},"author":1457,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","footnotes":""},"post_tag":[],"product":[5227,2418],"content-type":[2424],"topic":[],"coauthors":[2487],"class_list":["post-18105","post","type-post","status-publish","format-standard","hentry","product-sql","product-sql-server-on-linux","content-type-best-practices"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SQL Server on Linux: How? Introduction - Microsoft SQL Server Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server on Linux: How? Introduction - Microsoft SQL Server Blog\" \/>\n<meta property=\"og:description\" content=\"This post was authored by Scott Konersmann, Partner Engineering Manager, SQL Server, Slava Oks, Partner Group Engineering Manager, SQL Server, and Tobias Ternstrom, Principal Program Manager, SQL Server. Introduction We first announced SQL Server on Linux in March, and recently released the first public preview of SQL Server on Linux (SQL Server v.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft SQL Server Blog\" \/>\n<meta property=\"article:publisher\" content=\"http:\/\/www.facebook.com\/sqlserver\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-16T18:00:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-23T06:50:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg\" \/>\n<meta name=\"author\" content=\"SQL Server Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SQLServer\" \/>\n<meta name=\"twitter:site\" content=\"@SQLServer\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"SQL Server Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 min read\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/\"},\"author\":[{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/author\/sql-server-team\/\",\"@type\":\"Person\",\"@name\":\"SQL Server Team\"}],\"headline\":\"SQL Server on Linux: How? Introduction\",\"datePublished\":\"2016-12-16T18:00:21+00:00\",\"dateModified\":\"2024-01-23T06:50:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/\"},\"wordCount\":2673,\"commentCount\":12,\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/\",\"name\":\"SQL Server on Linux: How? Introduction - Microsoft SQL Server Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg\",\"datePublished\":\"2016-12-16T18:00:21+00:00\",\"dateModified\":\"2024-01-23T06:50:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#primaryimage\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg\",\"contentUrl\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Server on Linux: How? Introduction\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/\",\"name\":\"Microsoft SQL Server Blog\",\"description\":\"Official News from Microsoft\u2019s Information Platform\",\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization\",\"name\":\"Microsoft SQL Server Blog\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"contentUrl\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"width\":259,\"height\":194,\"caption\":\"Microsoft SQL Server Blog\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"http:\/\/www.facebook.com\/sqlserver\",\"https:\/\/x.com\/SQLServer\",\"https:\/\/www.youtube.com\/user\/MSCloudOS\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SQL Server on Linux: How? Introduction - Microsoft SQL Server Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/","og_locale":"en_US","og_type":"article","og_title":"SQL Server on Linux: How? Introduction - Microsoft SQL Server Blog","og_description":"This post was authored by Scott Konersmann, Partner Engineering Manager, SQL Server, Slava Oks, Partner Group Engineering Manager, SQL Server, and Tobias Ternstrom, Principal Program Manager, SQL Server. Introduction We first announced SQL Server on Linux in March, and recently released the first public preview of SQL Server on Linux (SQL Server v.","og_url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/","og_site_name":"Microsoft SQL Server Blog","article_publisher":"http:\/\/www.facebook.com\/sqlserver","article_published_time":"2016-12-16T18:00:21+00:00","article_modified_time":"2024-01-23T06:50:40+00:00","og_image":[{"url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg","type":"","width":"","height":""}],"author":"SQL Server Team","twitter_card":"summary_large_image","twitter_creator":"@SQLServer","twitter_site":"@SQLServer","twitter_misc":{"Written by":"SQL Server Team","Est. reading time":"11 min read"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#article","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/"},"author":[{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/author\/sql-server-team\/","@type":"Person","@name":"SQL Server Team"}],"headline":"SQL Server on Linux: How? Introduction","datePublished":"2016-12-16T18:00:21+00:00","dateModified":"2024-01-23T06:50:40+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/"},"wordCount":2673,"commentCount":12,"publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/","name":"SQL Server on Linux: How? Introduction - Microsoft SQL Server Blog","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#primaryimage"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg","datePublished":"2016-12-16T18:00:21+00:00","dateModified":"2024-01-23T06:50:40+00:00","breadcrumb":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#primaryimage","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg","contentUrl":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2016\/12\/01_thumb.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2016\/12\/16\/sql-server-on-linux-how-introduction\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/"},{"@type":"ListItem","position":2,"name":"SQL Server on Linux: How? Introduction"}]},{"@type":"WebSite","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/","name":"Microsoft SQL Server Blog","description":"Official News from Microsoft\u2019s Information Platform","publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization","name":"Microsoft SQL Server Blog","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","contentUrl":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","width":259,"height":194,"caption":"Microsoft SQL Server Blog"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/"},"sameAs":["http:\/\/www.facebook.com\/sqlserver","https:\/\/x.com\/SQLServer","https:\/\/www.youtube.com\/user\/MSCloudOS"]}]}},"msxcm_display_generated_audio":false,"msxcm_animated_featured_image":null,"_links":{"self":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts\/18105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/users\/1457"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/comments?post=18105"}],"version-history":[{"count":0,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts\/18105\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/media?parent=18105"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/post_tag?post=18105"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/product?post=18105"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/content-type?post=18105"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/topic?post=18105"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/coauthors?post=18105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}