I just finished configuring exactly the same setup on Ubuntu server 14.04 LTS.
Procedure should be identical for any Linux distro who configures networking through the interfaces file. (E.g. Debian and most of it's derivatives like Ubuntu and Mint.)
On each switch:
Configure both ports in a 802.3ad ether-channel. There is no need for a channel definition linking both switches. The channels should be defined on each switch individually.
On the server:
First install package "ifenslave-2.6" through your package manager.
Then edit /etc/modules and add an extra line with the word "bonding" to it.
# /etc/modules: kernel modules to load at boot time
Run "modprobe bonding" once to load the bonding module right now.
Then edit /etc/network/interfaces to define the real NIC's as manual interfaces being slaves of the new interface "bond0".
# The loopback interface
iface lo inet loopback
# The individual interfaces
iface eth0 inet manual
iface eth1 inet manual
iface eth2 inet manual
iface eth3 inet manual
# The bond interface
iface bond0 inet static
bond-slaves eth0 eth1 eth2 eth3
The last statement insures that whichever of the 2 pairs has full connectivity gets all traffic when just 1 interface goes down.
So if eth0 and eth1 connect to switch A and eth2-eth3 go to switch B the connection will use switch B if either eth0 or eth1 goes down.
Last but not least:
ifup eth0 & ifup eth1 & ifup eth2 & ifup eth3 & ifup bond0
That's it. It works and will automatically come back online after a reboot.
You can observe failover behavior by bringing down individual ethX interfaces with ifdown and observe the resulting aggregated bandwidth through "ethtool bond0".
(No need to go to the server-room and yank cables.)