Basicamente, um link simbólico é um arquivo que contém o caminho do arquivo ao qual ele está vinculando. Há um bit especial definido nos atributos que faz com que o sistema operacional trate o link simbólico como um link - ele lê o caminho no arquivo e o segue para o arquivo vinculado. Tudo isso é transparente para o usuário.
Como o link simbólico é apenas um arquivo interpretado pelo sistema operacional, ele pode apontar para um arquivo ou diretório em qualquer sistema de arquivos, mesmo que o sistema de arquivos de destino não suporte a criação de links simbólicos.
Um link físico, por outro lado, funciona em um nível inferior. Hard links e arquivos são essencialmente a mesma coisa - uma entrada no diretório do sistema de arquivos, consistindo no nome do arquivo e seu número de inode. O inode é como um mapa que descreve onde no disco rígido as diferentes partes do arquivo podem ser encontradas.
Quando você cria um link físico para um arquivo existente, você está criando uma nova entrada no diretório do sistema de arquivos que aponta para o mesmo inode que o arquivo existente. Por causa disso, o link físico deve estar no mesmo sistema de arquivos que o arquivo existente.
Este é um bom artigo que explica as diferenças.