Thursday, October 3, 2019

West Ghost IPA

West Ghost IPA

Thoughts as they rattle around in my head. 

Transparent musings for the soul of the IPA haunting once proud alchemists dedicated to clarity of their craft.

First there was Blind Pig. Along came Arrogant Bastard and Ruination which tried to  alter your DNA. Pliny The Elder landed upon this world forever changing the beer landscape. But, Green Flash birthed the name "West Coast IPA". The name that would be synonymous with Extreme IPA and the beer that would become the messiah of craft beer for more than a decade. 

Ah, the fantastic bouquet of pine, earth, grassy, citrus and some floral essence sprinkled about. The crisp edgy tingle on your lips and tongue. 

Smooth malt slides across your palate and is cast aside by a tangy bitterness. The assault continues as the alcohol evaporates as it swirls around your mouth releasing subtle sweetness and warmth.

The final bitterness casts about dank and sticky flavors you can almost smell. Or is it smells you can almost taste? The sudden dryness wipes a clean slate to your palate readying you for the next luxurious sip.

The beer that changed Craft Beer is the West coast IPA. Predecessors like Liberty Ale might have cleared a few boulders and more subtle IPA with subdued hops like Two Hearted or Lagunitas found a following but the West Coast IPA changed the beer world. 

Breweries crammed pound after pound of hops searching for the most potent concentration of hop aroma and flavors. The hundreds of bold and subtle aromas and flavors carrying you away to distant exotic lands full of rich spices and marvelous fields of flowers where their perfumes invoke feelings of happiness and euphoria.

These same potent elixirs came with a price. The bitterness assaulted your senses shattering the your almost spiritual journey dragging you back to reality with barbed hooks and rusty edge spears. The West Coast IPA broke through the boundaries of sensibility and flagrantly abused you at the whim of the brewer.

We flocked to these beers clamoring for more, more more hops. But we lost sight of the different between hops and bitterness. For a time, we lost the our way among the harsh, coarse and hard to swallow bitter pill accompanying the once breath taking beer. 

So the ship started righting itself. Unfortunately, while the West Coast IPA was re-centering itself and shedding some of the  extremes trying to re-define it, a gap was left in the IPA world. This hole, like the swirling mist of a seers crystal ball, was being filled with a new IPA that had an opaqueness like the fog obscuring the coastline.

We stared into the hazy landscape not seeing the new threat to the West Coast IPA because, the haze was the threat! 

We weathered the Black and Cascadian IPA storm. Short lived as it was destined to be. With a few surviving examples that broke free from the lack of vision most suffered from, the West Coast IPA remained victorious. 

For several years, some breweries on the other coast were brewing some beers that should be consumed but not seen. Like a grotesque deformed fruit, beers like Heady Topper demanded you shield your eyes before consuming less you be repulsed by the sheer sight of it's... haze.

The onslaught filling the void of the drinkable West Coast IPA continued. Beer drinkers had quickly tired of the palate abuse and near permanent damage to their taste buds. IBUs fell and fell and were replaced hazy IPAs. Not just hazy though. These beers seem as if they were just hazy. Most insidiously, the hoards coming though the haze brought with them juicy. 

Hazy IPAs sent the established craft beer drinkers in a tizzy. A TIZZY. How dare you not serve me a clear beer! But the first volley of hazy beers brought new, interesting hops and shared a new brewing term "bio-transformation" that was cast about without restraint. If we could look through or beyond the haze, there was something interesting being brought to us and laid at out feet.

Alas, we were so distracted by the haze, we accused hazy beer brewers of poor fermentation practices, called them lazy brewers and a myriad other insults slung at these new frontiersman.  What we didn't see coming was this super juice craze. 

Hazy has become synonymous with Juicy. Young craft beer drinkers are flocking to this sweeter, low bitterness juice box IPA in droves. These flavor so reminiscent of their ever so recent adolescent juice boxes and Sunny Delight sugary drinks driving them into diabetes at an accelerating pace. 

Hazy is now synonymous with "juicy". The heretics who brought Hazy IPA didn't notice they were being overrun by sweet, nearly barely bittered fruit bombs bursting with citrus like Mandarin Orange, Tangerine, Grapefruit or tropical fruits like Mango, Passion Fruit, Pineapple and Guava.

The West Coast IPA that once dominated the IPA landscape and redefined the home and craft beer world is quickly fading into the mist.

They are just spirits, ghosts, West Ghost IPA's.





Wednesday, October 2, 2019

MacOS Catalina On VMware ESXi 6.7

Creating a MacOS Catalina 
on VMware ESXi 6.7 U2



** UPDATE 10/17/2019**
After applying the first update, the VM was rendered un-bootable again. That is the same crash that is originally experienced.  SEE Boot Work Around at the bottom.

This exercise was to get a running MacOS Catalina VM instance running on VMware. I first wrote this for Catalina Beta but afte rthe official release, a couple things changed.  So now it is how to install Catalina on ESXi 6.7.

I am using a 2013 Mac Pro with VMWare 6.7 U2 installed. I have High Sierra and Mojave VMs running on the host. Running VMs on VMware is something I've done for a few years. 

A lot has changed in Catalina. Admittedly, I am not a MacOS expert. I'm not particularly good a Mac user either. So, I can't speak to the changes only that it is not currently (Oct 1, 2019) frienld to install on VMware ESXi. Catalina runs fine once you get a working VM though.

The MacOS Part

As of this writing (10/10/2019), Youo cannot upgrade and existing VM running High Sierra or Mojave. At least, I could not successfully upgrade and boot to Catalina.  

If at first You Don't Succeed...

I started with trying to upgrade a Mojave VM to Catalina. I just downloaded Catalina from the Apple Store (Search: macos catalina). 

I followed the prompts and downloaded the Catalina installation image. I ran though the installation process which seemed to go pretty well. That is until it booted from the upgraded image. Then, it crashed. You can't see the crash, you just has an frozen Apple logo.

To see what is happening, reboot the VM and hold down the Windows Key + v for Verbose mode and see the boot attempt and the kernel panic. Changing VMware setting had no affect. After a couple hours, I gave up.

Try Something Else... And It Worked!


My next tack was to boot from a Catalina ISO. First, I had to create one. I'd done this before on Mojave so it wasn't all unfamiliar.  The steps are below. I am not sure where they came from.

First, I had to boot back to Mojave. I had found by rebooting the VM to the Boot Manager settings (you can set this in the VM settings or press escape before the OS loads in a VM console) and Selecting the EFI VMware Virtual SATA Hard Drive (0,0) option (not Mac OS X), that boots to my original Mojave image.

To start from scratch on a Mojave instance, download Catalina from the app store as described above. Just don't run the installer. You need the image to create the ISO.

Once Mojave loaded, to build the ISO file, I start by making the virtual disk:

hdiutil create -o /tmp/catalina -size 8000m -layout SPUD -fs HFS+J

Then, I mount it to I can copy the installer to it

hdiutil attach /tmp/catalina.dmg -noverify -mountpoint /Volumes/install_build

Now I copy the installer to the mounted image

sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/install_build

The image is automatically mounted and is on your desktop. Select it and un-mount the image.

Now convert the image to an ISO file. You can put the fiel anywhere but I used ~/Downloads for simplicity

hdiutil convert /tmp/catalina.dmg -format UDTO -o ~/Downloads/catalina

Now rename the file from catalina.cdr to catalina.iso

mv ~/Downloads/catalina.cdr ~/Downloads/catalina.iso

You can delete /tmp/catalina.dmg. 

Copy the ISO to your PC or where ever you want to attach it to the VM via a console session.  I use WinSCP to copy to my PC.

The VMware Part

Updated 10/10/19

I created a blank VM with the following settings:

These are important. Just follow my lead here.
Guest OS: Other
Guest OS Version: Apple macOS 10.14 64-bit
2 vCPU
4GB Memory
100GB Disk space
The rest is default

VMware settings


Once the VM is saved, edit the settings and change to
Guest OS: Windows
Guest OS Version: Windows 10 64-bit
Changed to Windows 10


Next...
Open a Remote Console (VMRC)
Power on the VM
Click VMRC --> Removeable Devices --> CD/DVD --> Connect to Disk Image File
Navigate to the catalina.iso file you saved where ever, Click Open

Attach ISO

Now ALT+CTRL+Insert in the VM to reboot it. It will boot from the ISO automatically. If not select the SATA CDROM frm the EFI menu.  Note, sometimes it took several reboots for it to successfully boot from the ISO. usually, just one.




Once the installer image loads, use the disk tool to erase the VMware virtual disk (100GB in my case)

Use the default erase options (Note: Your keyboard doesn't work so just accept "Untitled")




Quit the disk utility

Next, choose to install MacOS


Follow the install steps and install Catalina


Once the install finishes, it will reboot to the OS.  Make sure you detach the ISO so you don't boot to the installer again.

Reset the VM

The VM should boot to the image and continue installing Catalina. When it finishes (10 or so minutes) it will reboot.



After the reboot, it will freeze on the blank Apple logo or unsuccessfully load MacOS X. Don't fret.. We're OK.



Power off the VM
Edit the VM setting and change the OS values.
Guest OS: Other (Apple Mac OS X)
Guest OS Version: Apple macOS 10.14 64-bit


Power on the VM and it will boot to and load Catalina.



Once you go through the setup steps and Catalina is ready to go.





Good luck on your adventure!


Boot Work Around

Added 10/17/2019

After applying the update, the VM was no longer booting. Same cast at boot with the Apple Logo and no progress.  

the work around is to change the boot order in EFI boot settings to boot to SATA Hard Drive 0.0

You need to enter EFI boot configuration for the VM. You can hit escape a the VMware logo or go to the VM settings and set to boor to EFI next boot. Boot/reboot to get the EFI menu


 Enter Setup

Configure Boot Options

Change Boot Order

Press Enter then change the boot order in the pop up window using + and - keys. Press Escape when done editing.
Move EFI Virtual SATA Hard Drive (0.0) to the Top
You can see I change the overall boot order to:
Hard Drive
CDROM
Mac OS X


Press Enter to Commit changes and exit
Exit boot manager and reset the VM.

Now the VM will always boot to the Hard Drive. 

I am avoiding applying updates.



















Monday, September 30, 2019

Terraform Google VPN VPC PFSense

I spent a few days learning Terraform to automate the creation of a VPN to extend my local networks and create a VPC hybrid connection to my lab network. In other words, I extended my lab network to Google Compute using a VPN. I used Terraform to build my GCP infrastructure.  I use PFSense on the public edge of my local lab network.

This is not a "how to use Terraform" or a "how to use Google Compute" or "how VPNs work" or "how to use Pfsense".

This article does provide an example using Terraform configuration, PFsense configuration and my insight to making it work.

Before I started, I manually created a VPN between PFsense and GCP. I know what pieces were needed to make it work. Building on that work, I took those pieces and created  Terraform configurations to do it for me as well as make it repeatable.

You need a few things to do this.

  1. PFsense with an direct Internet connection. You probably could do it with port forwarding on your firewall, but that is not how I did it.
  2.  PFsense as the static route to the subnet being created in GCP.
    1. I use a PFsense virtual machine which has a NIC interface on the internal network and one on the Internet network. I have a static route on my internal router to point to the GCP network via the internal IP address of the PFsense vRouter.
  3. Google Compute account
  4. Google Compute Project
  5. Owner or appropriate permissions to create resources. I do not use a service account but I could.
  6. Internet connection to Google
  7. Credit card for Google to bill you for resources (after you initial credit is used up) or a billing account with Google
  8. Terraform (I use windows)
  9. GCloud client. Not required but really helpful and part of setting the windows account and password
I created a local folder path of c:\terraform\vpn and work exclusively with the VPN in that folder. I assume you have Terraform installed an in the system path.

Before doing this, you may want to jump down to the PFsense setup and generate a preshared key to be used in the VPN Tunnel configuration. Youwil need one from somewhere. I've had problems using too long of a key so I just use PFsense to generate. Step 6.

Terraform configuration with comments

//vpn config
// I use variables for project, zone, region in a variables.tf file in the same folder.
//VPN Tunnel Config
// I suggest keeping the resource name and name = the same. Much easier to follow.
// I have also variableised these but not in the example
 resource "google_compute_vpn_tunnel" "vpn-1-tunnel-1" {
name = "vpn-1-tunnel-1"
// IP address of the PFSense gateway
peer_ip = "8.8.8.8"
// same exact string in PFsense
shared_secret = "sharedsupersecretstring"
description = "vpn"
ike_version = "2"
// vpn-gatewate-1 is created below somewhere. It is used a few times like this
target_vpn_gateway = "${google_compute_vpn_gateway.vpn-gateway-1.self_link}"
// I am allowing all traffic between the GCP VPC and my local network. you can restrict as you like.
// the CIDR in quotes inside the brackets can have multiple entries. All in quotes separated by a comma
// e.g. ["1.2.3.4/24", "10.10.0.0/16"]
local_traffic_selector= ["0.0.0.0/0"]
remote_traffic_selector= ["0.0.0.0/0"]
//These are created later and are the defaults for a VPN to establish an IPSec connection
depends_on = [
"google_compute_forwarding_rule.fr_esp",
"google_compute_forwarding_rule.fr_udp500",
"google_compute_forwarding_rule.fr_udp4500",
]
}
// Creating the VPN Gateway/ Later when we create rules, it gets assigned an IP address
// The IP is sticky in that I have created and destroyed and created the VPN again and get the same IP assigned.
resource "google_compute_vpn_gateway" "vpn-gateway-1" {
name = "vpn-gateway-1"
description = "vpn gateway"
network = "${google_compute_network.vpn-network.self_link}"
}
// Creating the VPC Network
resource "google_compute_network" "vpn-network" {
name = "vpn-network"
auto_create_subnetworks = false
}
// Creating the VPC network. This is a class C of my lab Class B network.
// It is used by the compute instances virtual machines
resource "google_compute_subnetwork" "vpn-subnet" {
  name          = "vpn-subnet"
  ip_cidr_range = "172.16.99.0/24"
  region        = var.region
  private_ip_google_access = true
  network       = "${google_compute_network.vpn-network.self_link}"
}
//Retrieving the IP used by the VPN gateway for forwarding rules
resource "google_compute_address" "vpn-ip" {
name = "vpn-ip"
}
// Setting the route for my internal lab network
resource "google_compute_route" "vpn-1-tunnel-1-route-1" {
name = "vpn-1-tunnel-1-route-1"
network = "${google_compute_network.vpn-network.self_link}"
// next_hop_vpn_tunnel = "vpn-1-tunnel-1"
next_hop_vpn_tunnel = "${google_compute_vpn_tunnel.vpn-1-tunnel-1.self_link}"
dest_range = "172.16.0.0/16"
}
// Default forwarding tule to allow IPsec
resource "google_compute_forwarding_rule" "fr_esp" {
  name        = "fr-esp"
  ip_protocol = "ESP"
  ip_address  = "${google_compute_address.vpn-ip.address}"
  target      = "${google_compute_vpn_gateway.vpn-gateway-1.self_link}"
}
// Default forwarding tule to allow IPsec
resource "google_compute_forwarding_rule" "fr_udp500" {
  name        = "fr-udp500"
  ip_protocol = "UDP"
  port_range  = "500"
  ip_address  = "${google_compute_address.vpn-ip.address}"
  target      = "${google_compute_vpn_gateway.vpn-gateway-1.self_link}"
}
// Default forwarding tule to allow IPsec
resource "google_compute_forwarding_rule" "fr_udp4500" {
  name        = "fr-udp4500"
  ip_protocol = "UDP"
  port_range  = "4500"
  ip_address  = "${google_compute_address.vpn-ip.address}"
  target      = "${google_compute_vpn_gateway.vpn-gateway-1.self_link}"
}
// Firewall rule to allow all traffic outbound from the vpn subnet
resource "google_compute_firewall" "vpn-allow-all-egress" {
  name    = "vpn-allow-all-egress"
// This is required though you can have multiple protocols and ports. for me, it is allow all
  allow {
protocol = "all"
  }
  network = "${google_compute_network.vpn-network.name}"
  // the CIDR in quites inside the brackets can have multiple entries. All in quites separate by a comma
  // e.g. ["1.2.3.4/24", "10.10.0.0/16"]
  destination_ranges = ["172.16.0.0/16"]
    direction = "EGRESS"
}
// Firewall rule to allow all traffic inbound into the vpn subnet
resource "google_compute_firewall" "vpn-allow-all-ingress" {
  name    = "vpn-allow-all-ingress"
  network = "${google_compute_network.vpn-network.name}"
// This is required though you can have multiple protocols and ports. for me, it is allow all
  allow {
protocol = "all"
  }
  // the CIDR in quites inside the brackets can have multiple entries. All in quites separate by a comma
  // e.g. ["1.2.3.4/24", "10.10.0.0/16"]
  source_ranges = ["172.16.0.0/16"]
  direction = "INGRESS"
}



Here are my variables



variable "credential_file" {
  type    = "string"
  default = "credfiledownloadedfromgoogle.json"
}
variable "project_id" {
  type    = "string"
  default = "mygoogleproject"
}
variable "region" {
  type    = "string"
  default = "us-central1"
}
variable "zone" {
  type    = "string"
  default = "us-central1-a"
}
provider "google" {
 credentials = "${file(var.credential_file)}"
 project     = "${var.project_id}"
 region      = "${var.region}"
}
variable "instance_name" {
  type    = "string"
  default = "windows2016vm"



Now for my Compute Instance Terraform configuration


resource "google_compute_instance" "default" {
 count = 1
 name         = "${var.instance_name}-${count.index}"
 machine_type = var.machine_type
 zone         = var.zone
 boot_disk {
   initialize_params {
     image = var.image
   }
 }
// VPN Network created earlier
 network_interface {
   network = "vpn-network"
   subnetwork = "vpn-subnet"
 }
}

I save these to main.tf and variables .tf respectively.  The Instance is a separate folder with it's own main.tf and variables.tf.

In the vlan folder, run terraform plan
If it looks OK, run terraform plan -out vpn.plan
Next, terraform apply vpn.plan

PFSense


On PFsense, I create the following configuration. 

This assumes you have PFsense already setup and working and are just adding an IPSec tunnel.
Local lab network 172.16.0.0/16
Extending subnet 172.16.99.0/24 into GCP as a Hybrid Cloud.
  1. Get the IP address of the VPN Gateway. I use gcloud compute addresses list which returns a list of IP addresses then look for the vpn-tunnel and the gateway IP. I will use 30.30.30.30 for my gateway IP.
  2. Navigate to the PFsense VPN then IPsec page
  3. Click + Add P1
    1. Key Exchange Version: IKE V2
    2. Internet Protocol: IPV4
    3. Interface: Internet Interface
    4. Remote Gateway: IP of Google VPN Gateway e.g. 30.30.30.30
    5. Description: give it a nice description
    6. Pre-Shared Key: paste the same preshared key used in your Terraform configuration for the VPN Tunnel. e.g. "sharedsupersecretstring" OR generate one and use it in the Terraform configuration
    7. My Identifier: My IP Address
    8. Peer Identifier: Peer IP Address
    9. Encryption Algorithm: AES128-GCM - 128 Bits - 14 (2048 bit)
    10. Lifetime 36000
    11. Enable DPD
    12. Delay 10
    13. Max failures 5
    14. Save
  4. Click Show Phase 2 Entries 
  5. Click + Add P2 (This is to allow the Tunnel Network)
    1. Mode: Tunnel IPv4
    2. Local Network: Type: Network - Network : 169.254.0.2/30
    3. Nat: None
    4. Remote Network: Type: Network - Network: 169.254.0.1/30
    5. Protocol: ESP
    6. Encryption Algorithms: AES125-GCM - 128 Bits 
    7. Hash Algorithms: SHA256
    8. PFS Key Group: 14 (2048 bits)
    9. Lifetime 10800
    10. Save
  6. Click + Add P2 (This is the subnet rule in GCP which is extended from your lab)
    1. Mode: Tunnel IPv4
    2. Local Network: Select Local Network Interface
    3. Nat: None
    4. Remote Network: Type: Network - Address: VPN Subnet from Terraform e.g. 172.16.99.0/24
    5. Protocol: ESP
    6. Encryption Algorithms: AES125-GCM - 128 Bits
    7. Hash Algorithms: SHA256
    8. PFS Key Group: 14 (2048 bits)
    9. Lifetime 10800
    10. Save
  7. Click + Add P2  (This is the local lab network rule )
    1. Mode: Tunnel IPv4
    2. Local Network: Type: Network - Address: lab subnet. e.g 172.16.0.0/16
    3. Nat: None
    4. Remote Network: Type :Network - Address: VPN Subnet from Terraform e.g. 172.16.99.0/24
    5. Protocol: ESP
    6. Encryption Algorithms: AES125-GCM - 128 Bits
    7. Hash Algorithms: SHA256
    8. PFS Key Group: 14 (2048 bits)
    9. Lifetime 10800
    10. Save
  8. Repeat for any other local networks you want to adverstise to the google subnet.
Create a Virtual IP
  1. Click Firewall the Virtual IPs
  2. Click + Add
    1. Interface: Internet Interface
    2. Address(es): 169.254.0.2 / 30
    3. Description: give is a nice description like GCP VPN TUN IP
Allow IPSec traffic through the firewall. Note, I pass all traffic
  1. Click Firewall then Rules
  2. Click IPSec
  3. Click Add
    1. Action: Pass
    2. Address Family: IPV4
    3. Protocol: Any
    4. Click Save
That's all. The IPSec tunnel should come up now.

Setting the GCP Windows Instance User and Password Credentials

I use the following command gcloud compute reset-windows-password --user userx windows2016vm-0
You will be rewarded with the account being created, userx in this case, and the randomly created password. 

You can get the IP Address of the instance using this command gcloud compute instances describe windows2016vm-0

If you are on a network you allowed across the VPN, you should be able to RDP to the windows machine name. 


Thursday, August 15, 2019

How Adding Bourbon Raises The ABV In Beer



Effects On ABV With Alcohol Additions

Joe “Jomebrew” Aiello

Synopsis

This is a followup to my previous article where I provided information on how to spike flavored sparkling water to make hard seltzer.

This article explains the effects on a beers ABV when you add alcohol directly to the beer. We’ll show how to calculate the change in ABV of a beer when you add something with alcohol in it such as wine or distilled spirits such as Bourbon.

For example, what is the new ABV when I add 2 ounces of Bourbon to my 7% ABV beer?

I will also explain how to calculate how much alcohol, such as wine or distilled spirit, is needed to raise the ABV of your beer to a specific ABV. For example, how much alcohol is needed to raise a beer from 7% ABV to 8% ABV.

Of course, this is not limited to beer. You can calculate the amount of alcohol in a mixed drink too. I’ll explain that later.


Find the ABV Calculator Here- Look For ABV Adjustments

Why?

To have a relatively precise understanding of how much ABV is raised when I add alcohol to a beer. When I add alcohol such wine or a spirit like bourbon to a beer to achieve a taste profile I it raised the overall OBV of the beer. For those like me, knowing the effect on the ABV is interesting and a little compulsive.

In addition to knowing the effects on ABV when adding alcohol, I’ve been interested in knowing how much alcohol is needed to raise the ABV of a beer (or other beverages) to a specific percent of alcohol.

Does This Only Work For Beer?

These formulas can be used to calculate the change or how much is needed to raise the ABV in any beverage.

Where my previous article talked about spiking a sparkling water with no existing alcohol, this article shows you how to calculate raise the ABV of a beverage that has zero or some alcohol already.  It can also be used to spike your sparkling water.


The Problem

How much is the ABV of a beverage raised when adding a distilled spirit. We’ll call this New ABV.

How much alcohol is needed to raise the ABV to a specific ABV. We’ll call this Raise ABV.

We need to start with a few bits of information. These first values are common for either formula.

First, you need to start with the volume of the beverage. For this example, I have 120 ounces of of a Baltic Porter.

Next, you need the percentage of alcohol in the baltic porter. In the example, I am using 7%. We will use .07 for the calculations to keep it simple (7/100)

Now, you need to know the percentage of alcohol (ABV) of the distilled spirit. Here, I am using 80 proof vodka which is 40% alcohol. For the calculations, we will use .4 (40/100)

For New ABV, we need to know how much alcoholic liquid are we adding. We’ll use 2 ounces in this example.

For Raise ABV, we need to know what the target ABV is. We’ll use 8% ABV.

Finally! We have all the values needed to do our calculations.

Breaking Down The Calculation for New ABV

The Formula we worked out is ((A*C)+(Q*V)) / (A+V)*100 or



Where:
A = Starting Volume
C= Current ABV of the Beverage
Q = ABV of the Alcohol Being Added
V = Volume of Alcohol Added to the Beverage

As mentioned earlier, we’ll use the decimal value of the percentages:
A = 128
C = .07
Q = .4
V = 2

So, plugging the numbers into the formula, we get ((128*.07)+(.4*2)) / (128+2)*100 or



This means that when I add 2 ounces of Bourbon at 80 proof to 1 gallon of beer, It will raise the ABV by .5% (half a percent) increasing my Baltic Porter from 7% ABV to 7.5%ABV.


Breaking Down The Calculation for Raise ABV

The Formula we worked out is (R-C) / (Q+R)*A or


Where:
A = Starting Volume
C= Current ABV of the Beverage
R = Target ABV of the Beverage
Q = ABV of the Alcohol Being Added

As mentioned earlier, we’ll use the decimal value of the percentages:
A = 128
C = .07
R = .08
Q = .4

So, plugging the numbers into the formula, we get (.08-.07) / (.4+.08)*128 or


This means to increase my 7% ABV Porter to 8% ABV, I need to add 4 ounces of 80 proof Bourbon. Sure, we knew this already since 2 ounces added .5% we can simply double that. But now we can calculate it too.

Please note: The formula for Raise ABV breaks when the ABV of the Alcohol Being Added equals the Target ABV of the Beverage. So, Don’t try to add 40% ABV liquor to achieve a 40% ABV.

How does this relate to calories?

Distilled spirits at 80 proof / 40% ABV run 64 calories per ounce. Since we are adding 2 ounces of 40% ABV distilled spirit, we simply multiply 2 X 64 which equals 128 calories are being added to a gallon of beer. So, you are adding 1 calorie per ounce or 12 calories per 12 ounces of beer plus the calories already in the beer.

How can I calculate the ABV Other Drinks?

How about a shaken Margarita? This can be tricky and you may need to run through the calculations a couple times if you are using multiple liquors with different ABV.

Take, for example a shaken Margarita. A common recipe is 2 ounces Tequila (80 proof), 1 ounce TripleSec (Dekuyper - 48 proof) and 1 ounce lime and about 1 ounce dilution from ice.

We have 5 ounces of volume.
2 ounces at 40% ABV
1 ounce at 24% ABV
1 ounce Lime at 0 ABV
1 ounces at 0 ABV

So, Add Tequila to the Ice and Lime and you have 4 ounces at 20% ABV. Now add 1 ounce Triple Sec and you have 5 ounces at 21% ABV.

That’s it. A Margarita using this recipe has about 21% ABV per 5 ounces which contains 1.05 ounces of alcohol. Compare to a 16 ounce beer at 6.5% ABV contains about the same alcohol.

Say you drop a 1 ounce shot of Jameson in your Guinness. What is the resulting ABV?

You have a 12 Ounce Guinness at 5% ABV. You add 1 ounce Jameson at 40% ABV. Plug in those values to the New ABV formula and you get a 13 ounce beer with 7.7 % ABV.

So, I dumped a 25 ounce bottle of Cabernet into my 5 gallon batch of 7% ABV Brown Ale. What is the new ABV? Plug the values into the New ABV formula and you get 7.2% ABV

How about dilution? I added 12 ounces of flavored sparkling water with 0% ABV into 2 ounces of 40% ABV Vodka. What is my ABV? Plug the values into the New ABV formula and you get 5.7% ABV.

Making Hard Seltzer Using Flavored Sparkling Water

Spiking Flavored Sparkling Water


Joe “Jomebrew” Aiello


Synopsis
Calculating the amount of distilled spirit to raise the ABV of a beverage to a specific percentage of alcohol by volume (ABV). All values are in ounces.


Why?
I started this seemingly simple task of calculating the amount of alcohol to add to flavored sparkling water to achieve 5% ABV.

There are several commercially available hard seltzers that come in several fruity flavors but I wanted to see if I can spike flavored sparkling water to achieve the same flavor profile.

I did not want to taste alcohol and wanted to the amount of alcohol to be specific. I’d also like to know the number of calories in my spiked beverage.

I did ferment sugar and make a hard seltzer the hard way but really, the sparkling waters are inexpensive and readily available. Why not just spike it?


Find the ABV Calculator Here- Look For ABV Adjustments

How Does This Relate To Beer
The problem transcends just hard seltzer too. I’ve long pondered how much alcohol is needed to raise the ABV of a beer. I also ponder how much the ABV changes when I add bourbon to my beer however, this formula isn’t for that.With some tweaks, the formula could be used though.

The Problem
How much distilled spirit is needed to raise the ABV of a beverage to a specific ABV? You need to start with a few bits of information.

First, you need to start with the volume of the beverage. For this example, I have 12 ounces of sparkling passion fruit flavored water.

Next, you need the percentage of alcohol you want the final beverage to be. In the example, I am using 5%. We will use .05 for the calculations to keep it simple (5/100)

Now, you need to know the percentage of alcohol (ABV) of the distilled spirit. Here, I am using 80 proof vodka which is 40% alcohol. For the calculations, we will use .4 (40/100)

Finally! We have all the values needed to do our calculations.

Breaking Down The Calculation
The Formula we worked out is A*R/Q-R or


Where:

A = Starting Volume
R = Target ABV of the Beverage
Q = ABV of the Distilled Spirit

As mentioned earlier, we’ll use the decimal value of the percentages:
A = 12
R = .05
Q = .4

So, plugging the numbers into the formula, we get (12*.05)/(.4-.05) or

This simplifies to .6 / .35 which equals 1.71.

So, we need to add 1.71 ounces of 80 proof vodka to the 12 ounces of sparkling water to achieve a 5% ABV beverage. Our new total ounces is 12 + 1.71 which is 13.71 ounces.

There is it! My 13.71 ounce Passion Fruit Hard Seltzer at 5% ABV.

Wondering how many calories are in the beverage? Pure alcohol has 246 calories per ounce.

Distilled spirits at 80 proof / 40% ABV run 64 calories per ounce. Since we are adding 1.71 ounces of 40% ABV distilled spirit, we simply multiply 1.71 X 64 which equals 110 calories per 13.71 ounce Hard Seltzer.


How About Beer?
Looking at raising the ABV or a beer by 1% to take my Vanilla Porter to an Imperial Bourbon Vanilla Porter, I’ll need to know how much beer I am starting with.

I’ll start with 5 gallons of beer.
I’ll want to user 90 proof Bourbon.
I want to raise the ABV by 2%

The quick formula is (640*.02)/(.45-.02) since I have 45% ABV Bourbon and 5 gallons is 640 ounces.

Raising by 2% ABV. I will need 13.4 ounces of Bourbon or about ¾ of a pint! That is almost half a 750ML bottle. I think that will be a bit too much Bourbon.

Thursday, May 9, 2019

VMWare PowerCli Get All VMs In A Cluster On A Specific Datastore

I'm a novice using VMWare PowerCli so I use a lot of Google searches to figure out the complex and challenging PowerCli commands. 

What I was trying to do was migrate / move all VMs in a cluster from one datastore to a different datastore.  I had 200+ VMs spread across 16 servers to move. Doing this via the console has its own challenges mostly the web clients both are cumbersome to use.

My biggest challenge was getting a list of VMs by cluster AND datastore. I thought this would be easy. Just use "get-vm -location XXX -datastore YYY".  But no, that returns VMs in the cluster or on the datastore. That list of 500 VMs.

I was never able to figure out how to get the list I wanted so I just brute force tried to move every one of the 500 VMs. If they were already on the target datastore, then it just finished and moved onto the next VM.  If the VM was NOT on the source datastore, then it failed and moved on to the next VM.  Those on the source datastore were moved.  Not very deterministic but it worked.

I continued to investigate how to do this trying to figure out the the API doc which is really a pain to use as well. Luckily Google has all the answers.

With the help of a blog post from 2102 by psvmware I was able to get the list of VMs I sought. I am pretty sure this can be used for different objects but I didn't mess around with that yet.

The command looks like this
Get-Cluster "MyCluster"|Get-vm |?{($_.extensiondata.config.datastoreurl|%{$_.name}) -contains "SourceDatastore"}| select -expandproperty name 
This returns only the VM name which can be used to move the VM

Here is my simple script that get s a list of VMs in a  cluster on a specific datastore then sorts the VMs by name ascending order and moves them to a different datastore. I actually used 2 scripts. One that sorts ascending and one that sorts descending so I can run them both and move 2 VMs at a time eventually running into each other. (when they both tried to move the same VM, one just waited for the other to finish).



$vchost="my.vcenter.server"
$vcuser="myUser"
$vcpassword="myPassword"
$srcdatastore="mySrcDatastoreName"
$vccluster="myClusterName"
$dstdatastore="myDestinationDatastoreName"
Connect-VIServer -server $vchost -user "$vcuser" -password $vcpassword
$vm = Get-Cluster "$vccluster"|Get-vm |?{($_.extensiondata.config.datastoreurl|%{$_.name}) -contains "$srcdatastore"}| select -expandproperty name |sort-object -ascending
foreach ($i in $vm) {
move-vm $i -datastore $dstdatastore -DiskStorageFormat thin
}

Friday, March 15, 2019

Craft Beer and My Life - Hoppy Brewing

Several years ago, I think it was 1994, at the Northern California Small Brewers Festival in Mountain View, California I was a volunteer beer pourer as I had been in other festivals. This festival was known to be one of the more rigid ones in the bay area (where the Pleasanton was pretty loose and a lot of fun).

I was pouring for the brewery E.J. Phair.  The owner and brewer was JJ Phair. We got along quite well as I had been visiting dozens of micro breweries for a couple years and had quite a bit of experience with  (what would be later called) craft beers.  Especially hoppy beers. back then, hoppy beers were unusual and blacked hop flavor and aromas with bitterness was not yet mature in the micro brew scene.  JJ and I had quite a bit of fun tasting the various beers being poured at the festival.

While pouring for JJ, I kept my water glass in the bucket of ice with the kegs. I've never been a fan of drinking water from plastic as I always felt it was wasteful, unnecessary and left a plastic taste. So, I drink from glass (and stainless these days). Well, someone from the festival came by and reminded us I can't drink beer while pouring. Of course we said we weren't and I was only drinking water which I showed them.

A bit later, JJ excitedly came back to his taps and told me I had to go try Hoppy Face Amber from a new brewery Hoppy Brewing. So, I went over, used a token and got a sample. I don't remember the beer but I do remember a wow factor and that it the hop aroma and flavor were huge.

Moments after I returned to JJ's taps, 8 or 10 festival "security" descended on us and demanded I stop pouring and handover my volunteer shirt. It was quite comical to me. I once again demonstrated I was drinking water but they went on about drinking beer while pouring and then pointed out I had just went over to Hoppy Brewing (I removed my shirt first) while I wa "on duty".  Rightfully so, JJ went ballistic. The folks argued heavily with them.

JJ explained he sent me over to try the beer but they were unrelenting. JJ decided he would leave the festival and take his beer with him. They tried to stop him saying he had donated the beer. I recall him saying maybe so but not his kegs. I'd like to remember that he then poured all his beer out but I don't think that happened.

I let JJ know I would be fine getting booted but he wouldn't let them treat me like that.  I was escorted out by 7 or 8 staff as if I was some big threat. the people and circumstance is just as laughable now as it was back then. I don't know what happened after that.

I continued to support E.J.Phair everytime I see it. I did get to see JJ again several years later and he kind of remembered or at least he was considerate enough to remember. We sampled his Helles right off the bright tank and it was fantastic!

I do remember that Hoppy Face Amber. They still make it today. Funny enough, I haven't had it since. I think it is time!


Friday, March 8, 2019

Craft Beer and My Life - 20 Tank

20 Tank Brewery Nearly Changed My Life



I was first introduced to craft beer around 1988 by a new found friend, Brian. Until then my exposure to beer was typical American homogenized light lager with the occasional import such as Heineken. I usually just followed my brothers lead. At first, we were Michelob fans. To us, this was kind of a premium beer. I was not much of a beer fan. My father didn’t drink much and I don’t recall anyone in my family drinking much beer. My older brother, who is a couple years older than me, was pretty much my guide. There was not much to choose from so his leadership role was pretty easy.

Sometime in 1983 Stroh’s beer came to our area. For some reason, this became our favorite beer. Probably because it was simply new. I remember thinking it was so plain. It was not any different than the other american beers but certainly not stale like the german beers. Not long thereafter was my 21st birthday. The love of my life at the time was Lori. Her family had moved about two hours north a year or so earlier. I was not entirely sure what was happening with our relationship. The distance was a strain but breaking up was a foreboding. She arrived to help celebrate my birthday bearing my favorite cake. Upon cutting into the cake, I realized it was not cake but a 12 pack of Stroh’s. It made me realize talked about Stroh's a lot, I guess though I don’t remember. I also realized it was time follow a different path than Lori. I don’t know if or how we ever broke up. I am pretty sure we did. I don’t recall ever seeing her again. I don’t know if I ever drank the 12 pack either.

Not much happened in my beer scene until i started a job in San Francisco three or 4 years later. Some time around 1988 I worked with Brian. Through sketchy memories, I recall conversations with Brian about the new craft beer revolution. Brian was also the first to talk about homebrew. Though I don’t recall much of conversation 25 years ago, I do remember Brian talking about exploding bottle in cupboard. I don’t think I ever tried any of his beer nor enjoyed the experience of exploding bottles. I do think fondly of him when I reminisce about the my first craft beer experiences.

My most vivid memory is our first visit to a new brewery in San Francisco; 20 Tank. There were three of us. Myself, Brian and John. I don’t recall how familiar John was with craft beer but I don’t think he was much of a drinker. I clearly remember a Red/Amber ale that was a bit coarse and kind of sweet. I also remember a powerfully bitter assault on my palate from an IPA called War Boner or something like that. This particular night, we sat upstairs and did an all out blitz on these delightful beers. The laughter was pain inspiring and I still snicker at the thought of chili but I don't know why. There is a permanent hilarious imprint burned into my psyche. I can’t help but smile now.

The three of us staggered out to the street and fell into a taxicab. I looked out the window and can still see the bright lights from inside the brewpub illuminating the building with 20 TANK BREWERY in big bold letters. I was dropped of at the train station and somehow made it onto a train and ended up home though there is no recollection of how or when.

I visited 20 Tank a few more times. I met the brewer and talked beer. He went on to start 21st Amendment Brewing some time later. I mostly recall the last time I was there. I was with a spectacular woman; Judy. We met at work. She shared an office with another strikingly beautiful woman. I don’t recall her name but I will call her Kim. I became friends with Kim often chatting on our train ride to or from work. Kim was just honest and sweet and engaging. At times, it was comical as to how many guys would ask me how I know Kim. There was real shock that a woman this beautiful would be friends with me I guess. There was a bit of fun sport in all of it and I did enjoy being in such company. I would, at times, visit Kim’s office for no particular reason just to say hi. It was there I met Judy. She was tall and slender and though different equally as striking as Kim. Two great reasons to find a reason to visit them. It doesn’t seem real but somehow I asked Judy to go out or maybe she asked me. I do know she agreed to and even picked me up though I don’t know why. We had a great time at 20 Tank and at the end of the night we walked to her car hand in hand.

I was in inner turmoil. I was on the cusp of maybe starting to date another woman. This other woman had a grip on my heart. I really enjoyed this evening with Judy but could not stop thinking of the other woman either. As Judy and I sat in her small car, just inches from one another, I explained this terrible predicament. Any other time, I would have not hesitated to take things as far as they would go with Judy. Instead, I talked about this other woman and how things were starting to blossom and I had to follow that path. It was awkward for sure. I did tell her I didn’t expect we would get on so well and I was not really prepared to have such a great date. She dropped me at the train. I spent the next hour and a half wonder if I was a fool. I married that other woman a few years later and we are still happly married today. I sometimes wonder what became of Judy. I do know 20 Tank closed in 2000.

That visit to 20 Tank almost changed my life.

Monday, February 25, 2019

Migrating to VMware 6.7 vCenter - xVmotion

I've had two 6.0 Windows vCenter instances with external MSSQL databases for quite some time. I've been reluctant to move to 6.5 due to the end of life of the desktop client. The workflow of the desktop client as well as sleek interface is unmatched and, apparently, un doable in the web browser interface. Further, we have had many issues with browsers and seems to have to switch every so often because one just stops working.

As time progresses, so we must adapt to changes even though they are backwards in ease of use and likability. The interface to 6.7 brings no improvements over the desktop client and only stunked workflows and heaps of frustrations.

I opted to deploy a new 6.7 vCenter appliance with embedded PSC and planned to migrate between vCenters.

  • Partly because I am moving to a different Microsoft AD. 
  • Partly rather than assign AD users access to VM folders, I created security groups in AD and assigned groups to vcenter resources. users are placed in AD security groups that correspond to vcenter resources. 
  • Lastly, I planned to implement Distributed Virtual Switches and Distributed Virtual Port Groups which are supposed to make it a lot easier to deploy new hosts.  


First, distributed switches and port groups is a huge pain in the ass. I am shocked how complicated it is to deploy and how neither web interface (Flex or HTML 5) visualizes the configuration well. I wonder if the UI designers went on vacation and engineers put together the interface. Unscrewing my hosts of distributed switches caused so much grief, it was easier to reinstall ESXi and start again.

Then, I was burned buy licensing. I made a big mistake. I used the trial license when configuring distributed switches. When I went to license my host just before it expired, I was shocked to be rejected as has Standard licenses and not Enterprise. So, I slowly unwound the configuration and though I am not sure what I did and can't do it again, I was able to detach the host from the distributed switch and port groups, crease new standard switches and port groups and eventually delete all traces of the distributed switches and port groups. NOTE: If you do this, you will need console access to the host to reassign the management network to the NIC. Maybe it is easier if you have two NICs in the vswitch but I have just one.

Before unwinding the distributed switch, I tested XVMotion fling to migrate VMs from Old vcenter to New vCenter. Again, I ran into issues.

  • First, there was a MTU issue that took way too long to figure out but was a big problem on 6.7 but not 6.0. 
  • Next was duplicate folder names in a cluster. If you have, say, four folders A,B,C and D and under B you have a folder name A, xVmotion pukes. Well, you don't see any target folders and you have no idea why.
I successfully moved one cluster and about 100 VMs. I'd like to have been able to filter source VMs by folder rather than just a search which would have made moving a whole folder a lot easier.

When I tried to migrate on my next cluster, I ran into more problems. 
  • A general system error occurred: Host not found
    • I think this have been because DRS on the new vCenter cluster was not enabled
  • License not available to perform the operation
    • After enabling DRS started getting this error. I made sure the new host had a license. Problem persisted. Turns out the source host had a Standard license who doesn't support vMotion. How stupid is that? Once I applied an Enterprise license to the source host, I was able to migrate VMs.
Recap:
  • Be careful using the evaluation key. It can bite you later
  • You need Enterprise licenses to migrate VMs across vCenters
  • Triple check all MTU setting on hosts and switches
  • Make sure you don't have duplicate folder names
  • Keep an eye on both source and destination vCenter event logs to identify where an issue may be arising from. I tended to think it was destination
  • Make sure you have DRS on both source and destination 
  • Make sure host NICs enable vMotion

Friday, December 14, 2018

Windows 7 to 10 upgrade Failure 0x800f0955 - 0x20003

Tech.. another techie article.  Maybe I'll go back to weird, personal, hiking, adventuring or beer brewing (and drinking) again one day.  For now, another pain in my ass with computers.  I do work with technology all day long.  Lots of different tech with servers and data centers, so I have a lot to bitch about.

This time, I've been trying to (free) upgrade windows 7 to windows 10. It seems to fail a lot.  Like fail, fail.

In a nutshell, running MediaCreationTool1809.exe (versions wil vary over time) from https://www.microsoft.com/en-us/software-download/windows10 allows you to create windows 10 media; ISO file which can be burned to a DVD-ROM or USB drive.  You can also just upgraded right from the tool which will cache the install files on your hard drive (you need 8GB free but really 12 or so).

So, I take the easy route.  Run the media creation to and select to upgrade.  The process is pretty simple.  It download files, stages an upgrade, reboots, starts the upgrade, does some updates, fails, rolls back (very cleanly/safely every time).  The code I get is 0x800f0955 - 0x20003 and some Safe_OS and Updates message.  I use google university to find what the error means, do everything everyone suggests and it fails.

Having done this several times now and spent hours troubleshooting, I've come up empty.  If only the upgrade would log exactly what it is doing when it fails, maybe we would fix it.  But it doesn't and I can't get around that problem.  However, I've still been able to upgrade several systems.  All you do is...

First, do some cleanup of your Windows PC.  Necessary?  Probably not. Works every time I do?  Yup.

Ok, first, you will need to install from a USB drive.  Sorry. You need a 8GB drive.  These are cheap and easy to use.  So, get one, insert it into a USB slot and run the media creation tool to create the installer USB drive.  When you are all done, you can delete everything form the USB and have some portable storage. Note: Booting from USB can be slowwww on older systems or not using USB 3.0 flash drive. Like a couple hours slow. It was only a few minutes with USB 3.0 drive and interface.

You can click cleanup if you want and scroll down to see the EASY part. You should cleanup first though.

Cleanup.   Open Windows Explorer.  Navigate to C:\Users.  Double click the account name you log in as. e.g. c:\users\jomebrew\
Click in the address bar and add \appdata.  Looks like this c:\users\jomebrew\appdata.  press Enter

Open Local, then open Temp.  Now your address bar shows C:\Users\jomebrew\AppData\Local\Temp with your account name of course.

Select everything in this folder  Click inthe right panel and click Edit / Select All.
  Press the Delete key and click Yes.
  Skip any files that can't be deleted.

In the address bar, click Local

Open Microsoft, then open Windows then open WER.  Delete everything in ReportArchive and ReportQueue.  If they are empty, move on.

Open ReportArchive then select all and press delete key and yes

Click the left (back) arrow or WER from the address bar then open ReportQueue.  Select all and press the delete and then yes

On the address bar, click Local Disk (C:)

Click click in the address bar and add program data.  it will look like this C:\ProgramData
Again,
Open Microsoft, then open Windows then open WER.  Delete everything in ReportArchive and ReportQueue.  If they are empty, move on.
Open ReportArchive then select all and press delete key and yes

Click the left (back) arrow or WER from the address bar then open ReportQueue.  Select all and press the delete and then yes

On the address bar, click Local Disk (C:)

Open Windows then open Temp

Select All then press the Delete key and click Yes.
Skip any files that can't be deleted.

On the Address bar, click Computer
Locate Local Disk C:.  Right click on this and select Properties (or highlight it and select File / Properties) Same thing.

Click Disk Cleanup.  Let it scan and when done, select all the boxes

Click Delete then Delete files.  This can take a while but will finish.

Make sure recycle bin is empty.

The EASY Part
Now that things are clean, navigate to the USB drive. Double click Setup.exe.
This seems to be the important piece,  On the first screen it asks Get Updates and Optional Features.  Select Not Right Now.  Then click Next.

Now click the appropriate options to finish the install. That's it!

Once Windows 10 installs, I select No to all the sharing options presented during the configuration steps.  Be sure to apply latest updates once windows 10 is done installing.

Note:  the installer spends a lot of time at 66% and 67%.  Be patient.





Wednesday, August 22, 2018

Fixing Windows 10 Missing systemprofile Desktop folder

I ran into an issue that seems to come from Windows 10 Updates.  Moments after logging in, I get a warning windows advising C:\WINDOWS\system32\config\systemprofile\Desktop is unavailable.  There is no desktop, just a task bar and recycle bin.  

The problems stems from the relocation of the default desktop from c:\users\default to C:\WINDOWS\system32\config\systemprofile\ but the Desktop folder doesn't get migrated.  Thus, the error message.

I could not launch any program except task manager, so I worked out a convoluted procedure to launch a windows explorer instance and was able to show the now hidden Default user folder in c:\users, copy the contents and paste it in the new default user folder C:\WINDOWS\system32\config\systemprofile\default. 

After following the procedure and rebooting.  I was able to log in and was back to my normal desktop.

Here is the procedure I followed.  It might be a bit overkill (copying all files in the default users folder but I only wanted to do it once.  Sorry, no images this time.

On the task bar (if you see one) or press ALT+CTRL+DEL and select task manager.
In Task Manger, click File / Run New Task
Click Browse
Locate Desktop in the left panel
Right Click and select Properties
Click Location
Click Find Target  (wait a little bit for an explorer window to open)
On the top Menu click View
On the far right, click Options
Folder Options will open.  Click View
Click the radio button Show hidden files, folders, and drives
Uncheck Hide empty drives
Uncheck Hide extensions for known folders and icons
Click OK
Click Users in the address bar (This PC > Local Disk (C) > Users )


You should not see the Default user folder along with any other user folder as della s a Default.migrated
Double click on the Default folder to open the folder
On the menu ribbon (the menu below the top ment with File/Home?Share/View), far right, click Select All (or click white space in the details panel asn press CTRL+A).  All files should be selected/highlighted
Right Click on any highlighted are and select Copy (or click Copy from the menu ribbon)

Navigate to C:\Windows\System32\Config   - You may get a security box to allow you to access the folder.  Click Continue
Click systemprofile   - You may get a security box to allow you to access the folder.  Click Continue
In the details white space, right click and select Paste (or click Paste from the menu ribbon)

Reboot - Press ALT+CTRL+DEl then click the power icon in the lower right and select Restart



Tuesday, August 7, 2018

Accessing VMFS Datastores from CentOS Live Linux

I've often run into issues with disk and other errors preventing me from getting VMs or other files off a VMFS volume.  I have used this process a couple times to retrieve VMs and other files when options for using VMware tools just are not enough.

This article assume the user has a decent bit of knowledge where to get things and how to work with their own servers.  For example, I don't describe how to boot your server from an ISO image.  I use remote tools to my server but you can burn a DVD, write an image and boot from USB, use an external drive, etc.

You will need a couple things to start with.  First, Download CentOS 7. I use the DVD ISO.

Next, Locate the epel repository rpm. You will download it later but it is good to verify the path first rather than debug it later.  Currently it is at http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm though the path and name may change.  if it does, I just work my way back up the file path in the URL until I find the change and navigate down from there.

Then, Locate the vmfs-tools package.  Again, you will download it later but verify the path and change the procedure below as necessary.  The package is currently at https://glandium.org/projects/vmfs-tools/vmfs-tools-0.2.5.tar.gz

Finally, make sure you have a SSH client.  I use teraterm but you can use putty or whatever you like.

Start by booting to the Centos ISO image.

Select Install CentOS 7.   Eventually you will be rewarded with a desktop.  From there, open a terminal window.  I right click on the desktop and select Konsole.

Elevate to root
su -

To make it easier to work with and make cut and paste commands easier, start ssh server
service sshd start

Now create a new user account and set the password.  I don't care the user name you use or the password. just remember them
useradd userx --groups root
passwd userx

SSH to the server
You can get the IP address using ifconfig






Log in using the account you created above.
Elevate to root
su -

Now work from the ssh client and not the console anymore.

Create a mount path for the datastore.  Create and many as you want to mount VMFS volumes and use any path and name you want.  Here I had 2 volumes to mount so I created 2 mount points.
mkdir -p /mnt/dsk1
mkdir -p /mnt/dsk2

Download and install the epel repository package. This makes it easy to install the next couple packages.
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
rpm -Uhv epel-release-7-11.noarch.rpm

Install Libuuid, Libuuid-devel and gcc. say yes to all prompts
yum install libuuid libuuid-devel
yum install gcc

Download the vmfs-tools package the extract it
wget https://glandium.org/projects/vmfs-tools/vmfs-tools-0.2.5.tar.gz
tar zxf vmfs-tools-0.2.5.tar.gz

Compile vmfs-tools
cd vmfs-tools-0.2.5
./configure
make
make install
("make install" didn't actually install it in /user/bin so I execute it from the build path)
cd ~/vmfs-tools-0.2.5/vmfs-fuse or just cd vmfs-fuse

When mounting a an VMWare boot disk, there are several partitions.  The 3rd partition is almost always the datastore. In this example, I have 2 VMware disk (sdc and sdd).  Notice only 2 partitions on sdd.  This is not a bootable VMWare drive, justa  datastore drive.













Now, lets mount the volume.  I am mounting partition3 (the datastore partition) to the mount path I created previously.
./vmfs-fuse /dev/sdc3 /mnt/dsk1

If you want to see the partitions on the disk, use fdisk -l /dev/sdc or whatever the sd? device is.
fdisk -l /dev/sdc












NOTE:  The file system is read only.  So, you can't write. I am not sure why, I don't really need to write.

You can also run a a fsck scan of the volume to see if there are issues with the file system
cd ~/vmfs-tools-0.2.5/fsck.vmfs/
./fsck.vmfs /dev/sdc3

Now you can copy and view files on the VMFS datastore by navigating around /mnt/dsk1.

To copy files somewhere, you will need  a USB drive or a network file system mount.  I used a NFS mount.  e.g.

mkdir /nfs
mount 192.168.1.1:/vol/nfs /nfs

I wanted to copy off some VMs in hops of saving them, so I used rsync which shows progress and will continue on errors.
rsync -r --info=progress2 mnt/dsk1/myvm /nfs/myvm

Now that I am done, I cleanly unmount my datastores and reboot.
umount /nfs



Wednesday, February 7, 2018

MAC OSX Zero Free Space for VMWare Deduplication

Periodically working with virtual machines (vms),  enough files are created and deleted that the thin provisioned virtual disk (vdisk) expands to its maximum capacity even though the operating system (OS) file system shows free space.   This is typical and normal behavior.  Unfortunately, this consumes space on the underlying storage that is no longer being active used with the VM OS. 

For years I have been using the sdelete.exe Microsoft SDelete tool that securely erases deleted files using the option to just write zeros to all remaining free space.  In Linux, I use the dd tool to read from /dev/zero and write to a temporary file filling all free space with zeros then deleting the temporary file. 

These procedures simply write zeros to free space.  VMware and network storage systems will "see" these zeros and free allocated storage space to the virtual disk.  In essence, this shrinks the virtual file size on storage freeing unused space on the storage system.  Some advanced storage systems will automatically detect these zeros and automatically free the space.  Others you need to run a command line on ESXi to free the zeroed space. 

The MAC OS has a couple ways to write zeros on free space.  The graphical disk utility in Utilities menu and a command line too.  I haven't had much luck with the GUI tool, so this procedure uses the command line tool. 

First, open a terminal as an admin account.

type diskutil list to locate the drive you want to write zeros to.  In my case it is partition 2 on /dev/disk0.  Look for Apple_HFS macintosh HD.  the identifier for mine is disk0s2.

Now run the too and write some zeros

diskutil secureErase freespace 0 disk02

where...

secureErase = Secure Erace.  There are 5 levels, we want level 0 for single-pass zeros
freespace = only write zeros to free, unused space.  Does not affect files or OS
0 = secureErase level 0 single-pass zeros
disk0s2 = my partition that has my data

I have a SSD drive so it is pretty quick.    3 or 4 minutes.  The progress bar will indicate how long the zero write will take.  The estimate updates every few seconds.

When it is all done, use the vmware command line tool vmkfstool to free space that contains all zeros.  First SSH to the ESXi hot and login as root (there are other methods but I use SSH to esxi to run the command line tools).

For example on my VM, I used the command
vmkfstools -K /vmfs/volumes/datastore1/Mac_OS_Master/Mac_OS_Master.vmdk

The starting size of the VM was 105GB with used and non-shared at 95GB.  After zero write procedure, the provisioned size was still 105GB the used and not-shared were now 57GB.

If the VM has frequent file writes and deletes, the used space will slowly increase again and eventually warrant another shrinking.  If it is very frequent and expands the virtual disk to capacity in a short time, it may not be worth the effort to shrink the virtual disk.  It is up to you.