dimecres, 2 de setembre de 2015

Installing Centos 7.1 on a Macbook Pro 7,1 (2010)

Introducció:

Durant aquestes setmanes m'he dedicat a configurar una Centos 7.1 en un MacBook Pro de 2010. Concretament la següent màquina:
sudo dmidecode -s system-product-name
MacBookPro7,1
Tot i que ja han passat 5 anys des que va eixir al mercat el procés no ha resultat tot el senzill que deuria.

Instal·lació:

Per a la instal·lació he utilitzat la següent imatge. L'imatge l'he instal·lada en un llapis usb de 2Gb. El primer problema apareix amb l'instal·lador. L'instal·lador no soporta el sistema de fitxers HFS+ de Mac i Anaconda falla al començar a instal·lar el sistema operatiu. El problema ocorre perque RHEL/Centos 7 no inclouen les dependencies del sistema de fitxers HFS+ de Mac en Anaconda, llavors si tenim una particio d'aquest sistema de fitxers l'instal·lador finalitza amb un error. La sol·lució es la següent:
  1. Arranquem l'instal·lador amb el DVD
  2. Accedim al 2n virtual terminal vt2 (ctrl-alt-f2).
  3. Editem el fixer /usr/lib/python2.7/site-packages/blivet/formats/fs.py. Busquem la definicio de la clase "class HFSPlus". Comentem les següents linies _mkfs, _fsck, _packages, _formattable, i _check properties.
  4. Reiniciem anaconda amb: restart-anaconda.
Una volta hem instal·lat el sistema operatiu, hem d'accedir al OS X i instal·lar Refind de nou. Si mantenim pitjat Alt Dret, despres de sentir el soroll que fa el Mac al arrancar podrem arrancar-lo. Una volta tenim Refind instal·lat de nou, llavors realitzarem la instal·lació del sistema.
# yum groupinstall "GNOME Desktop" "Graphical Administration Tools"
# yum update
I configurarem el runlevel 5 com el runlevel per defecte.
# ln -sf /lib/systemd/system/runlevel5.target \
  /etc/systemd/system/default.target

Configuració del Wireless

Aquest Macbook utilitza una tarjeta wireless Broadcom BCM4322. El controlador per a la seua gestió es privat. Per a configurar-lo procedirem com segueix: Instal·larem els següents paquets: [root@host ~]# yum install kernel-headers kernel-devel gcc patch En la següent url tenim el controlador. El descarreguem i utilitzem les següents comandes:
mkdir -p /usr/local/src/hybrid-wl
cd /usr/local/src/hybrid-wl
tar xvfz /path/to/the/tarball/hybrid-v35_64-nodebug-pcoem-6_30_223_248.tar.gz
chown -R someuser.somegroup /usr/local/src/hybrid-wl
Per a poder compil·lar el controlador en Centos 7 hi ha que descarregar 2 patchs. Apliquem el codi del primer patch.
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-fix-ioctl-handling.patch 
patching file src/wl/sys/wl_cfg80211_hybrid.c
patching file src/wl/sys/wl_linux.
Apliquem el codi del segon patch
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-rhel7_1.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 1801 (offset -3 lines).
Hunk #2 succeeded at 1867 (offset -3 lines).
Hunk #3 succeeded at 2071 (offset -3 lines).
Hunk #4 succeeded at 2804 (offset -3 lines).
Ara ja podem compilar el codi sense problemes.
make -C /lib/modules/`uname -r`/build/ M=`pwd
Una volta compil·lat podem reduir la mida del modul amb strip.
[user@host hybrid-wl]$ strip --strip-debug wl.ko
Copiem el modul a un directori on el kernel el puga reconeixer.
[root@host hybrid-wl]# cp -vi /usr/local/src/hybrid-wl/wl.ko \ 
                          /lib/modules/`uname -r`/extra/
Calculem les dependencies de mòduls
[root@host ~]# depmod $(uname -r)
Carreguem el mòdul.
[root@host hybrid-wl]# modprobe wl
Configurem el sistema per a que carregue el modul durant la inicialització del sistema.
vi /etc/modules-load.d/wl.conf 
# Load wl.ko at boot
wl

Activar la tarjeta Nvidia:

Per a poder instal·lar els drivers de Nvidia necessitem que el sistema arranque en el mode EFI. Com els drivers no ho soporten configurarem el bus PCI-e inicialment per a que els drivers puguen inicialitzar-se sense problemes. Verifiquem que /sys/firmware esta creat, llavors vol dir que hem arrancat en EFI mode. Es necessari per a la correcta instsal·lació. Instal·lem la eina per a generar llistats de hardware.
yum install lshw
Llancem la següent comanda per a obtenir els BUS IDs de la tarjeta gràfica i del bridge PCI-E al que està connectat. Els 2 que ens interessen son els 2 ultims.
[root@localhost modules]# lshw -businfo -class bridge -class display
Bus info          Device  Class          Description
====================================================
pci@0000:00:00.0          bridge         MCP89 HOST Bridge
pci@0000:00:03.0          bridge         MCP89 LPC Bridge
pci@0000:00:0e.0          bridge         NVIDIA Corporation
pci@0000:00:15.0          bridge         NVIDIA Corporation
pci@0000:00:16.0          bridge         NVIDIA Corporation
pci@0000:00:17.0          bridge         MCP89 PCI Express Bridge
pci@0000:04:00.0          display        MCP89 [GeForce 320M]
Instal·lem els moduls adicionals de grub2.
yum install grub2-efi-modules
Copiem el modul setpci.mod a la particio efi per a poder carregar-lo després.
cp /usr/lib/grub/x86_64-efi/setpci.mod /boot/efi/EFI/centos/
Per a poder iniciar el sistema ambls dirviers de nvidia hi ha que activar la targeta Nvidia conectada al bus PCI i activar la entrada/eixida de la tarjeta nvidia i configurar el bus com a mater. Hi ha que canviar els valors de diversos registres com es descriu a continuació:
Enabling VGA on the PCI Bridge that the NVidia card is connected to
Setting Bridge Control Register (0x3e) to 8

Enabling NVidia Card "I/O Space Access" and setting it as Bus Master
Setting Command Register (0x04) to 7
Per a poder realitzar açò, crearem una configuració especial de grub que genera aquesta configuració.
[root@localhost modules]# cat /etc/grub.d/03_vga_efi.conf 
#!/bin/sh
set -e
echo "insmod /EFI/centos/setpci.mod"
echo "setpci -s 00:17.0 3e.b=8"
echo "setpci -s 04:00.0 04.b=7"
Configurem com a executable el script i regenerem la configuració de grub per a aplicar els canvis. Reiniciem el sistema.
chmod 755 /etc/grub.d/31_enable_vga.conf
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
reboot
Quan torna arrncar el sistema comprobem que els registres tinguen els valors correctes.
 ~$ sudo setpci -s "00:17.0" 3e.b
 08
 ~$ sudo setpci -s "04:00.0" 04.b
 07
Descarreguem el driver de nvidia i el copiem a /usr/local/src per centralitzar alli tots els codis. Seguidament editem /etc/default/grub i afegim el següent a final de la linia GRUB_CMDLINE_LINUX:
rd.driver.blacklist=nouveau nouveau.modeset=0
Actualitzem el grub i reiniciem el sistema.
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
Executem la següent comanda per a entrar en el runlevel 3 sense les X carregades.
init 3 
Fem login al sistema i accedim al lloc on hem copiat l'executable. En el nostre cas /usr/local/src. Executem el binary. Hem de tenir els kernel headers descarregats. En el nostre cas ja ho hem fet amb el wifi abans.
sh NVIDIA-Linux-x86_64-340.76.run
Realitzem un backup del ramdisk antic.
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname  -r)-nouveau.img 
Generem un ramdisk nou.
dracut /boot/initramfs-$(uname -r).img $(uname -r)
Arribats fins ací ja només queda eliminar el driver nouveau i reiniciar la màquina.
# yum remove xorg-x11-drv-nouveau
# reboot
I ja tenim funcionant les X a la maquina amb nvidia.

Brightness Key

En aquests moments no hi ha cap dispositiu gestionant el Brightness.
ls /sys/class/backlight/
Ens retorna directori buit, llavors procedirem com segueix: Per a fer funcionar la brightness key hem d'instalar la eina dkms per compilar el driver.
sudo yum install epel-release
yum install dkms
Descarreguem el driver
unzip nvidiabl-master
cd nvidiabl-master
yum install dkms
install/tarball/
dkms ldtarball --archive=nvidiabl-0.87-source-only.dkms.tar.gz build install
echo nvidiabl > /etc/modules-load.d/nvidiabl.conf
Editem el fitxer /etc/default/grub i afegim:
GRUB_CMDLINE_LINUX="[...] acpi_backlight=vendor"
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
Per últim editem el fitxer /etc/X11/xorg.conf en la seccio del driver de nvidia
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option         "RegistryDwords" "EnableBrightnessControl=1"
EndSection

Problemes

En aquest moments tinc 1 problema per a sol·lucionar:
  • No funcionen les ttys amb el driver de nvidia.

Repositoris

No he probat utilitzar els paquets precompilats del driver wifi i nvidia per a centos pero seguint les instruccions d'aquest article i instal·lant els paquets en lloc de compil·lar haurien de funcionar.

Add-Ons

Instal·lem flash. Descarreguem el rpm de flash.
rpm -ivh adobe-release-x86_64-1.0-1.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux
yum -y install flash-plugin

Enllaços:

https://bugs.centos.org/view.php?id=7622
https://access.redhat.com/discussions/658253
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-Persistent_Module_Loading.html
http://www.dedoimedo.com/computers/centos-7-nvidia.html
https://www.linkedin.com/pulse/20140808222919-219659043-rhel-centos-7-and-nvidia-drivers
http://www.schotty.com/wordpress/?p=152
http://askubuntu.com/questions/264247/proprietary-nvidia-drivers-with-efi-on-mac-to-prevent-overheating
https://access.redhat.com/solutions/1155663
http://www.itzgeek.com/how-tos/linux/centos-how-tos/install-gnome-gui-on-centos-7-rhel-7.html
https://wiki.centos.org/HowTos/Laptops/Wireless/Broadcom?action=show
http://forums.macrumors.com/threads/win7-x64-booting-natively-via-efi-no-bios-emulation.696523/page-5#post-13898859
http://cosmicb.no/2014/05/18/nvidia-brightness-control-fix/