back to article The point of containers is they aren't VMs, yet Microsoft licenses SQL Server in containers as if they were VMs

Microsoft has slipped out licensing details for SQL Server running in containers and it will likely encourage developers to be pretty diligent in their use of Redmond’s database. Spotted by the license-scrutineers at Licensing School in Microsoft’s May 1 Product Terms update [.DOCX], licensing works as follows: For purposes …

  1. werdsmith Silver badge

    Docker desktop on Windows uses Hyper-V and creates a VM when it’s installed.

    I only know this because i saw it in Hyper-V manager, and to be honest despite using Docker containers for more than a year now I still haven’t got my head round them.

    1. Adam Connelly

      The reason that Docker Desktop on Windows creates a Hyper-V container is that it needs a Linux operating system to allow you to run Linux containers. Because containers aren't VMs, they rely on a host operating system to provide the low level services that they need to function (CPU, memory, I/O, ...). One way to think of it is that you're doing cross-platform development. If you wanted to do Android development you would need to run an Android emulator on your machine to run your applications without deploying them to a phone - this is pretty similar.

      This isn't representative of using containers in production. This is just a development setup that you can use while working with containers locally.

    2. Maventi

      Apart from the licensing craziness in TFA, this is the other reason I don't get why anyone would run SQL Server containers in Windows. My understanding is that the container runs SQL Server for Linux, which is a Windows app running on shims to translate Linux API calls (pretty much the inverse of WSL v1), then that in turn gets executed within a Linux kernel running in a VM on Windows, which in most cases is probably also virtualised on another hypervisor layer in the datacenter. That goes against the entire premise of running containers for efficiency.

      1. Jonathon Desmond

        Actually it’s very efficient - albeit only at generating licensing revenue.....

      2. Anonymous Coward
        Anonymous Coward

        Your understanding is incorrect. Native Windows containers have existed since 2016.

        https://www.docker.com/blog/considerations-running-docker-windows-server-2016-hyper-v-vms/

        https://docs.microsoft.com/en-us/archive/blogs/sqlserverstorageengine/sql-server-in-windows-containers

  2. Joe W Silver badge

    Like Oracle....

    ... I think I heard some gnashing and wailing from that building across the road where our org's org sits (HR, licenses, law, anything administrative - nothing tech related), and I think Oracle's licenses are even worse, but Borkzilla is getting there.

    1. EricM

      Yeah, smells like "embrace, extend, ..." of Oracle's bullshit VM policies...

      ... but I do not expect the usually following "extinguish" in this case, though ...

      1. Dvon of Edzore
        Thumb Up

        Re: Yeah, smells like "embrace, extend, ..." of Oracle's bullshit VM policies...

        The new Redmonster creed includes "Extort" in the triplet. Much better for performance reports, both individual and corporate, and no pesky kids government investigations because they like taxes too.

    2. jelabarre59 Silver badge

      Re: Like Oracle....

      That was my thought. It sounded *exactly* like the situation at a prior job of mine, where they were moving all their Oracle servers from HPUX machines to Linux VMs on ESX. Oracle's "re evaluation" of licensing on VMs suddenly made the prospect WAY more expensive.

      1. flatline2000

        Re: Like Oracle....

        The minute I read the headline I thought Oracle, VM’s.. charge the price of the underlying hardware so people don’t get any clever ideas of stealing RAM and Processor when the auditors ain’t around..

  3. Steve Davies 3 Silver badge
    Facepalm

    Where there is a will, there is a way

    For the arcane licensing conditions imposed by the likes of Microsoft and Oracle to shaft you then they will do so and hit your costs hard.

    Such is the way of the world.

  4. Anonymous Coward
    Anonymous Coward

    Really, why would anyone think this would be done any other way. You are installing an instance of SQL Server, so you license it on how many cores it has, like a VM.

    If you are running in the 'cloud' and using BYOL, then you will be paying for each instance you deploy, as you have no control over the hardware and the number of cores it has (you are sharing it with others).

    If you are running on your own hardware, want unlimited instances of SQL Server, buy licenses for all the cores on your hardware you intend to run them on, run as many instances are you want in containers or VMs. Moving SQL Server to a container isn't changing what it is.

    If they wanted to move their licensing model to a more container / micro-service approach, they could add a per DB license model, or Data Volume model.

    1. Charlie Clark Silver badge

      Agreed, containers are merely "lightweight" VMs. Lightweight only refers to the way the virtualisation is implemented.

      1. Warm Braw Silver badge

        And if they're genuinely lightweight, with this model you would, core-for-core, expect to get more performance per currency unit out of a container-based instance than the same number of cores in a VM.

        Of course, if you're not irrevocably tied to SQL Server, you could use PostgreSQL instead and not have to worry about the licensing costs.

      2. bazza Silver badge

        What's a VM These Days Anyway?

        With so much of the IO being punted back to the host via very thin virtual devices, and often running a single application, such a VM is really nothing more than a fancy green threads scheduler sat on top of a host OS.

    2. jelabarre59 Silver badge

      Really, why would anyone think this would be done any other way. You are installing an instance of SQL Server, so you license it on how many cores it has, like a VM.

      If they're doing it like Oracle does, they charge by the number of cores on the *HOST* system, not the VM. So if you want to balance your VMs around to multiple hosts (maybe just two Oracle or SQL VMs per host) you have to pay for ALL the cores, even if you only assign 2 cores to that VM. This is where the problem comes in.

      1. Anonymous Coward
        Anonymous Coward

        Microsoft licencing currently isn't like that. If you have a VM, you can license the VM itself or the host if you want to run multiple. You need to calculate the break even point for that. But if you are doing it per host and using VMs you then need to licence all the hosts. Per VM is the VM, move it if you like, but to move it more than every 90 days you need to have software assurance. You can licence just a single host, but you would need to move all the VMs at the same time to the new host, again, needing SA or limiting it to every 90 days.

        You also have the server licence instead of core licence model, but you require CALs and that is limited to standard only, so you are limited to 64GB RAM i think it is now. It also means it is really only useful for internal services where you can assign users or devices. Internet facing things using the DB need to be per core.

        1. Nick Ryan Silver badge

          It's a nightmare isn't it? It took quite a lot of consultations with Microsoft's licensing monkeys to confirm and validate a solution.

          In the end we have a license of Windows server datacentre edition with licenses for the number of cores on the VM host servers. This gives us an unlimited number of guest instances of windows server DC edition.

          1. Lorribot Bronze badge

            MS licencing is just a simple maths problem. depending number of cores in the hosts and how many VMs you run on them dictates wheter you go DC licencing on the hosts, doing so does simplyfy things some what, there are also restrictions relating to EA/SA agreements.

            Std and DC versions are near identicle in feature set, there is just teh licence difference and some extra stuff for Hyper-v in DC. for most VMs I would run Std.

            For SQL you can limit VMs to certain hosts and only licence those, again very simple, also developer edition is free so if you put all your non=prod systems on that version you run them anywhere.

            Also there are free editions of SQL that may be more apropriate for containers.

            Oracle you have to licence ever core that exist anywhere in your estate that a vm could potentially move to. (this is for Oracle databases and Java installs on servers if you use Oracle runtimes like SAP does)

            1. Anonymous Coward
              Anonymous Coward

              Or do what we do and use PostgreSQL instead while we spend our precious time on real work.

            2. hoola Bronze badge

              MS Licensing is currently being designed to ensure that any Azure options are starting to look more cost effective. This is all about revenue generation and lockin. The more people that decide to buy into Azure because it makes on-prem licensing cheaper the better (for Microsoft). This will then evolve to the point that people just put stuff straight into Azure and pay.

              The end result is the people running the software pay progressively more and become totally dependent on Azure.

              Microsoft's goal is to have everything in Azure, you have no need for any data centres of your own because (according to the marketing BS salespeople) Azure is cheaper and better than anything you can do on-prem. This is touted at board level and is bought into by management. Statements such as "server teams are just highly paid janitors that add no value to your business" go down well with the board of directors. The numbers thrown around are complete works of fiction but make great headlines. This is all good until, after a number of years the finance teams want to know why you are spending millions for these services. At that point there is realistically no way out. Some will move back to running their, others will simply continue to pay because they no longer have the capability to do anything else.

            3. Anonymous Coward
              Anonymous Coward

              re: Std vs DC

              Actually, there are apps that will only run on Datacenter. Enterprise CA is one of them.

              1. Anonymous Coward
                Anonymous Coward

                Re: re: Std vs DC

                Don't need DC for enterprise CA. It used to be that you needed enterprise edition, but that requirement was removed in 2012 i believe when they switch to standard and dc editions, with the main difference being vitualisation rights. This has changed a little in later versions with dc having other features added that standard doesn't.

                1. Anonymous Coward
                  Anonymous Coward

                  Re: re: Std vs DC

                  Confusing, isn't it?

      2. mebh

        Note this part:

        ...the Physical or Virtual Cores available to that container are considered to be Hardware Threads...

        Luckily this is one area where Microsoft is kinder than Oracle - you don't have to license the underlying host.

    3. John Brown (no body) Silver badge

      "so you license it on how many cores it has, like a VM."

      Why? I can understand licencing per instance, but licensing per core? All that does is make things run faster and more efficiently. Next thing we know, they'll be increasing licensing based on the speed of each core. The entire concept of charging ever greater licensing fees based on the number of cores is just wrong. Why should my software cost more run per user when I spend more on faster and better hardware? Or be artificially limited to 2 cores on my 64 core beats?

      1. PermissionToSpeakPlease

        Per core makes much more sense than per instance.

        It's about paying for for the software to get through a certain workload in a certain time.

        In your model of per-instance pricing, if I only had machines with limited amounts of cores and needed say 4 instances to get through that workload in a certain time, I would be paying 4 times as much than if I had bigger machine with more cores to throw at it. To run the same workload in the same time, with roughly equal amounts of hardware (except some motherboards etc).

        You pay more if you use more cores because the software you license gets to do more.

        1. Anonymous Coward
          Anonymous Coward

          That is how they see it now due to the number of core you can get in a single system. Like you said, now you could have a single system that a few years back required 4, as you can now get 128 cores in a dual socket system.

          This may go even further, like you also said its about performance. IBM currently do it for their websphere licencing model. They have a unit cost for different types of processor cores based upon their performance. So you pay for the number of transactions per second a core can do. So have lots of slow cores, or a few very fast ones, same price as they can do the same number of transactions (doesn't work out that way as the per core performances are not very big, so price doesn't change a lot).

        2. John Brown (no body) Silver badge

          Yeah, so basically it's gouging. Pretty much every other item of software you buy, you pay per instance or user at most. I can run a big spreadsheet, video renderer or ray tracer on cheap. low core count hardware and wait ages or I can throw bigger faster hardware with more cores at it. Why should I pay more for the software? They buyers of these databases should have been telling the sellers to piss off when they came up with this cash extraction model.

          Like I said, and based on your rate of throughput argument, why are the DB sellers only counting cores? Surely they should be looking at total throughput and increasing the rental rates if you have brand new faster hardware than Joe blogs down the road running on last years hardware but with the same core count.

      2. LDS Silver badge

        "Next thing we know, they'll be increasing licensing based on the speed of each core"

        Oracle did it already years ago. IIRC right before speeds where increasing again quickly between Pentium II and Pentium III. or the latter and Pentium 4, don't remember exactly now, should check. If you needed to change the hardware, and were no longer able to source the slower processors, you had to pay for the new CPU speeds...

    4. Tinslave_the_Barelegged

      > You are installing an instance of SQL Server, so you license it on how many cores it has, like a VM.

      Gosh, that makes it sound as though proprietary database licencing terms are a law of nature.

    5. David Woodhead
      Facepalm

      Why?

      I have never before come across a set of circumstances to which the reply 'I don't fucking care, and why should I have to waste a microsecond of my very finite life in considering the implications of this?' seem more appropriate.

      There are teams of lawyers worldwide, who are presumably intelligent and reasonably creative people, making more money than I could ever dream of by devoting their lives to this dreck, and we wonder why things that need to be done like sorting out climate change, overpopulation, social housing and the depletion of natual resources (to name but four) seem to be overlooked.

      Bring on the heat death of the universe. It's long overdue.

      A grumpy old man.

  5. rmullen0

    Cloud is a joke

    I think all this Docker container stuff is a total joke. It's nothing but a way for corporations get you to pay rent. PostgreSQL is good enough now that there really is no need for SQL Server anymore.

    1. John H Woods Silver badge

      Re: Cloud is a joke

      I'm conflicted ... I somewhat disagree with the first part of your post and somewhat agree with the latter!

      1. Charlie Clark Silver badge

        Re: Cloud is a joke

        While containers aren't a joke they are definitely overrated and often incorrectly used. The main reason behind them is being able to deploy specific services quickly, and in exactly the same way on multiple machines. Of course, this is almost identical to deploying VMs but the start up time and resources required for a container is less.

        1. Graham Dawson Silver badge

          Re: Cloud is a joke

          They're a fancy, self-contained chroot and that's basically it. Convenience always comes in cans.

          1. Charlie Clark Silver badge

            Re: Cloud is a joke

            I think you're basically right and BSD and Solaris beards are still wanting to know what all the fuss is about, but did get a performance boost a few years ago through a kernel module, which gives them direct acess to the hypervisor on the silicon.

            1. Anonymous Coward
              Anonymous Coward

              Re: Cloud is a joke

              If only those BSD and Solaris Beards had wrapped their bash script in a yaml based api that developers could have understood easier than bash script they to could have been going bankrupt like docker.com when the big tech boys stole their product and sold it as a “cloud” product..

  6. karlkarl Silver badge

    Surely people like this? You chose a non-opensource solution, you obviously *want* to pay out of the backside.

    There are many alternatives, if you need that support (often used as an argument) then why not pay. And pay extra because you are asking for support in a number of different chrooted environments.

    Microsoft are only in the wong by profiteering from people making bad choices.

    1. BenDwire Silver badge
      Facepalm

      Microsoft are only in the wong by profiteering from people making bad choices

      Surely this summarises the entire tech industry, from phones to music and onto doorbells and lightbulbs?

    2. Anonymous Coward
      Anonymous Coward

      "Microsoft are only in the wrong by profiteering from people making bad choices."

      Microsofts take on containers almost completely misses the point of using containers as a lightweight, self-contained environment on top of a minimal OS as an alternative to a VM environment by making you run that said lightweight environment on top of all the crap you would normally deploy anyway.

      That customers then compound the idiotic product offering by being so sure that they need Docker without spotting the architectural flaws that the are willing to pay over and over again.

      Two wrongs may not make a right, but they certainly provide a lucrative sales opportunity.

      1. jelabarre59 Silver badge

        You'd think the programming "geniuses" at Microsoft should be able to figure out a containerization function for MSWindows too, right? Split out userspace functions into their own little boxes; after all MSWindows has such a rock-solid kernel, and distinct separation of kernel-space and user-space...

        Wait... what? Oh, nevermind.

      2. karlkarl Silver badge

        "Microsofts take on containers almost completely misses the point of using containers as a lightweight, self-contained environment on top of a minimal OS"

        I don't know. Get rid of the VM or container and imagine you are running two instances of their product on the machine at the same time. I suppose each one *should* be licensed and support paid.

        If that is still hard to justify, imagine you are running version 2018 of their product on the same machine as version 2020 of their product. Because they are subtly different, they do require extra support. Your containerised instances are also subtly different versions of the product (i.e because they are in different environments)

        Of course I recommend choosing open-source in future.

      3. LDS Silver badge

        That has nothing to do with licensing a database server. For the matter, many database servers where "containers" because you did run the database and nothing else from that machine if you wanted to achieve decent performance, since but for trivial applications usually the database used all the available RAM, CPU and I/O. Some databases even bypassed the OS file system and take direct control of the disks. Really, the OS was just there to start the database server software. Later the hardware became big enough to allow to run full instances into VMs or containers.

        So if you deploy a physical system, a VM, or container for the same workload why should it be priced differently? The fact one or the other could be easier to manage is not a concern of the software maker.

        Maybe not a good way to create microservices - but if each microservice needs a separate database instance, IMHO you will have bigger problems in the future than the database licensing.

  7. markl66

    Now with .NET Core and EF Core, can host database in MySQL and talk to it via EF Core by C#/LinQ, so avoiding using the expensive SQL Server solution, esp. the one that tries to tie you to Azure. .NET Core/MySQL can be hosted on Linux/Mac

  8. Christopher Lane
    Stop

    What next...?

    ...I buy a car and it's price is flexed depending if only I -OR- or me AND the missus drive it?

    1. Anonymous Coward
      Anonymous Coward

      @Christopher Lane - Re: What next...?

      Oh, rats! You just gave them the idea! Please be more careful will you ?

    2. Beeblebrox

      only I -OR- or me AND the missus drive it

      Works for the car insurance companies.

    3. Pier Reviewer

      Re: What next...?

      You’re not buying it... It’s closer to the car PCP model. You rent it. You stop paying rent it goes back to the dealer/MS. You drive the car lots? You pay more to the dealer. You use SQLS lots? You pay more to MS.

      I’m not a fan of MS’s licensing model to be fair for various reasons (complexity being high up on the list) but what you describe already exists, and for a physical object, not just software.

    4. Wardy01

      Re: What next...?

      That's basically how insurance works.

      This article is retarded, SQL instances basically hog cores due to the nature of their workload, the more physical hardware you use the more you pay for it's that simple.

      The smarter choice is to avoid it altogether and use elastic instances but the idiot that write this wants to do the typical reg thing and bash Microsoft again.

    5. Ken 16 Silver badge
      Trollface

      FTFY

      Or you buy a car (software) and the road tax (license fee) is flexed depending on the size of the engine (number of cores)?

  9. HarrisMirza

    I don't really see an issue with this. Why would you not be charged for every instance you deploy? Just because you are using containers for your DB, doesn't mean that software should be cheaper.

    1. dajames Silver badge

      I don't really see an issue with this. Why would you not be charged for every instance you deploy?

      Really?

      You bought a DBMS Why should it matter how many cores you run it on, or how many different databases you manage with it -- how would you like it if MS licensed Word on a per-document basis, or charged more for copies of Word that could handle more than a set number of pages in a document, or more than a certain number of documents open at a time?

      Licensing per-core or per-instance is just gouging.

      1. LDS Silver badge

        Because it impacts directly how many licenses you need. In the past the hardware put an upper limit. You could not scale a database server enough to sustain more than x applications on each, you needed separate physical systems, and a license for each. Then hardware began to grow much more than software needs, so you could scale the hardware only and put more workloads on each. To protect revenues companies needed to find a new license mode. Like it or not, companies exist to make money, and some of those money are also paid to employees and suppliers.

        Think if a single computer in the office would let several employee work at once with the same license of Word - it's clear the license model will be changed.

        Do you remember how mainframe time was licensed and paid?

      2. DavidRa

        So your contention here seems to be that a SME with a need for SQL Server to support a line of business application for 50 users on 4 cores in a VM or container should pay the same as a large multinational who want to support 5,000 users on bare metal and 128 cores.

        I don't agree with that opinion at all.

        If you don't want to pay the licenses, buy or build a solution that doesn't require them. Otherwise - it's a business, pay for the software.

  10. Nick Ryan Silver badge

    I'm struggling with the use case as to why someone would want to fire up a very light weight VM (which is what containers are meant to be) and have an instance of MS-SQL server running in it. MS-SQL is anything but light weight. I can understand lots of containers with MS-SQL clients running in them, but to fire up MS-SQL servers on demand? It feels like either a bit of an edge case or a rather "interesting" design choice.

    1. Anonymous Coward
      Anonymous Coward

      @Nick Ryan - To help you understand,

      please keep in mind we're talking developers here. They are pretty clueless when it comes to networking, security or infrastructure. They can't be bothered with these mundane details, all they care for is where to paste the code they've copied from the Internet and other cool stuff.

    2. Adam Connelly

      I can think of a few, but they probably don't fit into the licensing issues that this article is about:

      - I want to make it easier for other devs to get a development environment up and running quickly, but want to avoid having to go through the full SQL Server installation process, or want the ability to switch versions quickly.

      - I want an easy way to spin up a database for running automated end to end tests as part of CI/CD pipelines, and I want to be able to just bin it easily once I'm done.

      In both those examples I maybe don't care if the performance of the SQL server instance isn't as good as a bare metal install, and I potentially don't care if any of the data is persisted or not. What I care about is that I can get something up and running quickly.

      Not saying you don't have valid points, I'm just saying that production isn't the only use-case for running database servers, and there are situations where you want something transient that you can start and stop rapidly.

      1. cjehinds
        Thumb Up

        Agree with these use cases

        The use cases you describe (dev environments, rapid testing against multiple versions) is absolutely where containerisation makes sense. In that case though you'd be using Microsoft SQL Server Developer edition though which is free - feature equivalent to SQL Enterprise you just can't use it for Production workloads... in other words ideal for this use case :)

  11. Anonymous Coward
    Anonymous Coward

    FFS

    I'm an engineer not an accountant.

    1. Rich 11 Silver badge

      Re: FFS

      "Dammit, Jim, I'm a doctor, not a bricklayer!"

  12. Henry Wertz 1 Gold badge

    Fair enough

    Fair enough. First off, I'd just use MySQL or the like anyway, screw SQL Server.

    But, for the practical purposes of "lets run a bunch of seperate junk on one system" use of running containers or VMs, they are functionally the same for that purpose other than the containers having less overhead. I bet if I wanted to run 5 copies of SQL Server on one machine I'd be expected to pay for 5 copies of SQL Server... so, this way, I'm paying for 5 but at least only have to pay for the subset of CPUs (or threads or whatever) actually assigned to that container. The containerized SQL Server (I assume) will have less overhead and so run a bit better than the SQL Server in a VM under yet another copy of Windows (you're saving on paying for a VM copy of Windows at least!)

    edit: Nope, you can pay for all cores on a system and run as many SQL Servers as you want. But still, this provides the offer of giving it like 1 core to save money on some monster 128-core or whatever box.

  13. Lorribot Bronze badge

    Licencing is easy

    There three types of licencing,

    Microsoft, you have to licence all physiccal cores the software can run on, this can be restriced in software, you just need to prove it.

    Oracle, you have to license every physical core that you have in your entire estate that the software is able to to run on or move to even if you would never move it there and we don't care about simplifying your platform management, just pay us all your money just in case you move it to that country over there, oh and did you know it can run on on your edge switches since Cisco added that feature so that is another £1m please..

    Open Source, you dont have to licence it, but if if it breaks you will want support and you may have to pay based on every physical core evrywhere in your estate, just in case.

    1. Maventi

      Re: Licencing is easy

      > Open Source, you dont have to licence it, but if if it breaks you will want support and you may have to pay based on every physical core evrywhere in your estate, just in case.

      Or you simply pay for support for the dev environment, reproduce the issue, apply the fix, test, then apply the same fix to production. A lot of folks run a mix of RHEL and CentOS following this same model. Much more cost effective than paying for absolutely everything, and avoids the continual wasted time of accounting for it all.

      1. Mark 65

        Re: Licencing is easy

        Yep, worked at a few places that use the single RHEL, multiple CentOS model.

    2. damiandixon

      Re: Licencing is easy

      Or you pay for a postgres developer fulltime to work for you on postgres and then ask oracle for a very deep discount because look you can jump ship anytime you want too... Know a company that's doing this....

  14. Wardy01

    Seriously?

    Waaaaaaaa Microsoft is charging me for the hardware I consume on their servers, look how evil they are guys!

    These articles get worse every day.

    1. Anonymous Coward
      Anonymous Coward

      Re: Seriously?

      When Microsoft behave like this they bring it on themselves.

      Despite what they'd have people believe, it's not like any of their products are the only choice. There are other vendors, and OSS can provide a viable alternative where you don't have to pump untold millions into the licences alone. For the sort of money some of these licences could cost, with the utterly ridiculous per machine plus per user plus per core plus per thread plus per GHz plus per transaction per second licensing models, you could have your own custom software written to do the job which would be both cheaper and far more suited to your each businesses specific use cases.

    2. Anonymous Coward
      Anonymous Coward

      Re: Seriously?

      "...Microsoft is charging me..."

      The fact they are charging is not the problem, it's how arcane the process is that is the issue. If you can't see past then I suggest you broaden your tech knowledge.

  15. Ken 16 Silver badge
    Thumb Up

    Good to know the gotchas

    Licensing is one of the constraints that goes into a systems operational architecture. I have seen developers include relational databases in containerised solutions but to me this should be tiering issue, any persistent data that requires ACID compliance should be in a self contained tier and if cost is your objective that makes more sense to be on a physical cluster or a dBaaS. Non-persistent data and application configuration is better off on an OSS data store and probably non-relational so stick it in the container. the nightmare is when you have to containerise an older application, because you don't have time to fix it properly, and then scale horizontally but consider MS licensing as being a fine on bad behavior then.

POST COMMENT House rules

Not a member of The Register? Create a new account here.

  • Enter your comment

  • Add an icon

Anonymous cowards cannot choose their icon

Biting the hand that feeds IT © 1998–2020