Update FreeBSD to 14.0, Update zpool, and can’t boot…how to fix?

As FreeBSD 13.2 is EOF and FreeBSD 14.0 is released, so I think it’s time to update my server to FreeBSD 14.

So I updated the server as what I did before.

freebsd-update -r 14.0-RELEASE upgrade
freebsd-update install
shutdown -r now
freebsd-update install

And when I also noticed that FreeBSD 14 updated zpool verson and introduce some new features, so I also updated zpool as well.

zpool upgrade zroot

And also updated bootcode on all disks, this is very important.

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
...
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da7

And the final step is to reboot the server to finish upgrade.

Then, server can’t boot. I got below error.

And gpart can find all disks and partition.

What’s happening? I updated bootcode why I still get this error?

And then I did some research, and found that in FreeBSD 14 release note, it’s mentioned

There have been a number of improvements in the boot loaders, and upgrading the boot loader on the boot partition is recommended in most cases, in particular if the system boots via EFI. If the root is on a ZFS file system, updating the boot loader is mandatory if the pool is to be upgraded, and the boot loader update must be done first. Note that ZFS pool upgrades are not recommended for root file systems in most cases, but updating the boot loader can avoid making the system unbootable if the pool is upgraded in the future. The bootstrap update procedure depends on the boot method (EFI or BIOS), and also on the disk partitioning scheme. The next several sections address each in turn.

Well, this is something new in FreeBSD 14, and I didn’t update EFI boot file and that’s why I’m facing this issue.

So, spend some time to fix the boot issue.

First, I tried to change bios from BIOS to UEFI, to see if I can boot the server via BIOS. But unfortunately, it’s not working, and got below error.

So, the only choice is to boot the server with liveCD and fix it.

Select 1, boot installer here. Do not select 2 single mode as single mode is readonly.

Select liveCD

Type root to login, no password is needed.

And then you can mount your zpool via below command (Actually this is not needed if you only need to fix the boot issue)

zpool import -f -R /tmp/zroot zroot

Keep in mind here the only writable folder is /tmp, so you must mount your zpool here.

Determined the location of the boot loader via below command:

efibootmgr -v.

The one with + is the one in use, in below screen shot as I boot from virtual CD so it’s marked as USB.

The one on local disk is mfisyspd0p1

Mount the ESP partition via below command:

mount_msdosfs /dev/mfisyspd0p1 /boot/efi

And then run below files to copy the EFI boot loaders from CD to local disk.


cp /boot/loader.efi /mnt/efi/freebsd/loader.efi
cp /boot/loader.efi /mnt/efi/boot/bootx86.efi

Then reboot,

Then I got an error complaint UEFI is broken.

Then tried to boot into livecd and copy the files again, then reboot.

This time no error, just complaint not able to boot.

So what’s happening?

I remember when I copied the EFI loader, there are some errors from the HBA card.

Then I checked the sha256 of the loader.efi on CD and on local disk, looks like the loader on local disk is corrupted.

This is a known issue for several years. The default drive in FreeBSD is not working properly with mfi driver (I’m using dell h330). So the fix is

Option 1, when you use livecd to boot, select 3 and enter below command to load the right mrsas driver:

set hw.mfi.mrsas_enable="1"

boot

 

Option 2, keeps copy the file to hard disk, and then use command sync to force OS to write data to disk.  And then check the sha256 of the file. Due to the default driver is not stable, I tried about 10 times, finally got the loader.efi copied to the right position.

Then reboot. This time server can boot successfully, but it booted into single mode.

That’s because we replace the file via livecd, so just run fsck to fix it

fsck /dev/da0p1

Then reboot, all good now.

 

Fix IOS App outlook can’t show preview issue – “Open outlook to read your message”

Looks like it’s a bug. The fix is

  • Go into Outlook App settings and turn on Face ID at the bottom. Restart App
  • Go back into Outlook App settings and turn Face ID off at the bottom. Restart App
  • Go into iPhone settings, scroll down to Outlook, find Face ID setting. Turn it OFF
  • Open Outlook App.

Install ESXi 8 on Intel 12th CPU – “Fatal CPU mismatch on feature”

This problem is caused by the new architecture of Intel CPUs which are equipped with different types of cores – Performance-cores and Efficient-cores.

The parameter needs to be set prior to installation and the first boot of ESXi.

  1. When ESXi installation starts, press SHIFT+O to edit boot options.
  2. Append cpuUniformityHardCheckPanic=FALSE
  3. Press ENTER
  4. Install ESXi
  5. When the installation is finished, reboot the system and press SHIFT+O to edit the boot options again.
  6. Append cpuUniformityHardCheckPanic=FALSE and press ENTER
  7. To make the kernel option permanent, run the following command on your ESXi host:
    # esxcli system settings kernel set -s cpuUniformityHardCheckPanic -v FALSE
    
  8. We also have to enable kernel option ignoreMsrFaults to prevent PSOD during VM startups.
    # esxcli system settings kernel set -s ignoreMsrFaults -v TRUE

This setting allows ESXi to work with different P-Cores and E-Cores

Oracle Cloud – Resize a boot volume on Ubuntu

Via OCI Console, to edit a block volume (Boot volume), you will need to navigate:

 Block Storage –> Boot Volumes –> Boot Volume Details (edit)

Once you finish this part, a popup will show the commands to be performed on the Linux machine console

sudo dd iflag=direct if=/dev/oracleoci/oraclevda of=/dev/null count=1
echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan

As we are using ubuntu, we are not able to use Oracle tools oci-growfs. But it’s easy, just two command:
# growpart /dev/sda 1;
# resize2fs /dev/sda1

Done. now run df -h you should be able to see the new size.

Nginx: Use same port for http and https traffic

This is finally possible to do properly since 1.15.2. See the information here.

your nginx.conf add a block like this (outside the http block):

stream {
    upstream http {
        server localhost:8000;
    }

    upstream https {
        server localhost:8001;
    }

    map $ssl_preread_protocol $upstream {
        default https;
        "" http;
    }

    server {
        listen 8080;
        listen [::]:8080;
        proxy_pass $upstream;
        ssl_preread on;
    }
}

Then you can create your normal server block, but listening on these different ports:

server {
    listen 8000;
    listen [::]:8000;
    listen 8001 ssl;
    listen [::]:8001 ssl;
...