cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
767
Views
7
Helpful
3
Replies

NSO 6.0.4 on AppleSilicon

Tomoya Watanabe
Spotlight
Spotlight

I want to run NSO 6.0.4 as local_install to develop service model in local environment.

Environment:
MacBook Pro 14inch,2021
Apple M1 Pro
Monterey 12.0.1

I noticed NSO 6.1 has darwin/arm installer however 6.0.4 does not have arm installer.

When package reload, I got following result:

 

ncs_cli

admin@ncs# packages reload
reload-result {
package add_loopback
result false
info Python VM failed to start
}
reload-result {
package cisco-ios-cli-3.8
result true
}

ncs-python-vm.log

<INFO> 3-May-2023::21:26:15.419 H2201889 ncs[20011]: Restarted PyVM: <<"add_loopback">> , Port=#Port<0.30> , OSpid="20488"
<INFO> 3-May-2023::21:26:15.436 H2201889 ncs[20011]: add_loopback :: Starting python3 -u /Users/twatanabe/nso/6.0.4//src/ncs/pyapi/ncs_pyvm/startup.py -l info -f ./logs/ncs-python-vm -i add_loopback -s alarm
<INFO> 3-May-2023::21:26:15.878 H2201889 ncs[20011]: add_loopback :: Traceback (most recent call last):
File "/Users/twatanabe/nso/6.0.4//src/ncs/pyapi/ncs_pyvm/startup.py", line 6, in <module>
import ncsctlsock
File "/Users/twatanabe/nso/6.0.4/src/ncs/pyapi/ncs_pyvm/ncsctlsock.py", line 5, in <module>
import _ncs
File "/Users/twatanabe/nso/6.0.4/src/ncs/pyapi/_ncs/__init__.py", line 12, in <module>
from ._ncs_py3 import cdb
ImportError: dlopen(/Users/twatanabe/nso/6.0.4/src/ncs/pyapi/_ncs/_ncs_py3.abi3.so, 0x0002): tried: '/Users/twatanabe/nso/6.0.4/src/ncs/pyapi/_ncs/_ncs_py3.abi3.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e')), '/usr/local/lib/_ncs_py3.abi3.so' (no such file), '/usr/lib/_ncs_py3.abi3.so' (no such file)
<INFO> 3-May-2023::21:26:15.886 H2201889 ncs[20011]: Got EXIT on Port= #Port<0.30>

It looks like arm/x86 architecture problem

Do you have any solutions?

1 Accepted Solution

Accepted Solutions

I checked my python3 architecture then it was not universal2.

twatanabe:~/nso/6.0.4/post-modifications-test/packages/ 13:15:36  $ cd /Users/twatanabe/.pyenv/versions/3.8.16/
twatanabe:~/.pyenv/versions/3.8.16/ 13:15:48  $ ls
bin	include	lib	share
twatanabe:~/.pyenv/versions/3.8.16/ 13:15:48  $
twatanabe:~/.pyenv/versions/3.8.16/ 13:15:48  $ file bin/python3
bin/python3: Mach-O 64-bit executable arm64

As you can see, I am using pyenv and pyenv looks like compile python binary not for universal2.
I investigated how to compile python3 as universal2 with pyenv but I could not find the way.

Anyway, it is not NSO issue so I switched python3 from pyenv to local system installed from universal2 installer.

twatanabe:~/nso/6.0.4/post-modifications-test/packages/ 13:12:48  $ file /Library/Frameworks/Python.framework/Versions/3.10/bin/python3
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3 (for architecture x86_64):	Mach-O 64-bit executable x86_64
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3 (for architecture arm64):	Mach-O 64-bit executable arm64
twatanabe:~/nso/6.0.4/post-modifications-test/packages/ 13:12:57  $

After do that, I could start NSO and do package reload.

Thank you for your help! 

View solution in original post

3 Replies 3

cohult
Cisco Employee
Cisco Employee

The Python3 version you use when running x86_64 programs on Apple silicone, e.g., M1, must be from a universal2 installer to support both arm64 and x86_64. https://www.python.org/downloads/macos/
The pre-installed Python3 version is usually installed here:

 

$ type -p python3
/usr/bin/python3

 

Also, I added the following to my ~/.zprofile

 

## Useful M1 aliases
alias arm="env /usr/bin/arch -arm64 /bin/zsh --login"
alias intel="env /usr/bin/arch -x86_64 /bin/zsh --login"

 

and ~/.bash_profile:

 

## Useful M1 aliases
alias arm="env /usr/bin/arch -arm64 /bin/bash --login"
alias intel="env /usr/bin/arch -x86_64 /bin/bash --login"

 

When I want to run an x86_64 application, I first run the "intel" alias:

 

$ intel
$ source nso-6.0.4/ncsrc

 



I checked my python3 architecture then it was not universal2.

twatanabe:~/nso/6.0.4/post-modifications-test/packages/ 13:15:36  $ cd /Users/twatanabe/.pyenv/versions/3.8.16/
twatanabe:~/.pyenv/versions/3.8.16/ 13:15:48  $ ls
bin	include	lib	share
twatanabe:~/.pyenv/versions/3.8.16/ 13:15:48  $
twatanabe:~/.pyenv/versions/3.8.16/ 13:15:48  $ file bin/python3
bin/python3: Mach-O 64-bit executable arm64

As you can see, I am using pyenv and pyenv looks like compile python binary not for universal2.
I investigated how to compile python3 as universal2 with pyenv but I could not find the way.

Anyway, it is not NSO issue so I switched python3 from pyenv to local system installed from universal2 installer.

twatanabe:~/nso/6.0.4/post-modifications-test/packages/ 13:12:48  $ file /Library/Frameworks/Python.framework/Versions/3.10/bin/python3
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3 (for architecture x86_64):	Mach-O 64-bit executable x86_64
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3 (for architecture arm64):	Mach-O 64-bit executable arm64
twatanabe:~/nso/6.0.4/post-modifications-test/packages/ 13:12:57  $

After do that, I could start NSO and do package reload.

Thank you for your help! 

eself
Cisco Employee
Cisco Employee

I think this is the best way to run intel NSO on an apple silicon M1: start a shell, switch to "intel mode" and then run nso.

I had problem with python VM and a mismatch of libraries: pip3 on an M1 installs aarm64 version of python packages and some mathematical packages (numpy scipy) have a library binary which is accordingly compiled for aarm64. NSO is x86_64 and it starts an x86_64 python3.9 env, but then if any python package uses any of the above mentioned mathematical libraries, start-up halts due to a mismatch of architectures.

By switching to intel mode, you can install the intel version of the library and NSO will start-up succesfully.

As a downside, if any python package uses numpy or scipy in "arm mode" it will fail again with a mismatch of architecture.

Getting Started

Find answers to your questions by entering keywords or phrases in the Search bar above. New here? Use these resources to familiarize yourself with the NSO Developer community: