Description
Describe the Bug
On an ARM MacOS environment, facter
's builtin processors.isa
and os.architecture
facts report the architecture being emulated by Rosetta, not the architecture of the host hardware.
Rosetta 2 is MacOS's system for the execution of Intel binaries on ARM-based (M1/2/3) Macs.
When a binary is Intel-only, or when a binary is "universal" and contains segments for both Intel and ARM, Rosetta 2 can be used to run it as x86_64.
Expected Behavior
- The computer's
processors
don't change to contain different silicon based on whether an emulation layer is present, soprocessors.isa
(andhardwareisa
) should not change based on whetherfacter
is being run in an emulated capacity. - The architecture for which MacOS was installed cannot change, so
os.architecture
(andarchitecture
) should not change based on whetherfacter
is being run in an emulated capacity.
Steps to Reproduce
- Use MacOS 13 or better on an ARM (M1, M2, M3 etc) Mac. The
arch
command run without arguments should reportarm64
orarm64e
. - Install Rosetta on that Mac:
softwareupdate --install-rosetta
- Install
facter
. - Run
facter
in the arm64 architecture (should be the default), and observe that the isa/architecture related facts match the computer's hardware:
> arch -arch arm64 facter | grep 'isa\|arch'
architecture => "arm64",
isa => "arm",
- Run
facter
via Rosetta emulation, and observe that the isa/architecture facts are now incorrect:
> arch -arch x86_64 facter | grep 'isa\|arch'
architecture => "x86_64",
isa => "i386",
Environment
MacOS 14.5, also reproduced on MacOS 13.
I was unable to install facter
directly via gem as the dependency on the now-deprecated hpricot
prevented compilation on my machine.
Instead, I reproduced this using two puppetlabs-official distributions of facter: facter 4.6.1 via brew install --cask puppet-agent
(which ships with an ARM-only ruby 2.7.8p225 (2023-03-30 revision 1f4d455848) [arm64-darwin23]
), and facter 4.7.0 via brew install --cask puppet-bolt
(which ships with an x86_64 ruby 2.7.8p225 (2023-03-30 revision 1f4d455848) [x86_64-darwin21]
. The x86-ness isn't implicated here, and is likely temporary pending resolution of a low-priority issue I reported))
Additional Context
This seems to be due to the os/processor facts' dependency on the uname
propvider (e.g. here). uname
is not an appropriate way to get hardware information on MacOS. It reports information about the current runtime/emulation context, not about the machine itself:
> uname -a
Darwin atropos.local 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:12:58 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6000 arm64
> arch -arch arm64 uname -a
Darwin atropos.local 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:12:58 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6000 arm64
> arch -arch x86_64 uname -a
Darwin atropos.local 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:12:58 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6000 x86_64