Broken system after crash "Error connecting: Could not connect: No such file or directory"

Initially, I had some kind of crash. Either the compositor or graphics driver crashed but the system did recover from it automatically. I didn’t think much about it and decided to run a system update and then reboot.

I looked away from the computer during this update and not sure what happened but the add/remove programs window was closed when I came back. I reopened and and checked for updates and everything came back clean so I rebooted.

After rebooting, I got back into the login screen. Tried logging and and everything went black. Tried switching to a tty and it only gave me a cursor with no login prompt.

I booted into a live usb, and manjaro-chrooted into the system to run a pacman-Syyu and pacman said everything was up to date. I ran a pacman -Qkk and found ~100 packages that either had alterations/missing mtab (or mtree? something like that. i dont remember).

I decided to reinstall all packages and overwrite using the following:

pacman-mirrors --fasttrack 5 && pacman -Syyu
pacman -Qqn | pacman --overwrite=* -S -

There are a few errors here

(18/46) Refreshing PackageKit...
Error connecting: Could not connect: No such file or directory
error: command failed to execute correctly
...
(20/46) Installing Grub to MBR/EFI
WARNING: EFI directory not found! Grub couldn't be installed.
error: command failed to execute correctly

I tried manually mounting efi partition and chrooting and just tried reinstalling grub with this

sudo mount /dev/nvme1n1p2 /mnt                                                                                                                                                                                                                                                                                                                                                                                
mkdir -p /mnt/boot/efi                                                                                                                                                                                                                                                                                                                                                                                                 
sudo mount /dev/nvme1n1p1 /mnt/boot/efi                                                                                                                                                                                                                                                                                                                                                                                
sudo manjaro-chroot /mnt                                                                                                                                                                                                                                                                                                                                                                                               
sudo pacman -S grub
warning: grub-2:2.12.r260.gaae2ea619-3 is up to date -- reinstalling
resolving dependencies...
looking for conflicting packages...

Packages (1) grub-2:2.12.r260.gaae2ea619-3

Total Installed Size:  50.93 MiB
Net Upgrade Size:       0.00 MiB

:: Proceed with installation? [Y/n] y
(1/1) checking keys in keyring                                                                                                                                                                                                                                
(1/1) checking package integrity                                                                                                                                                                                                                              
(1/1) loading package files                                                                                                                                                                                                                                   
(1/1) checking for file conflicts                                                                                                                                                                                                                             
(1/1) checking available disk space                                                                                                                                                                                                                           
:: Running pre-transaction hooks...
(1/1) Creating Timeshift snapshot before upgrade...
==> skipping timeshift-autosnap due skipRsyncAutosnap in /etc/timeshift-autosnap.conf set to TRUE.
:: Processing package changes...
(1/1) reinstalling grub                                                                                                                                                                                                                                       
:: To use the new features provided in this GRUB update, it is recommended
   to install it to the MBR or UEFI. Due to potential configuration
   incompatibilities, it is advised to run both, installation and generation
   of configuration:
     # UEFI: https://wiki.archlinux.org/title/GRUB#Installation
     # BIOS: https://wiki.archlinux.org/title/GRUB#Installation_2
:: Running post-transaction hooks...
(1/4) Arming ConditionNeedsUpdate...
(2/4) Refreshing PackageKit...
Error connecting: Could not connect: No such file or directory
error: command failed to execute correctly
(3/4) Installing Grub to MBR/EFI
WARNING: EFI directory not found! Grub couldn't be installed.
error: command failed to execute correctly
(4/4) Updating the info directory file...

Any ideas what to try next?


Mod edit:- In future, please try to break your text into paragraphs for better legibility; see edits made as an example.

What is your problem?

The “errors” are from trying to reinstall Grub from within a chroot environment.

Is that even necessary?

Why would the “old” grub not work anymore?

Why would you insist on having it updated?

Can you not boot?
What is the actual problem?

Currently, the system does not boot. These are the journalctl errors from before I started fiddling with everything.

Apr 29 20:04:24 desktop dbus-broker-launch[1562]: Invalid XML in /usr/share/dbus-1/system.d/org.kde.kcontrol.kcmclock.conf +1: no element found
Apr 29 20:04:24 desktop dbus-broker-launch[1562]: ERROR run @ ../dbus-broker-36/src/launch/main.c +152: Return code 1
Apr 29 20:04:24 desktop dbus-broker-launch[1562]:       main @ ../dbus-broker-36/src/launch/main.c +178
Apr 29 20:04:24 desktop dbus-broker-launch[1562]: Exiting due to fatal error: -131
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Main process exited, code=exited, status=1/FAILURE
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start D-Bus System Message Bus.
Apr 29 20:04:24 desktop systemd[1]: Dependency failed for Network Manager.
Apr 29 20:04:24 desktop systemd[1]: Dependency failed for Network Manager Wait Online.
Apr 29 20:04:24 desktop systemd[1]: NetworkManager-wait-online.service: Job NetworkManager-wait-online.service/start failed with result 'dependency'.
Apr 29 20:04:24 desktop systemd[1]: NetworkManager.service: Job NetworkManager.service/start failed with result 'dependency'.
Apr 29 20:04:24 desktop systemd[1]: Reached target Network.
Apr 29 20:04:24 desktop systemd[1]: Starting D-Bus System Message Bus...
Apr 29 20:04:24 desktop dbus-broker-launch[1566]: Invalid XML in /usr/share/dbus-1/system.d/org.kde.kcontrol.kcmclock.conf +1: no element found
Apr 29 20:04:24 desktop dbus-broker-launch[1566]: ERROR run @ ../dbus-broker-36/src/launch/main.c +152: Return code 1
Apr 29 20:04:24 desktop dbus-broker-launch[1566]:       main @ ../dbus-broker-36/src/launch/main.c +178
Apr 29 20:04:24 desktop dbus-broker-launch[1566]: Exiting due to fatal error: -131
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Main process exited, code=exited, status=1/FAILURE
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start D-Bus System Message Bus.
Apr 29 20:04:24 desktop systemd[1]: Starting D-Bus System Message Bus...
Apr 29 20:04:24 desktop dbus-broker-launch[1570]: Invalid XML in /usr/share/dbus-1/system.d/org.kde.kcontrol.kcmclock.conf +1: no element found
Apr 29 20:04:24 desktop dbus-broker-launch[1570]: ERROR run @ ../dbus-broker-36/src/launch/main.c +152: Return code 1
Apr 29 20:04:24 desktop dbus-broker-launch[1570]:       main @ ../dbus-broker-36/src/launch/main.c +178
Apr 29 20:04:24 desktop dbus-broker-launch[1570]: Exiting due to fatal error: -131
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Main process exited, code=exited, status=1/FAILURE
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start D-Bus System Message Bus.
Apr 29 20:04:24 desktop systemd[1]: Starting D-Bus System Message Bus...
Apr 29 20:04:24 desktop dbus-broker-launch[1574]: Invalid XML in /usr/share/dbus-1/system.d/org.kde.kcontrol.kcmclock.conf +1: no element found
Apr 29 20:04:24 desktop dbus-broker-launch[1574]: ERROR run @ ../dbus-broker-36/src/launch/main.c +152: Return code 1
Apr 29 20:04:24 desktop dbus-broker-launch[1574]:       main @ ../dbus-broker-36/src/launch/main.c +178
Apr 29 20:04:24 desktop dbus-broker-launch[1574]: Exiting due to fatal error: -131
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Main process exited, code=exited, status=1/FAILURE
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start D-Bus System Message Bus.
Apr 29 20:04:24 desktop systemd[1]: Starting D-Bus System Message Bus...
Apr 29 20:04:24 desktop dbus-broker-launch[1578]: Invalid XML in /usr/share/dbus-1/system.d/org.kde.kcontrol.kcmclock.conf +1: no element found
Apr 29 20:04:24 desktop dbus-broker-launch[1578]: ERROR run @ ../dbus-broker-36/src/launch/main.c +152: Return code 1
Apr 29 20:04:24 desktop dbus-broker-launch[1578]:       main @ ../dbus-broker-36/src/launch/main.c +178
Apr 29 20:04:24 desktop dbus-broker-launch[1578]: Exiting due to fatal error: -131
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Main process exited, code=exited, status=1/FAILURE
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start D-Bus System Message Bus.
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Start request repeated too quickly.
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start D-Bus System Message Bus.
Apr 29 20:04:24 desktop systemd[1]: dbus.socket: Failed with result 'service-start-limit-hit'.
Apr 29 20:04:24 desktop systemd[1]: Reached target Basic System.
Apr 29 20:04:24 desktop systemd[1]: Starting Save/Restore Sound Card State...
Apr 29 20:04:24 desktop systemd[1]: Manage Sound Card State (restore and store) was skipped because of an unmet condition check (ConditionPathExists=/etc/alsa/state-daemon.conf).
Apr 29 20:04:24 desktop systemd[1]: Starting Avahi mDNS/DNS-SD Stack...
Apr 29 20:04:24 desktop systemd[1]: Starting Bluetooth service...
Apr 29 20:04:24 desktop systemd[1]: Starting containerd container runtime...
Apr 29 20:04:24 desktop systemd[1]: Starting CUPS Scheduler...
Apr 29 20:04:24 desktop systemd[1]: Starting Clean up modules from old kernels...
Apr 29 20:04:24 desktop systemd[1]: Started Mullvad VPN daemon.
Apr 29 20:04:24 desktop systemd[1]: Reached target Network is Online.
Apr 29 20:04:24 desktop (uetoothd)[1584]: bluetooth.service: ConfigurationDirectory 'bluetooth' already exists but the mode is different. (File system: 755 ConfigurationDirectoryMode: 555)
Apr 29 20:04:24 desktop systemd[1]: Starting Authorization Manager...
Apr 29 20:04:24 desktop systemd[1]: Starting User Login Management...
Apr 29 20:04:24 desktop systemd[1]: TPM PCR Barrier (User) was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
Apr 29 20:04:24 desktop linux-module-cleanup[1591]: cat: /usr/lib/modules/.old: No such file or directory
Apr 29 20:04:24 desktop systemd[1]: Starting Permit User Sessions...
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_daemon::version][INFO] Starting mullvad-daemon - 2024.1 2024-03-21
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_daemon][INFO] Logging to /var/log/mullvad-vpn
Apr 29 20:04:24 desktop systemd[1]: Finished Save/Restore Sound Card State.
Apr 29 20:04:24 desktop systemd[1]: linux-module-cleanup.service: Deactivated successfully.
Apr 29 20:04:24 desktop systemd[1]: Finished Clean up modules from old kernels.
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_daemon::rpc_uniqueness_check][DEBUG] Failed to locate/connect to another daemon instance, assuming there isn't one
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_daemon][INFO] Management interface listening on /var/run/mullvad-vpn
Apr 29 20:04:24 desktop systemd[1]: Reached target Sound Card.
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_api::address_cache][DEBUG] Loading API addresses from /var/cache/mullvad-vpn/api-ip-address.txt
Apr 29 20:04:24 desktop avahi-daemon[1583]: Found user 'avahi' (UID 972) and group 'avahi' (GID 972).
Apr 29 20:04:24 desktop avahi-daemon[1583]: Successfully dropped root privileges.
Apr 29 20:04:24 desktop avahi-daemon[1583]: avahi-daemon 0.8 starting up.
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_api::address_cache][DEBUG] Using API address: 45.83.223.196:443
Apr 29 20:04:24 desktop avahi-daemon[1583]: dbus_bus_get_private(): Failed to connect to socket /run/dbus/system_bus_socket: Connection refused
Apr 29 20:04:24 desktop avahi-daemon[1583]: WARNING: Failed to contact D-Bus daemon.
Apr 29 20:04:24 desktop avahi-daemon[1583]: avahi-daemon 0.8 exiting.
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_api::availability][DEBUG] Suspending API requests
Apr 29 20:04:24 desktop systemd[1]: avahi-daemon.service: Main process exited, code=exited, status=255/EXCEPTION
Apr 29 20:04:24 desktop systemd[1]: avahi-daemon.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start Avahi mDNS/DNS-SD Stack.
Apr 29 20:04:24 desktop systemd[1]: Finished Permit User Sessions.
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_daemon::settings][INFO] Loading settings from /etc/mullvad-vpn/settings.json
Apr 29 20:04:24 desktop systemd[1]: Started Command Scheduler.
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_daemon::version_check][DEBUG] Loading version check cache from /var/cache/mullvad-vpn/version-info.json
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_relay_selector][DEBUG] Reading relays from /var/cache/mullvad-vpn/relays.json
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_relay_selector][DEBUG] Reading relays from /opt/Mullvad VPN/resources/relays.json
Apr 29 20:04:24 desktop crond[1616]: (CRON) STARTUP (1.7.2)
Apr 29 20:04:24 desktop crond[1616]: (CRON) INFO (Syslog will be used instead of sendmail.)
Apr 29 20:04:24 desktop crond[1616]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 98% if used.)
Apr 29 20:04:24 desktop crond[1616]: (CRON) INFO (running with inotify support)
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_relay_selector][INFO] Initialized with 711 cached relays from 2025-04-29 19:52:31.727
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_api::availability][DEBUG] Pausing background API requests
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_daemon::account_history][INFO] Opening account history file in /etc/mullvad-vpn/account-history.json
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_daemon::target_state][DEBUG] No cached target state to load
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [talpid_core::firewall][INFO] Resetting firewall policy
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [talpid_core::firewall::imp][DEBUG] Removing table and chain from netfilter
Apr 29 20:04:24 desktop systemd[1]: Started CUPS Scheduler.
Apr 29 20:04:24 desktop bluetoothd[1584]: Bluetooth daemon 5.82
Apr 29 20:04:24 desktop bluetoothd[1584]: D-Bus setup failed: Failed to connect to socket /run/dbus/system_bus_socket: Connection refused
Apr 29 20:04:24 desktop bluetoothd[1584]: src/main.c:main() Unable to get on D-Bus
Apr 29 20:04:24 desktop systemd[1]: bluetooth.service: Main process exited, code=exited, status=1/FAILURE
Apr 29 20:04:24 desktop systemd[1]: bluetooth.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start Bluetooth service.
Apr 29 20:04:24 desktop systemd[1]: Reached target Bluetooth Support.
Apr 29 20:04:24 desktop systemd-logind[1592]: Failed to connect to system bus: Connection refused
Apr 29 20:04:24 desktop systemd-logind[1592]: Failed to fully start up daemon: Connection refused
Apr 29 20:04:24 desktop systemd[1]: systemd-logind.service: Main process exited, code=exited, status=1/FAILURE
Apr 29 20:04:24 desktop systemd[1]: systemd-logind.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start User Login Management.
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_api::availability][DEBUG] Pausing API requests due to being offline
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_api::availability][DEBUG] Unsuspending API requests
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_api::access][DEBUG] Fetching access token for an account
Apr 29 20:04:24 desktop mullvad-daemon[1589]: [mullvad_daemon::geoip][DEBUG] Fetching GeoIpLocation
Apr 29 20:04:24 desktop systemd[1]: systemd-logind.service: Scheduled restart job, restart counter is at 1.
Apr 29 20:04:24 desktop systemd[1]: Listening on D-Bus System Message Bus Socket.
Apr 29 20:04:24 desktop systemd[1]: Starting Load Kernel Module drm...
Apr 29 20:04:24 desktop systemd[1]: modprobe@drm.service: Deactivated successfully.
Apr 29 20:04:24 desktop systemd[1]: Finished Load Kernel Module drm.
Apr 29 20:04:24 desktop systemd[1]: Starting User Login Management...
Apr 29 20:04:24 desktop polkitd[1590]: Started polkitd version 126
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Start request repeated too quickly.
Apr 29 20:04:24 desktop systemd[1]: dbus-broker.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start D-Bus System Message Bus.
Apr 29 20:04:24 desktop systemd[1]: dbus.socket: Failed with result 'service-start-limit-hit'.
Apr 29 20:04:24 desktop polkitd[1590]: Loading rules from directory /etc/polkit-1/rules.d
Apr 29 20:04:24 desktop polkitd[1590]: Loading rules from directory /run/polkit-1/rules.d
Apr 29 20:04:24 desktop polkitd[1590]: Error opening rules directory: Error opening directory <E2><80><9C>/run/polkit-1/rules.d<E2><80><9D>: No such file or directory (g-file-error-quark, 4)
Apr 29 20:04:24 desktop polkitd[1590]: Loading rules from directory /usr/local/share/polkit-1/rules.d
Apr 29 20:04:24 desktop polkitd[1590]: Error opening rules directory: Error opening directory <E2><80><9C>/usr/local/share/polkit-1/rules.d<E2><80><9D>: No such file or directory (g-file-error-quark, 4)
Apr 29 20:04:24 desktop polkitd[1590]: Loading rules from directory /usr/share/polkit-1/rules.d
Apr 29 20:04:24 desktop polkitd[1590]: Finished loading, compiling and executing 10 rules
Apr 29 20:04:24 desktop systemd[1]: Started Authorization Manager.
Apr 29 20:04:24 desktop polkitd[1590]: Lost the name org.freedesktop.PolicyKit1 - exiting
Apr 29 20:04:24 desktop systemd[1]: Starting Modem Manager...
Apr 29 20:04:24 desktop systemd[1]: polkit.service: Main process exited, code=exited, status=1/FAILURE
Apr 29 20:04:24 desktop systemd[1]: polkit.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop ModemManager[1656]: <msg> ModemManager (version 1.22.0-1) starting in system bus...
Apr 29 20:04:24 desktop systemd-logind[1635]: Failed to connect to system bus: Connection refused
Apr 29 20:04:24 desktop systemd-logind[1635]: Failed to fully start up daemon: Connection refused
Apr 29 20:04:24 desktop ModemManager[1656]: <wrn> could not acquire the 'org.freedesktop.ModemManager1' service name
Apr 29 20:04:24 desktop ModemManager[1656]: <wrn> [sleep-monitor-systemd] failed to acquire logind proxy: Could not connect: Connection refused
Apr 29 20:04:24 desktop ModemManager[1656]: <msg> ModemManager is shut down
Apr 29 20:04:24 desktop systemd[1]: systemd-logind.service: Main process exited, code=exited, status=1/FAILURE
Apr 29 20:04:24 desktop systemd[1]: systemd-logind.service: Failed with result 'exit-code'.
Apr 29 20:04:24 desktop systemd[1]: Failed to start User Login Management.

There were a number of conf files that were 0 bytes. I deleted them to get past the dbus errors. Once i did that, booting still worked but logging in caused the login manager to freeze rather than causing a black screen. Booting broke after i reinstalled all packages. I also uninstalled a few services/packages that i noticed were popping up across all the different errors (mullvad, openoffice, chromium).

The “errors” are from trying to reinstall Grub from within a chroot environment.

I figured i was doing something wrong. How should I go about reinstalling grub the right way?

This means you’ve got filesystem damage, and even if you can repair the filesystem — from a live session, and without mounting the on-disk filesystem — the zeroed files are gone, and your system will undoubtedly be damaged.

At this point, it is still not clear to me whether your damage was self-inflicted or not, but I strongly suspect that your drive itself may be failing, in which case I would recommend you replace it with the utmost urgency. Do not continue using it, because it’s only going to get worse.

In addition to that, your packagekit error indicates that you’ve got something installed that you shouldn’t have, namely… packagekit. It is badly broken on Arch-based distributions, and it throws your permissions wide open. It’s a genuine security hazard, and you should remove it.

Still, given that I believe your drive to be failing, and given how your operating system is damaged, you are looking at a reinstall and a backup restore, at the least. If it’s a reinstall, then be sure not to install packagekit — it’s a dependency of discover, which you should not use in Manjaro (or any other Arch-based distribution).

2 Likes

Grub is not the problem here.
What you said you did is.

likely

Where did you get the idea that removing config files would be … beneficial?

1 Like

The conf files were 0 bytes and i did not make them myself. So i assumed reinstalling packages would remake any necessary files. I’m pretty sure the 0 byte files were the reason for not being able to log in based on the journalctl errors. As for why those files were 0 bytes in the first place, a failing drive does sound possible.

Then why bother reinstalling packages? Get yourself a new drive, reinstall your system on the new drive, and then restore your backups to it — which you do have, right?

Then why bother reinstalling packages?

I was reinstalling packages before when I didn’t have any idea what was going on or why things weren’t working.

then restore your backups to it — which you do have, right?

The whole drive isn’t backed up but the important stuff is. I’ll be fine if I can’t get on the drive anymore.

1 Like

This may be akin to bolting the barn door after the horse has bolted… but, here are a few links worth bookmarking for future reference;

Regards.


Welcome to the Manjaro community

As a new or infrequent forum user, please take some time to familiarise yourself with Forum requirements, and the many ways to use the forum to your benefit:


Update Announcements

The Update Announcements contain important information and a Known Issues and Solutions section that should generally be checked before posting a request for support.

System Information

While information from *-fetch type apps might be fine for someone wishing to buy your computer, for Support purposes it’s better to ask your system directly; :eyes:

Output of the inxi command with appropriate parameters will achieve this (naturally, formatted according to forum guidelines) and will generally be more useful for those wishing to help:

inxi --filter --verbosity=8

or the short form:

inxi -zv8

Be prepared to provide output from other commands whenever asked. It’s equally important to provide as much actionable information as possible in your first post, rather than simply indicating there is a problem.

Highly Recommended
Required Reading
Technical Resources

1 Like